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触发条件
- ConsumerGroup里的Consumer发生变更(主动加入、主动离开、崩溃)
崩溃不一定就是指 consumer进程"挂掉"、 consumer进程所在的机器宕机、长时间GC、网络延迟,当 consumer无法在指定的时间内完成消息的处理,那么coordinator就认为该 consumer已经崩溃,从而引发新一轮 rebalance - 订阅topic(主题)的数量发生变更。
比如使用正则表达式的方式订阅,当匹配正则表达式的新topic被创建时则会触发 rebalance。 - 订阅topic(主题)的partition(分区)数量发生变更。
比如使用命令行脚本增加了订阅 topic 的分区数
在rebalance(再均衡)期间,Consumer(消费者)无法读取消息,造成整个Consumer(消费者)一段时间的不可用
- rebalance 策略
默认提供了 3 种分配策略,分别是 range 策略、round-robin策略和 sticky策略,可以通过partition.assignment.strategy参数指定。
Group leader 是第一个加入Consumer Group的Consumer,它负责Consumer Rebalance的执行。
- range策略
将单个 topic 的所有分区按照顺序排列,然后把这些分区划分成固定大小的分区段并依次分配给每个 consumer。
- round-robin 策略
把所有 topic 的所有分区顺序摆开,然后轮询式地分配给各个 consumer
- sticky策略
(0.11.0.0后引入)有效地避免了上述两种策略完全无视历史分配方案的缺陷。采用了"有黏性"的策略对所有 consumer 实例进行分配,可以规避极端情况下的数据倾斜并且在两次 rebalance间最大限度地维持了之前的分配方案
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)