kafka consumer、partition、rebalance

kafka consumer、partition、rebalance,第1张

发送消息分配partition

Producer发送消息到Topic时,分配partition的算法如下:

如果指定了一个partition,那么直接使用指定的partition
如果没有指定partition,但是指定了key,那么会根据key进行哈希,分配到对应的partition中
如果partition和key都没指定,会使用round-robin算法进行分配


consumer和partition的关系

一个partition只能被同组的一个consumer消费,同组的consumer则起到均衡效果。

  • Case1. 消费者多于partition
    即同一个partition内的消息只能被同一个组中的一个consumer消费,当消费者数量多于partition的数量时,多余的消费者空闲。

  • Case2. 消费者少于partition
    多个partition对应一个消费者

  • Case3. 消费者等于partition
    一个partition对应一个消费者

  • Case4. 多个消费者组
    启动多个组,每个组都可以消费所有的消息
    组与组之间的消息是否被消费是相互隔离互不影响的。


Consumer Rebalance
  • Consumer Rebalance触发条件
  1. ConsumerGroup里的Consumer发生变更(主动加入、主动离开、崩溃)
    崩溃不一定就是指 consumer进程"挂掉"、 consumer进程所在的机器宕机、长时间GC、网络延迟,当 consumer无法在指定的时间内完成消息的处理,那么coordinator就认为该 consumer已经崩溃,从而引发新一轮 rebalance
  2. 订阅topic(主题)的数量发生变更。
    比如使用正则表达式的方式订阅,当匹配正则表达式的新topic被创建时则会触发 rebalance。
  3. 订阅topic(主题)的partition(分区)数量发生变更。
    比如使用命令行脚本增加了订阅 topic 的分区数

在rebalance(再均衡)期间,Consumer(消费者)无法读取消息,造成整个Consumer(消费者)一段时间的不可用

  • rebalance 策略

默认提供了 3 种分配策略,分别是 range 策略、round-robin策略和 sticky策略,可以通过partition.assignment.strategy参数指定。

Group leader 是第一个加入Consumer Group的Consumer,它负责Consumer Rebalance的执行。

  1. range策略
    将单个 topic 的所有分区按照顺序排列,然后把这些分区划分成固定大小的分区段并依次分配给每个 consumer。
  1. round-robin 策略
    把所有 topic 的所有分区顺序摆开,然后轮询式地分配给各个 consumer
  1. sticky策略
    (0.11.0.0后引入)有效地避免了上述两种策略完全无视历史分配方案的缺陷。采用了"有黏性"的策略对所有 consumer 实例进行分配,可以规避极端情况下的数据倾斜并且在两次 rebalance间最大限度地维持了之前的分配方案

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/735823.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-27
下一篇 2022-04-27

发表评论

登录后才能评论

评论列表(0条)

保存