15 个版本
0.1.23 | 2021 年 9 月 23 日 |
---|---|
0.1.22 |
|
0.1.19 | 2021 年 8 月 21 日 |
0.1.13 | 2021 年 7 月 5 日 |
0.1.9 | 2021 年 3 月 28 日 |
#501 在 并发
每月 109 次下载
用于 jotty
23KB
327 行
zkstruct
简单地在 zookeeper 中共享一个 struct。您可以订阅更改并处理数据更改。
这是一个原型,不应被视为稳定版本或用于生产目的。您可能还是会这么做,但请注意。
概述
ZkStruct 被设计用来提供可以充当共享状态的 struct。
我们正在构建一个小的代理,用于监视主机上的进程列表。代理使用 ZkStruct 作为其状态。外部参与者可以修改该状态对象(使用 ZkStruct 或其他方式)以更新监视进程的列表。假设这是一个 Vec<String>
,其中每个 String 是要匹配的进程的 glob。
外部参与者将我们的 Vec 从 vec!["systemd*", "rsync*"]
更改为 vec!["systemd*", "rsync*", "firefox*"]
。库将注册更改,无论是来自 Watcher 事件还是刷新事件,然后更新内部状态 struct。库将对本地状态进行差异比较,将所有更改发布到您可以订阅的通道,然后更新本地状态。
读取
使用 .read()
读取不保证是最新的,可能会过时。最终保证数据将是一致的,因为如果在一定时间内(默认为 30 秒)对象未被验证为一致,读取将失败。
使用.c_read()
读取的数据保证是新鲜的,因为会将本地对象版本与zookeeper版本进行比较。当然,由于客户端需要从zookeeper请求数据并在返回之前进行比较,所以这会更慢,但您可以确信返回的数据是正确的。
写入
有两种写入保证
- 您将始终更新对象的最新版本。如果对象的本地版本与zookeeper中的版本不匹配,则更新请求将失败并返回错误。
- 一次只能执行一个更新操作,无论是本地还是客户端之间。内部和zookeeper都使用排他性写入锁来防止任何意外的更新或数据丢失。
更新流
无论是本地还是远程的任何更改都可以被消费并执行。所有客户端都可以订阅本地对象的更改流。这可以通过使用.update_handler
方法来附加一个闭包实现,每次有更改注册时都会触发这个闭包。
有4种更改类型
- 添加
- 修改
- 删除
- 未变
每个枚举将包含更新键的名称和包含添加或删除值的serde_json::Value
体。修改更改将返回旧值和新值。未变的结果不会被排队,因此不会返回。
shared_state.update_handler(|msg| {
println!("got stage change message: {:?}", msg);
});
更改在本地对象更新之前发出,但本地对象可以在所有消息在通道中被消费之前更新。
zookeeper结构
/<dir> Where the Data will be stored
/<dir>/payload JSON Payload
/<dir>/listeners Ephemeral records with the IDs of every listener active
依赖项
~4.5–6MB
~115K SLoC