Expand description
§photon-etcd-cluster
A lightweight cluster coordination library providing leader election and node registry via etcd.
§Main Components
ClusterNode: Joins cluster, participates in electionsServiceDiscovery: Watches cluster state with reactive event streamsClusterEvent: Events emitted on cluster changesNode: Node metadata (id, ip, last_seen)
§Usage Patterns
§Event-driven (recommended)
React to cluster changes as they happen:
ⓘ
use photon_etcd_cluster::{ServiceDiscovery, ClusterEvent};
let discovery = ServiceDiscovery::new(endpoints, "my-service".into());
tokio::spawn(async move { discovery.run(None).await });
let mut events = discovery.subscribe();
while let Ok(event) = events.recv().await {
match event {
ClusterEvent::NodeJoined(n) => update_backends(),
ClusterEvent::LeaderElected(n) => route_writes_to(n),
_ => {}
}
}§Watch-based (for metrics/state observation)
Efficiently observe state changes without polling:
ⓘ
let mut watch = discovery.watch_nodes();
loop {
watch.changed().await?;
BACKEND_COUNT.set(watch.borrow().len() as i64);
}§Direct access (for one-off queries)
ⓘ
let nodes = discovery.nodes();
let leader = discovery.leader();§ClusterNode Example
ⓘ
use photon_etcd_cluster::ClusterNode;
use tokio::sync::broadcast;
let node = ClusterNode::new(
vec!["http://localhost:2379".into()],
"node-1".into(),
"127.0.0.1".parse().unwrap(),
"my-service".into(),
Some(5),
);
let (shutdown_tx, _) = broadcast::channel(1);
let mut rx = shutdown_tx.subscribe();
node.run(&mut rx).await?;
if node.is_leader() {
// Perform leader-only tasks
}Re-exports§
pub use cluster_node::ClusterNode;pub use cluster_node::ClusterNodeBuilder;pub use discovery::ServiceDiscovery;pub use error::ClusterError;pub use event::ClusterEvent;pub use metrics::MetricsCollector;pub use metrics::NoopMetricsCollector;pub use types::metadata_keys;pub use types::HealthStatus;pub use types::Node;pub use types::NodeMetadata;