跳到主要内容
英文版本为准

本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。

生命周期

Broker 的各个状态都是类型:配置、连接和已关闭的连接;进入每个状态的调用都会消耗前一个状态。

Broker 的状态作为类型,以及让它从一个状态进入下一个状态的应用步骤Broker应用B::new(config)同步,无 I/OB::Connectedsubscribe, publishClosed关闭报告构建函数注册 Broker和处理器RunningApp已连接,循环在运行已停止循环已排空,Broker 已关闭比 Broker 连接活得更久的发布者会返回错误,而不是默默成功
以文字阅读本图
  1. Broker: B::new(config) 同步,无 I/O; B::Connected subscribe, publish; Closed 关闭报告
  2. 应用: 构建函数 注册 Broker 和处理器; RunningApp 已连接, 循环在运行; 已停止 循环已排空, Broker 已关闭
  3. B::new(config) 同步,无 I/O → B::Connected subscribe, publish: connect(self)
  4. B::Connected subscribe, publish → Closed 关闭报告: shutdown(self)
  5. 构建函数 注册 Broker 和处理器 → RunningApp 已连接, 循环在运行: start()
  6. RunningApp 已连接, 循环在运行 → 已停止 循环已排空, Broker 已关闭: shutdown()
  7. 比 Broker 连接活得更久的发布者 会返回错误,而不是默默成功

创建 Broker 不做任何 I/O,所以无论用哪个 Broker,#[ruststream::app] 的构建函数都保持同步。所有网络调用都等到 start() 才发生。

订阅和发布只是已连接形式的方法。在 connect 之前持有 Broker 的代码没有可用来订阅的东西,而 shutdown 会消耗它关闭的连接,所以这类错误无法通过编译。

start() 按注册顺序连接 Broker,在各自已连接的 Broker 上打开每个订阅,然后运行 after_startup 钩子。途中任何一步失败,已经打开的部分会按相反顺序关闭。shutdown() 停下各循环,等它们排空,再按注册的相反顺序关闭 Broker。每个钩子在哪一步运行,画在异步一页上。

早先交出去的发布者可能比连接活得更久。关闭之后再用它会返回错误。一致性测试套件要求每个 Broker crate 都遵守这条规则。