1. Introduction

  • 当分区分配(partition assignment)在消费者之间移动时,
    正在处理消费者的再平衡(dealing with consumer rebalance);

  • 发生重新平衡的场景:

    • 某消费者离开或加入组,consumer leave/join group;

    • 将分区添加到主题,partition add to topic;

RebalanceAfterConsumerJoinGroup

2. Eager Rebalancing

ConsumerEagerRebalancing
  • 默认:消费者执行eager rebalancing,即所有消费者都停止从Kafka消费,
    并放弃(give up)其分区的成员资格(membership);

  • 在这段实践,整个消费者组停止处理,也称STW:stop the world事件;
    entire consumer group stop processing;

  • 它们将重新加入消费者组并获得新的分区分配(assignment),
    但不一定要"get back"以前分配给它们的分区;

3. Cooperative Rebalance

ConsumerCooperativeRebalanceIncrementalRebalance
  • Consumer Cooperative Rebalance aka Incremental Rebalance;

  • 此模式,只有分区的子集从A消费者移到B消费者,其它不关心rebalance的消费者
    可继续处理数据而不会中断,整个消费者组可经历几次rebalance,
    直到找到稳定的分配finding stable assignment,也称增量再平衡;

  • Cooperative Rebalance Usage:

  • Kafka Connect:已实现,默认启用;

  • Kafka Stream:使用StreamsPartitionAssignor默认打开;

  • Kafka Consumer:partition.assignment.strategy,
    有几个选项,您可以将配置设置为几个值,CooperativeStickyAssignor用于增量再平衡;

  • 默认assignor是RangeAssignor,CooperativeStickyAssignor;

  • 默认使用RangeAssignor,但允许升级到CooperativeStickyAssignor;

  • 只需一次rolling bounce即可从列表中删除RangeAssignor;

Assignor Memo

RangeAssignor

按主题分配分区,可能导致不平衡

RoundRobin

以round-robin方式在所有主题中分配分区,实现最佳平衡

StickyAssigner

类RoundRobin,然后在消费者加入或离开组时最小化分区移动,

CooperativeStickyAssignor

与StickyAassigner相同,但支持cooperative平衡,
故消费者可继续从主题中消费;

4. Static Group Membership

  • 默认:当消费者离开组,其分区将被撤销并重新分配,若消费者重新加入(join back),
    它将有新的member.id和上述机制分配的新分区new partition assign;

  • 若指定group.instance.id,则会使消费者成为静态成员:离开后,消费者最多有
    session.timeout.ms的时间重新加入并取回其分区(否则将重新分配分区),而不会触发重新平衡;

  • 当消费者维护本地状态和缓存(以避免重新构建缓存),
    及在不希望触发重新平衡的情况下进行滚动重新启动时,很有帮助;

StaticGroupMembership