kafka怎么保证消息顺序?

2年前 (2022) 程序员胖胖胖虎阿
254 0 0

kafka学习
1、kafka怎么保证消息的消费顺序?
kafka只保证单partition有序,如果Kafka要保证多个partition有序,不仅broker保存的数据要保持顺序,消费时也要按序消费。假设partition1堵了,为了有序,那partition2以及后续的分区也不能被消费,这种情况下,Kafka 就退化成了单一队列,毫无并发性可言,极大降低系统性能。因此Kafka使用多partition的概念,并且只保证单partition有序。这样不同partiiton之间不会干扰对方。

kafka保证消息顺序有2种方法。
第1种:(全局消费顺序:比如3个直播间同时发消息,全局顺序就是保证直播间1先发的消息那么一定先到)实现方式:1个Topic(主题)只创建1个Partition(分区),这样生产者的所有数据都发送到了一个Partition(分区),保证了消息的消费顺序。

第2种(局部消费顺序:比如3个直播间同时发消息,局部顺序就是直播间1先发,直播间2后发,但是可能直播间2的消息先到,这个顺序是不保证的。但是直播间1先发了“消息1”,再发了“消息2”,这个顺序是能保证的,也就是在直播间内是有序的,但是直播间之间的消息顺序不能保证。)实现方式:生产者在发送消息的时候指定要发送到哪个Partition(分区)(1个)。

消费者以组的名义订阅topic,topic下有多个partition,消费者组中有多个消费者实例。同一时刻,一条消息只能被组中的一个消费者实例消费。如果按照从属关系来说的话就是,主题下的每个分区只从属于组中的一个消费者,不可能出现组中的两个消费者负责同一个分区。消息就是存储在partition中。

2、消费者数量与partition数量的对应关系是什么?
总共有4种情况:
(1)单播模式,只有一个消费者组。
topic只有1个partition,该组内有多个消费者时,此时同一个partition内的消息只能被该组中的一个consumer消费。当消费者数量多于partition数量时,多余的消费者是处于空闲状态的,如图1所示。topic,test只有一个partition,并且只有1个group,G1,该group内有多个consumer,只能被其中一个消费者消费,其他的处于空闲状态。
kafka怎么保证消息顺序?

图1
(2)单播模式,topic有多个partition,该组内有多个消费者。
比如test 有3个partition,该组内有2个消费者,那么可能就是C0对应消费p0,p1内的数据,c1对应消费p2的数据;如果有3个消费者,就是一个消费者对应消费一个partition内的数据了。图解分别如图2,图3.这种模式在集群模式下使用是非常普遍的,比如我们可以起3个服务,对应的topic设置3个partiition,这样就可以实现并行消费,大大提高处理消息的效率。
kafka怎么保证消息顺序?
图2
kafka怎么保证消息顺序?
图3
(3)广播模式,多个消费者组,1个partition。(1个partition可以保证消息顺序,只有这种情况可以。)
如果想实现广播的模式就需要设置多个消费者组,这样当一个消费者组消费完这个消息后,丝毫不影响其他组内的消费者进行消费,这就是广播的概念。
该topic内的数据被多个消费者组同时消费,当某个消费者组有多个消费者时也只能被一个消费者消费,如图4所示:
kafka怎么保证消息顺序?
图4
图文直播间用的方案就是这个,多个直播间ID共用一个partition,然后每个partition对应一个线程(也就是1个消费者)来串行地发消息,这样保证了消息的顺序。
(4)广播模式,多个消费者组,多个partition。(这是最常见的,多个partition就不保证顺序了)
该topic内的数据可被多个消费者组多次消费,在一个消费者组内,每个消费者又可对应该topic内的一个或者多个partition并行消费,如图5:在多个Partition时,不能保证Topic级别的数据有序性。
kafka怎么保证消息顺序?
图5

版权声明:程序员胖胖胖虎阿 发表于 2022年10月30日 下午4:32。
转载请注明:kafka怎么保证消息顺序? | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...