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

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

路径

一条 Kafka 记录在 RustStream 服务中的路径:拉取队列、投递、处理器、应答和提交。

一条需要应答的 Kafka 记录的路径:从 librdkafka 的拉取队列到它已提交的偏移量librdkafka 拉取队列预先拉取的记录KafkaMessage记录留在拉取缓冲区分发一个循环,或每个键一个工作分区解码直接从缓冲区读取订阅者的处理器#[subscriber] 下的 async fn应答编码进循环的缓冲区KafkaPublisher等待投递报告结算由 Commit 模式决定提交已存储的偏移量
以文字阅读本图
  1. librdkafka 拉取队列 预先拉取的记录 → KafkaMessage 记录留在拉取缓冲区
  2. KafkaMessage 记录留在拉取缓冲区 → 分发 一个循环,或每个键一个工作分区
  3. 分发 一个循环,或每个键一个工作分区 → 解码 直接从缓冲区读取
  4. 解码 直接从缓冲区读取 → 订阅者的处理器 #[subscriber] 下的 async fn
  5. 订阅者的处理器 #[subscriber] 下的 async fn → 应答 编码进循环的缓冲区
  6. 应答 编码进循环的缓冲区 → KafkaPublisher 等待投递报告
  7. KafkaPublisher 等待投递报告 → 结算 由 Commit 模式决定
  8. 结算 由 Commit 模式决定 → 提交 已存储的偏移量

librdkafka 已经拉取的记录无需等待即可取出。KafkaMessage 把记录留在 librdkafka 放置它的位置,同时持有对拥有该缓冲区的消费者的一个引用计数。消息体、键和消息头都从拉取缓冲区读取,不做复制,消息头只在有人请求时才转换。只要还有投递持有某个消费者的记录,该消费者就保持打开。

唯一被复制的记录,是等待中的流自己取到的那一条:队列为空时,等待所返回的记录会被复制出来。

处理器的应答编码进分发循环复用的缓冲区。发布者把这些字节借给 librdkafka,librdkafka 把它们复制进自己的队列,集群确认这条记录之后,发布才返回。应答发布失败时,这次投递以重试的方式结算。

投递在应答之后结算。这对已提交的偏移量有什么影响,取决于订阅的 Commit 模式,结算一页用图说明了这一点。