1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//! A message broadcasting library based on the Plumtree/HyParView algorithms.
//!
//! # Properties
//!
//! ## Pros
//!
//! - Nearly optimal message transmitting count
//!   - Usually messages are broadcasted via a spanning tree
//!   - Only the nodes interested in the same messages belong to the same cluster
//! - Scalable
//!   - Theoretically, it can handle ten-thousand of nodes or more
//! - High fault tolerance
//!   - Spanning trees are automatically repaired if there are crashed nodes
//! - Dynamic membership
//!   - Nodes can be added to (removed from) a cluster at any time
//!
//! ## Cons
//!
//! - No strong guarantee about connectivity of the nodes in a cluster
//! - No strong guarantee about delivery count of a message
//! - No guarantee about messages delivery order
//!
//! If some of the above guarantees are mandatory for your application,
//! it is need to be provided by upper layers.
//!
//! # References
//!
//! - [HyParView: a membership protocol for reliable gossip-based broadcast][HyParView]
//! - [Plumtree: Epidemic Broadcast Trees][Plumtree]
//!
//! [HyParView]: http://asc.di.fct.unl.pt/~jleitao/pdf/dsn07-leitao.pdf
//! [Plumtree]: http://www.gsd.inesc-id.pt/~ler/reports/srds07.pdf
#![warn(missing_docs)]
extern crate atomic_immut;
#[macro_use]
extern crate bytecodec;
extern crate fibers;
extern crate fibers_rpc;
extern crate futures;
extern crate hyparview;
extern crate plumtree;
extern crate prometrics;
extern crate rand;
#[macro_use]
extern crate slog;
#[macro_use]
extern crate trackable;

pub use clock::Clock;
pub use error::{Error, ErrorKind};
pub use hyparview_misc::{HyparviewNode, HyparviewNodeOptions};
pub use message::{Message, MessageId, MessagePayload};
pub use node::{Node, NodeBuilder};
pub use node_id::{LocalNodeId, NodeId};
pub use plumtree_misc::{PlumtreeNode, PlumtreeNodeOptions, PlumtreeSystem};
pub use service::{Service, ServiceBuilder, ServiceHandle};

mod clock;
mod codec;
mod error;
mod hyparview_misc;
mod message;
mod node;
mod node_id;
mod plumtree_misc;
mod rpc;
mod service;

pub mod metrics;

/// This crate specific `Result` type.
pub type Result<T> = std::result::Result<T, Error>;