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

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

生命周期

KafkaBroker::new 只记录配置,connect 探测集群,启动时为每个订阅打开一个消费者,关闭时刷出数据。

Broker 的三个状态作为类型,以及每次转换在 Kafka 上做什么Broker在 Kafka 上KafkaBroker::new(servers)ConnectedKafkaBrokerClosedKafkaBrokerunflushed_records()只记录配置,无 I/O元数据探测,在 connect_timeout 内每个订阅:一个消费者,入组并分到它的分区第一次发布打开生产者在 flush_timeout内刷出在途的记录比连接活得更久的发布者返回 KafkaError::Closed,绝不默默成功
以文字阅读本图
  1. Broker: KafkaBroker::new (servers); ConnectedKafkaBroker; ClosedKafkaBroker unflushed_records()
  2. 在 Kafka 上: 只记录配置, 无 I/O; 元数据探测, 在 connect_timeout 内; 每个订阅: 一个消费者,入组 并分到它的分区; 第一次发布 打开生产者; 在 flush_timeout 内刷出在途 的记录
  3. KafkaBroker::new (servers) → ConnectedKafkaBroker: connect(self)
  4. ConnectedKafkaBroker → ClosedKafkaBroker unflushed_records(): shutdown(self)
  5. 只记录配置, 无 I/O → 元数据探测, 在 connect_timeout 内
  6. 元数据探测, 在 connect_timeout 内 → 每个订阅: 一个消费者,入组 并分到它的分区
  7. 每个订阅: 一个消费者,入组 并分到它的分区 → 第一次发布 打开生产者
  8. 第一次发布 打开生产者 → 在 flush_timeout 内刷出在途 的记录
  9. 比连接活得更久的发布者 返回 KafkaError::Closed,绝不默默成功

new 不做任何 I/O,所以服务的构建函数保持同步。运行时在应用启动时连接 Broker。connect 用一个由生产者设置构建的短命客户端获取集群的元数据,时限为 connect_timeout(30 秒)。集群不可达,或者 librdkafka 拒绝某个生产者属性,启动就会失败。

每个订阅的描述符针对已连接的 Broker 解析一次。加入消费者组的订阅打开它的消费者,并等待组给它分配分区、每个分区的起点都已知,最长等待 assignment_timeout(一分钟)。在运行时开始读取之前,消费者一直响应组,因此再均衡不会等它。订阅没有指定组,而 Broker 又没有 default_group 时,启动就会失败。

只消费的服务不运行生产者。第一次发布时才打开共用的那个生产者。

关闭先把连接标为已关闭,然后在 flush_timeout(30 秒)内刷出生产者仍持有的数据。ClosedKafkaBroker 报告刷出后遗留的记录。订阅被丢弃时,它的消费者随之关闭:消费者离开组,并且除非订阅是事务性的,还会在离开时提交已存储的位置。