英文版本为准
本页译自英文,由模型翻译。若与英文原文存在差异,以英文原文为准。
路径
一条 NATS 消息在 RustStream 服务中的路径:订阅、投递、处理器、应答和结算,分别在 Core 和 JetStream 上。
以文字阅读本图
- Core 订阅 由服务器推送 → NatsMessage::Core 消息头只转换一次
- 拉取消费者 每批 200 条 → NatsMessage::JetStream 元数据按需读取
- NatsMessage::Core 消息头只转换一次 → 分发 一个循环,或每个键一个工作分区
- NatsMessage::JetStream 元数据按需读取 → 分发 一个循环,或每个键一个工作分区
- 分发 一个循环,或每个键一个工作分区 → 解码 直接从载荷读取
- 解码 直接从载荷读取 → 订阅者处理器 #[subscriber] 下的 async fn
- 订阅者处理器 #[subscriber] 下的 async fn → 应答 编码进一个缓冲区
- 应答 编码进一个缓冲区 → NatsPublisher 把缓冲区交给客户端
- NatsPublisher 把缓冲区交给客户端 → 无需结算 AckError::Unsupported
- NatsPublisher 把缓冲区交给客户端 → +ACK 发送后不等待
Core 消息由服务器推送到订阅中。JetStream 消息作为拉取请求的应答到达,async-nats 每次请求 200 条消息。无论哪种方式,NatsMessage 都把客户端的消息原样保留,载荷也一样。
消息头在生成投递时转换成框架的映射,只转换一次。没有消息头的消息完全不构建映射。在 Core 上,请求的应答 subject 作为 reply-to 消息头加入。在 JetStream 上,元数据在处理器请求时才从确认 subject 中读取,此前不读。
处理器的应答编码进一个缓冲区,发布者把这个缓冲区原样交给 async-nats,不做复制。Core 发布在客户端接收消息后返回。JetStream 发布在流确认消息后返回。
投递在应答之后结算。JetStream 确认是发往确认 subject 的一条消息,发送后不等待应答。Core 投递无需结算:调用报告 AckError::Unsupported,运行时记录日志。每种结果做什么,见结算。
基准测试统计的正是这条路径:一次 JetStream 投递的指令数和内存分配次数,包括客户端在服务线程上所做的工作。