26 unstable releases (8 breaking)

0.9.0 Oct 15, 2024
0.8.0 May 7, 2024
0.7.0 Mar 31, 2024
0.6.1 Sep 1, 2023
0.1.3 Feb 15, 2022

#110 in Web programming

Download history 70014/week @ 2024-08-04 96272/week @ 2024-08-11 105803/week @ 2024-08-18 98740/week @ 2024-08-25 86992/week @ 2024-09-01 122530/week @ 2024-09-08 98406/week @ 2024-09-15 125058/week @ 2024-09-22 118607/week @ 2024-09-29 154993/week @ 2024-10-06 127332/week @ 2024-10-13 147326/week @ 2024-10-20 154679/week @ 2024-10-27 153439/week @ 2024-11-03 153462/week @ 2024-11-10 124368/week @ 2024-11-17

588,601 downloads per month
Used in 8 crates

MIT license

315KB
7.5K SLoC

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

Dependencies

~16–27MB
~516K SLoC