本文主要是介绍消费模式及rebalance机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
消费模式:广播模式和集群模式
广播模式:相同的consumer group的每个consumer实例都会接收同一个topic的全量消息。即每条消息都会被发送到 consumer group中的每一个consumer。消费进度保存着在consumer端,该模式下consumer group中的每一个consumer都会消费所有消息,且每个consumer之间的进度不需要保持一致。
集群模式:相同consumer group的每个consumer实例平均分摊同一个topic的消息。即每条消息只能发送到某个consumer中。消费进度保存在broker中,consumer group 中的所有consumer共同消费同一个topic中的所有消息,一条消息只被消费一次,且进度共享。
rebalance机制(rebalance机制的前提是集群模式):
在均衡,将一个topic下的多个queue在同一个consumer group中的多个consumer间进行重新分配。用于提升消息的并行消费进度。例如,增加一个consumer提高消息并行能力。
限制:一个队列最多分配给一个consumer,因此当consumer的数量多于queue的数量时,多余的consumer是分配不到任何队列的。
rebalance危害:
消费暂停:在新增一个consumer后,触发rebalance发生。此时原consumer就需要暂停对队列的消费,等着这些队列分配给新的consumer后,这些暂停队列才能被继续消费。
消费重复:rebalance后consumer在消费分配给自己的队列时,必须接着之间的原来rebalance前消费该队列的consumer提交到broker的消费进度offset进行消费。但默认情况是offset提交到broker是异步提交,导致提交到broker的进度可能与实际进度不同,导致消息重复消费。
消息突刺:rebalance可能导致重复消费,如果重复消费的消息过多,或者因为rebalance暂停时间过长从而导致积压信息过多时,可能导致rebalance结束的一瞬间需要消费很多消息。
offset管理(消费进度offset)
1、offset本地管理模式 :当消费模式为广播模式,offset采用本地模式存储,每个消费者管理自己的消费进度,各个消费者之间不存在消费进度的交集。offset相关数据以json的形式持久化到consumer本地磁盘中。
2、offset远程管理模式 :消费者模式为集群模式,offset使用远程管理,所有consumer共享queue消费进度。offset以json形式持久化到broker磁盘文件中。 broker启动时会加载这个文件,并写入一个双层map。外层map的key为topic与订阅了该topic的queue,value为内层map。内存map的key为queueId,value为offset。当发生rebalance时,新的consumer会从map中获取到相应的数据继续消费。
这篇关于消费模式及rebalance机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!