一、引言
在消息队列的世界里,消费模型主要分为拉取模型(Pull)与推模型(Push),这两种模型各有千秋,适用于不同的场景。接下来我们就一起揭开里面的奥秘。
二、拉取与推送
2.1 Pull 模型
Pull 模型中,消费者主动向服务端发起请求来拉取消息。就像是你在餐厅吃饭,需要自己起身去取餐窗口拿食物。这种模型给予了消费者自主控制的能力,它可以根据自身的处理能力来决定拉取消息的频率和数量。例如,当消费者的处理能力较强时,可以频繁地拉取大量消息;而当处理能力较弱时,则可以减少拉取的频率和数量,避免因过载而导致服务崩溃。此外,Pull 模型在处理大量数据时表现出色,因为它可以通过批量拉取的方式减少网络开销,提高数据传输效率。
2.2 Push 模型
Push 模型则相反,由服务端主动将消息推送给消费者。这好比餐厅的服务员直接将食物送到你的餐桌上。Push 模型的最大优势在于实时性高,一旦有新消息产生,服务端能立即将其推送给消费者,确保消费者能够第一时间处理消息。在一些对实时性要求极高的场景,如股票交易系统、即时通讯系统等,Push 模型就显得尤为重要。
2.3 对比分析
在生产者消费者速率差异的场景下,如果生产者的速率远大于消费者,Push 模型可能会使消费者不堪重负,因为它无法根据消费者的实际处理能力来调整推送速度,而 Pull 模型消费者能自主调节拉取频率,有效避免过载。
从消息实时性来看,Push 模型天然具有优势,消息能及时到达消费者;Pull 模型若轮询间隔设置不当,可能导致消息处理延迟。
当部分或全部消费者不在线时,Push 模型需要考虑为离线消费者保留消息的时长和存储问题,处理不当易造成服务端压力;Pull 模型服务端不关心消费者状态,等消费者上线主动拉取,相对简单。
三、Consumer Group:Kafka 消费的核心机制
Consumer Group 是 Kafka 中实现多消费者协作消费的核心概念,它允许一组消费者共同消费一个或多个主题的消息,每个分区只会被组内的一个消费者消费,从而实现负载均衡和高吞吐量。
3.1 Rebalance:动态调整消费分配
Rebalance 是 Consumer Group 中的一个重要过程,它的作用是在消费者组的成员发生变化时,重新分配分区的所有权。比如,当有新的消费者加入组,或者现有消费者离开组,亦或是某个消费者发生崩溃时,都会触发 Rebalance。在 Rebalance 期间,消费者无法读取消息,因为此时会对分区进行重新分配,之前消费者与分区之间的对应关系已经不存在。
触发 Rebalance 的条件主要有以下三种:
- 组成员变更:有新的消费者实例加入组,或者有消费者实例离开组,又或者有消费者实例发生崩溃被 “踢出” 组。例如,在电商订单处理系统中,业务量突然增大,为了提高处理速度,添加了新的消费者实例,这时就会触发 Rebalance。
- 订阅主题数变更:当 Consumer Group 使用正则表达式订阅主题时,如果有新的匹配主题创建,就会触发 Rebalance。假设 Consumer Group 订阅了所有以 “user_” 开头的主题,当新创建了 “user_behavior” 主题时,就会引发 Rebalance。
- 订阅主题分区数变更:Kafka 当前只允许增加一个主题的分区数,当分区数增加时,就会触发订阅该主题的所有 Group 开启 Rebalance。比如,一个主题原本有 3 个分区,为了提高并行处理能力,增加到了 5 个分区,那么订阅该主题的消费者组就会进行 Rebalance。
在 Rebalance 过程中,Kafka 会使用分区分配策略来决定如何将分区分配给消费者。常见的分配策略有以下几种:
- Range:按照消费者总数和分区总数进行整除运算来获得一个跨度,然后将分区按照跨度进行平均分配,以保证分区尽可能均匀地分配给所有的消费者。对于每一个 topic,RangeAssignor 策略会将消费组内所有订阅这个 topic 的消费者按照名称的字典序排序,然后为每个消费者划分固定的分区范围,如果不够平均分配,那么字典序靠前的消费者会被多分配一个分区。假设一个 topic 有 13 个分区,订阅此 topic 的有 3 个消费者 C0、C1、C2,那么每个消费者先分配 13/3 = 4 个分区,剩下 1 (13 % 3 = 1) 个分区,给第一个消费者 C0。此时各个消费者分配 topic 的分区如下:C0 分配到 5 个分区,C1 和 C2 各分配到 4 个分区。
- Round - Robin:将消费组内所有消费者以及消费者所订阅的所有 topic 的 partition 按照字典序排序,然后通过轮询消费者方式逐个将分区分配给每个消费者。如果同一个消费组内所有的消费者的订阅信息都是相同的,那么 RoundRobinAssignor 策略的分区分配会是均匀的。假设消费组中有 2 个消费者 C0 和 C1,都订阅了主题 t0 和 t1,并且每个主题都有 3 个分区,那么所订阅的所有分区可以标识为:t0p0、t0p1、t0p2、t1p0、t1p1、t1p2。最终的分配结果为:消费者 C0 分配到 t0p0、t0p2、t1p1;消费者 C

最低0.47元/天 解锁文章
1415

被折叠的 条评论
为什么被折叠?



