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

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

生命周期

NatsBroker::new 只记录配置,connect 拨号,启动时为每个 subject 订阅或为每个消费者创建,关闭时排空。

Broker 的三个状态作为类型,以及每次转换在 NATS 上做什么Broker在 NATS 上NatsBroker::new(addresses)ConnectedNatsBrokerClosedNatsBroker排空后的计数器地址和选项,无 I/O用连接选项拨号每个 Core 订阅:SUB,然后 flush每个 JetStream 订阅:查找流,创建消费者标为已关闭,然后排空比连接活得更久的发布者返回 NatsError::Closed,绝不默默成功
以文字阅读本图
  1. Broker: NatsBroker::new (addresses); ConnectedNatsBroker; ClosedNatsBroker 排空后的计数器
  2. 在 NATS 上: 地址和选项, 无 I/O; 用连接选项 拨号; 每个 Core 订阅: SUB,然后 flush; 每个 JetStream 订阅: 查找流, 创建消费者; 标为已关闭, 然后排空
  3. NatsBroker::new (addresses) → ConnectedNatsBroker: connect(self)
  4. ConnectedNatsBroker → ClosedNatsBroker 排空后的计数器: shutdown(self)
  5. 地址和选项, 无 I/O → 用连接选项 拨号
  6. 用连接选项 拨号 → 每个 Core 订阅: SUB,然后 flush
  7. 每个 Core 订阅: SUB,然后 flush → 每个 JetStream 订阅: 查找流, 创建消费者
  8. 每个 JetStream 订阅: 查找流, 创建消费者 → 标为已关闭, 然后排空
  9. 比连接活得更久的发布者 返回 NatsError::Closed,绝不默默成功

new 不做任何 I/O,所以服务的构建器保持同步。它接受一个地址或以逗号分隔的地址列表,with_options 附加 async-nats 的连接选项。运行时在应用启动时连接 Broker。connect 用这些选项拨号。服务器不可达时,启动以 NatsError::Connect 失败。

每个订阅的描述符针对已连接的 Broker 解析一次。Core 订阅发送 SUB,然后等待一次 flush 往返。到那时服务器已经登记了这个订阅,所以另一个连接上的生产者不会把消息发布到空当里。JetStream 订阅按名字查找它的流,并创建它的拉取消费者,这两个请求都由服务器应答。流不存在时,启动以 NatsError::JetStream 失败。

关闭先把连接标为已关闭,这样共用这个连接的发布者就无法再塞进一条消息。然后它排空客户端:订阅停止,已经发布的内容被刷出,连接关闭。ClosedNatsBroker 携带客户端的计数器:发送的消息数、接收的消息数和连接次数。

关闭之前配对的发布者是关闭收不回的句柄。它返回 NatsError::Closed,并附上它被要求发布到的 subject。

进程内传输遵循同样的阶梯。它像 connect 那样解析地址,并从连接选项中读取 no_echo 和 inbox 前缀。