跳过主要内容

状态管理

大多数操作都需要在调用之间保持某种状态。 这个文档描述了在 dora 中处理状态的不同方法。

内部状态

算子是struct或对象实例,所以它们能在调用间保持内部状态。 这个状态是算子私有的。 当算子退出或崩溃,其内部状态丢失。

保存状态

为了使自己能够抵御崩溃,算子可以使用 dora 的状态管理。 dora 运行时给予每个算子一个私有键值存储(KVS)。 算子可使用运行时的 save_state 函数保存序列化状态至KVS:

fn save_state(key: &str, value: Vec<u8>)

运行时仅存储每一个键的最后一个值,因此对同一个键的后续值的写入将替换较早的值。 序列化是必需的,因为状态必须是自包含(即没有指向其他内存的指针)和一致的(即没有半更新的状态)。 否则,一个算子溃后状态无法恢复。

若要使此函数的性能开销保持在较低水平,建议使用合适的序列化格式,以最小的内存和计算开销存储数据。 不建议基于文本的格式,如JSON。 此外,快速变化的状态应存储在隔离的密钥下,以最大程度地减少需要写入的状态量。

状态恢复

当一个算子崩溃,dora 运行时重启它并为其准备已存状态的最后版本。 通过调用算子的 restore_state 方法来实现:

fn restore_state(&mut self, state: HashMap<String, Vec<u8>>)

在这个方法,算子反序列化并应用所有状态项,并执行所有必要的自定义一致性检查。

共享状态

为了算子间共享状态,dora 提供访问至对本地节点的键值存储:

fn kvs_write(key: &str, value: Vec<u8>)
fn kvs_read(key: &str) -> Vec<u8>

Todo:

  • 一致性?
  • Anna?

节点

节点对执行具有完全控制权,因此它们可以实现自己的状态管理。 共享状态可被通过 dora 库的 kvs_readkvs_write 函数访问,等同于 dora 运行时提供的相应函数。

由于节点无法使用 dora 运行时的恢复特性,因此 save_state/restore_state 函数对它们不可用。