24 个版本 (7 个破坏性更新)
0.8.0 | 2024年5月7日 |
---|---|
0.7.0 | 2024年3月31日 |
0.6.4 | 2024年4月1日 |
0.6.1 | 2023年9月1日 |
0.1.3 | 2022年2月15日 |
#64 in 异步
334,124 次每月下载
用于 8 crates
315KB
7.5K SLoC
ZooKeeper 在异步 Rust 中的客户端
使用异步 Rust 编写的 ZooKeeper 客户端。
功能
- 无回调。
- 无通用监视器。
StateWatcher
跟踪会话状态更新。OneshotWatcher
跟踪一次性 ZooKeeper 节点事件。PersistentWatcher
跟踪持久和递归持久 ZooKeeper 节点事件。- 没有事件类型
XyzWatchRemoved
,因为监视器删除后无法接收此类事件。 - 可复制的
Client
和Client::chroot
允许跨多个不同根客户端共享会话。
示例
基础
use zookeeper_client as zk;
let path = "/abc";
let data = "path_data".as_bytes().to_vec();
let child_path = "/abc/efg";
let child_data = "child_path_data".as_bytes().to_vec();
let create_options = zk::CreateMode::Persistent.with_acls(zk::Acls::anyone_all());
let cluster = "localhost:2181";
let client = zk::Client::connect(cluster).await.unwrap();
let (_, stat_watcher) = client.check_and_watch_stat(path).await.unwrap();
let (stat, _) = client.create(path, &data, &create_options).await.unwrap();
assert_eq!((data.clone(), stat), client.get_data(path).await.unwrap());
let event = stat_watcher.changed().await;
assert_eq!(event.event_type, zk::EventType::NodeCreated);
assert_eq!(event.path, path);
let path_client = client.clone().chroot(path).unwrap();
assert_eq!((data, stat), path_client.get_data("/").await.unwrap());
let (_, _, child_watcher) = client.get_and_watch_children(path).await.unwrap();
let (child_stat, _) = client.create(child_path, &child_data, &create_options).await.unwrap();
let child_event = child_watcher.changed().await;
assert_eq!(child_event.event_type, zk::EventType::NodeChildrenChanged);
assert_eq!(child_event.path, path);
let relative_child_path = child_path.strip_prefix(path).unwrap();
assert_eq!((child_data.clone(), child_stat), path_client.get_data(relative_child_path).await.unwrap());
let (_, _, event_watcher) = client.get_and_watch_data("/").await.unwrap();
drop(client);
drop(path_client);
let session_event = event_watcher.changed().await;
assert_eq!(session_event.event_type, zk::EventType::Session);
assert_eq!(session_event.session_state, zk::SessionState::Closed);
食谱
use zookeeper_client as zk;
let cluster = "localhost:2181";
let client = zk::Client::connect(cluster).await.unwrap();
let prefix = zk::LockPrefix::new_curator("/app/locks", "latch-").unwrap();
let options = zk::LockOptions::new(zk::Acls::anyone_all())
.with_ancestor_options(zk::CreateMode::Persistent.with_acls(zk::Acls::anyone_all()))
.unwrap();
let latch = client.lock(prefix, b"", options).await.unwrap();
latch.create("/app/data", b"data", &zk::CreateMode::Ephemeral.with_acls(zk::Acls::anyone_all())).await.unwrap();
更多示例,请参阅 zookeeper.rs。
许可
MIT 许可证 (MIT)。有关完整的许可证文本,请参阅 LICENSE。
参考
依赖项
~15–25MB
~434K SLoC