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

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

消费者组

消费者组把每个分区交给一个成员;成员加入或离开时,分区通过再均衡转移。

一次再均衡:成员加入,协调者把一个分区转给它,它从已提交的偏移量继续读取成员 1协调者成员 2读取P0、P1、P2加入组再均衡:新的分配P2 被撤销读取P0、P1从已提交的偏移量读取P2停止心跳超过 session.timeout.ms 的成员离开组,它的分区以同样方式转移
以文字阅读本图
  1. 成员 1: 读取 P0、P1、P2; P2 被 撤销; 读取 P0、P1
  2. 协调者: 再均衡: 新的 分配; 停止心跳超过 session.timeout.ms 的成员 离开组,它的分区以同样方式转移
  3. 成员 2: 加入 组; 从已提交的 偏移量读取 P2
  4. 加入 组 → 再均衡: 新的 分配: 加入
  5. 再均衡: 新的 分配 → P2 被 撤销: 撤销
  6. P2 被 撤销 → 读取 P0、P1
  7. 再均衡: 新的 分配 → 从已提交的 偏移量读取 P2: 分配

组协调者是集群中的一个 Broker。成员加入或离开时,它发起再均衡,组就新的分配达成一致。从一个成员拿走的分区在那里被撤销,并分配给另一个成员,后者从组已提交的偏移量继续读取。前一个成员在最后一次提交之后做的工作,会被第二个成员再读一遍。组从未提交过的分区从 auto.offset.reset 指定的位置开始:默认是日志末尾。

停止发送心跳超过 session.timeout.ms(librdkafka 中为 45 秒)的成员会被移出组。超过 max.poll.interval.ms(5 分钟)没有取新记录的成员也会离开组。

partition.assignment.strategy 决定再均衡如何转移分区。急切(eager)策略 range 和 roundrobin(librdkafka 的默认值是两者都用,range 在前)会撤销全部分区再重新分配。cooperative-sticky 只转移更换所有者的分区,其余分区在再均衡期间照常流动(KIP-429)。两类策略不能在同一个组内混用。

消费者也可以按名称直接获取分区,而不加入组协议。这样它永远不会再均衡,也没有任何东西会转移它的分区。

默认值来自 librdkafka(配置、消费者组)。