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 异步

Download history 57885/week @ 2024-05-02 57093/week @ 2024-05-09 60111/week @ 2024-05-16 65492/week @ 2024-05-23 77304/week @ 2024-05-30 77455/week @ 2024-06-06 70721/week @ 2024-06-13 61205/week @ 2024-06-20 87895/week @ 2024-06-27 70922/week @ 2024-07-04 76731/week @ 2024-07-11 74356/week @ 2024-07-18 80619/week @ 2024-07-25 69334/week @ 2024-08-01 93012/week @ 2024-08-08 77130/week @ 2024-08-15

334,124 次每月下载
用于 8 crates

MIT 许可

315KB
7.5K SLoC

ZooKeeper 在异步 Rust 中的客户端

crates.io docs.rs github-ci mit-license codecov

使用异步 Rust 编写的 ZooKeeper 客户端。

功能

  • 无回调。
  • 无通用监视器。
  • StateWatcher 跟踪会话状态更新。
  • OneshotWatcher 跟踪一次性 ZooKeeper 节点事件。
  • PersistentWatcher 跟踪持久和递归持久 ZooKeeper 节点事件。
  • 没有事件类型 XyzWatchRemoved,因为监视器删除后无法接收此类事件。
  • 可复制的 ClientClient::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