英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
生命周期
Broker 的各个状态都是类型:配置、连接和已关闭的连接;进入每个状态的调用都会消耗前一个状态。
以文字阅读本图
- Broker: B::new(config) 同步,无 I/O; B::Connected subscribe, publish; Closed 关闭报告
- 应用: 构建函数 注册 Broker 和处理器; RunningApp 已连接, 循环在运行; 已停止 循环已排空, Broker 已关闭
- B::new(config) 同步,无 I/O → B::Connected subscribe, publish: connect(self)
- B::Connected subscribe, publish → Closed 关闭报告: shutdown(self)
- 构建函数 注册 Broker 和处理器 → RunningApp 已连接, 循环在运行: start()
- RunningApp 已连接, 循环在运行 → 已停止 循环已排空, Broker 已关闭: shutdown()
- 比 Broker 连接活得更久的发布者 会返回错误,而不是默默成功
创建 Broker 不做任何 I/O,所以无论用哪个 Broker,#[ruststream::app] 的构建函数都保持同步。所有网络调用都等到 start() 才发生。
订阅和发布只是已连接形式的方法。在 connect 之前持有 Broker 的代码没有可用来订阅的东西,而 shutdown 会消耗它关闭的连接,所以这类错误无法通过编译。
start() 按注册顺序连接 Broker,在各自已连接的 Broker 上打开每个订阅,然后运行 after_startup 钩子。途中任何一步失败,已经打开的部分会按相反顺序关闭。shutdown() 停下各循环,等它们排空,再按注册的相反顺序关闭 Broker。每个钩子在哪一步运行,画在异步一页上。
早先交出去的发布者可能比连接活得更久。关闭之后再用它会返回错误。一致性测试套件要求每个 Broker crate 都遵守这条规则。