#zookeeper #shared-state #struct #share #update #local #object

zkstate

使用 zookeeper 在应用程序的多个实例之间共享一个 struct

15 个版本

0.1.23 2021 年 9 月 23 日
0.1.22 2021 年 9 月 23 日
0.1.19 2021 年 8 月 21 日
0.1.13 2021 年 7 月 5 日
0.1.9 2021 年 3 月 28 日

#501并发

Download history • Rust 包仓库 99/week @ 2024-07-01 • Rust 包仓库 10/week @ 2024-07-22 • Rust 包仓库

每月 109 次下载
用于 jotty

Apache-2.0

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请求数据并在返回之前进行比较,所以这会更慢,但您可以确信返回的数据是正确的。

写入

有两种写入保证

  1. 您将始终更新对象的最新版本。如果对象的本地版本与zookeeper中的版本不匹配,则更新请求将失败并返回错误。
  2. 一次只能执行一个更新操作,无论是本地还是客户端之间。内部和zookeeper都使用排他性写入锁来防止任何意外的更新或数据丢失。

更新流

无论是本地还是远程的任何更改都可以被消费并执行。所有客户端都可以订阅本地对象的更改流。这可以通过使用.update_handler方法来附加一个闭包实现,每次有更改注册时都会触发这个闭包。

有4种更改类型

  1. 添加
  2. 修改
  3. 删除
  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