2 个版本 (1 个稳定版本)
2.0.0 | 2021年2月25日 |
---|
#5 in #拜占庭
每月下载 27 次
在 byztimed 中使用
85KB
1.5K SLoC
Byztime 是一种拜占庭容错协议,用于在多个对等节点之间同步时间,而不依赖于任何外部权威机构。此包封装了 byztime_sys(它又封装了 C 库 libbyztime),为从 byztimed 消耗时间的应用程序提供惯用的 Rust API。
lib.rs
:
Byztime 是一种拜占庭容错协议,用于在多个对等节点之间同步时间,而不依赖于任何外部权威机构。此包封装了 [byztime_sys](它又封装了 C 库 libbyztime),为从 byztimed 消耗时间的应用程序提供惯用的 Rust API。
libbyztime 使用了一种“黑板”模式的单向通信。守护进程将时间偏移量和误差范围写入到 timedata 文件中,这是一个包含无锁数据结构的常规文件。消费者只需从文件中读取,而无需更改它或向守护进程发送任何类型的查询。
Byztime 识别三种类型的时钟
-
本地时钟是一个表示自某个任意纪元以来经过时间的硬件时钟,例如上一次重启。在 Linux 上,这通过
CLOCK_MONOTONIC_RAW
实现。 -
真实时钟跟踪墙时间(
CLOCK_REALTIME
)。Byztime 主要避免依赖它,但在网络在大量重启中失去多数时,仍然会使用它进行恢复。 -
全局时钟是 Byztime 要同步的时钟。最初初始化时,它设置为真实时钟。最终,应该预计它会漂移,因为 Byztime 是设计来仅使节点彼此同步,而不是与任何其他东西同步。
Byztime 守护进程确定全局时钟和本地时钟之间的偏移量、该偏移量的最大误差范围以及该误差范围有效的本地时间。它将这些值记录在 timedata 文件中。消费者读取它们,然后从操作系统获取本地时间。根据这些输入,它们可以计算全局时间,以及重新计算误差范围以考虑自上次 timedata 更新以来可能发生的任何漂移。
简单消费者可以使用此包如下
-
可选地,调用 [install_sigbus_handler]。
-
使用路径调用 ConsumerContext::open 以获取
Context
对象。 -
可选地,调用 Context::slew。在循环中休眠并重试,直到成功。
-
调用 Context::global_time 获取带有误差界限的时间戳。
依赖项
~16–540KB