zookeeper-client

Crates.iozookeeper-client
lib.rszookeeper-client
version0.9.0
sourcesrc
created_at2022-02-13 13:17:25.77408
updated_at2024-10-15 19:20:11.962902
descriptionZooKeeper async client
homepagehttps://github.com/kezhuw/zookeeper-client-rust/
repositoryhttps://github.com/kezhuw/zookeeper-client-rust/
max_upload_size
id531757
size410,068
Kezhu Wang (kezhuw)

documentation

https://docs.rs/zookeeper-client/

README

ZooKeeper client in async rust

crates.io docs.rs github-ci mit-license codecov Crates.io Total Downloads

ZooKeeper client writes in async rust.

Opinionated API

This library is written from scratch. Its API is pretty different from Java counterpart or even other Rust clients. Some of them are listed here for a glance.

  • No callbacks.
  • No catch-all watcher.
  • StateWatcher tracks session state updates.
  • OneshotWatcher tracks oneshot ZooKeeper node event.
  • PersistentWatcher tracks persistent and recursive persistent ZooKeeper node events.
  • No event type XyzWatchRemoved as Rust has Drop.
  • Most data operations are ordered at future creation time but not polling time.
  • Cloneable Client and Client::chroot enables session sharing cross multiple different rooted clients.

Examples

Basics

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);

Recipes

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();

For more examples, see zookeeper.rs.

License

The MIT License (MIT). See LICENSE for the full license text.

References

Commit count: 154

cargo fmt