英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
路径
一条 Pub/Sub 消息在 RustStream 服务中的路径:流式拉取、投递、处理器、应答和 ack。
以文字阅读本图
- 流式拉取 客户端为消息加上租约 → 泵任务 转发进容量为 16 的通道
- 泵任务 转发进容量为 16 的通道 → PubSubMessage 属性成为消息头,不做复制
- PubSubMessage 属性成为消息头,不做复制 → 分发 一个循环,或多个 worker
- 分发 一个循环,或多个 worker → 解码 直接读取消息的数据
- 解码 直接读取消息的数据 → 订阅者的处理器 #[subscriber] 下的 async fn
- 订阅者的处理器 #[subscriber] 下的 async fn → 应答 编码进缓冲区,再整个交出
- 应答 编码进缓冲区,再整个交出 → PubSubPublisher 等待消息 id
- PubSubPublisher 等待消息 id → 结算 ack、nack,或扣留的重试
- 结算 ack、nack,或扣留的重试 → ack 随客户端的下一批发出
客户端从流中取出消息,开始它的租约。泵任务把它包装成 PubSubMessage,不做复制:数据仍是客户端的缓冲区,属性移入消息头。排序键成为 partition-key 消息头;订阅有死信政策时,尝试次数成为 pubsub-delivery-attempt 消息头。
处理器的应答编码进一个缓冲区,这个缓冲区原样成为外发消息的数据,因为客户端会保留它发布的字节。消息头成为属性;不是 UTF-8 的消息头会让发布失败,因为属性是文本。为这次发布指定的键成为消息的排序键,排序一页用图说明了这一点。
发布者在服务为消息分配 id 之后才返回。应答发布失败时,这次投递以重试的方式结算,因此消息会回来。
投递在应答之后结算。ack 随客户端的下一批确认发出,大约在 100 毫秒之内。每种结果变成什么,见结算。