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

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

路径

一条 ZeroMQ 消息穿过 RustStream 服务的路径:套接字任务、通道、处理器、回复的帧和发送。

一条得到回复的 ZeroMQ 消息的路径,从对端的帧到回复的帧对端发送三帧套接字任务拥有套接字,读取一条消息ZmqMessage名称、消息头和载荷帧通道深度为 read_ahead分发一次一条,或一批解码直接从载荷帧原地读取订阅者处理器#[subscriber] 下的 async fn回复编码进它交出的缓冲区帧缓冲区成为载荷帧发布者发送,对端接入期间重试结算ack 回答 Unsupported
以文字阅读本图
  1. 对端 发送三帧 → 套接字任务 拥有套接字,读取一条消息
  2. 套接字任务 拥有套接字,读取一条消息 → ZmqMessage 名称、消息头和载荷帧
  3. ZmqMessage 名称、消息头和载荷帧 → 通道 深度为 read_ahead
  4. 通道 深度为 read_ahead → 分发 一次一条,或一批
  5. 分发 一次一条,或一批 → 解码 直接从载荷帧原地读取
  6. 解码 直接从载荷帧原地读取 → 订阅者处理器 #[subscriber] 下的 async fn
  7. 订阅者处理器 #[subscriber] 下的 async fn → 回复 编码进它交出的缓冲区
  8. 回复 编码进它交出的缓冲区 → 帧 缓冲区成为载荷帧
  9. 帧 缓冲区成为载荷帧 → 发布者 发送,对端接入期间重试
  10. 发布者 发送,对端接入期间重试 → 结算 ack 回答 Unsupported

拥有订阅套接字的任务一次接收一条消息。它把帧拆成名称、消息头和载荷。载荷就是收到的那一帧本身,而不是副本,处理器的输入直接从它原地解码。

消息进入订阅的通道,其深度为 read_ahead,分发循环从那里取出它。批处理器拿到通道里已有的消息,数量最多到挂载点指定的大小,或者是第一条消息之后 20 毫秒内到达的消息。

处理器的回复被编码进一个由发布者接管的缓冲区。这个缓冲区成为载荷帧,名称和消息头各占一帧放在它前面,因此载荷不被复制。绑定一端的发布者在启动时已接入自己的套接字,拨号连接的发布者在第一次发布时接入。还找不到已连接对端的队列发送每 50 毫秒重试一次,最多五秒,之后失败,错误中写明目的地。

投递在回复之后结算。ZeroMQ 没有可结算的东西,因此 ack 立即回答 Unsupported,见结算一页的图。一条消息在这条路径上的开销(指令数和内存分配)见基准测试。