Kafka 如何保证消息的顺序性

在某些业务场景下,我们需要保证对于有逻辑关联的多条 MQ 消息被按顺序处理,比如对于某一条数
据,正常处理顺序是 新增 - 更新 - 删除 ,最终结果是数据被删除;如果消息没有按序消费,处理顺序可能
删除 - 新增 - 更新 ,最终数据没有被删掉,可能会产生一些逻辑错误。对于如何保证消息的顺序性,主要
需要考虑如下两点:
如何保证消息在 Kafka 中顺序性;
如何保证消费者处理消费的顺序性。
如何保证消息在 Kafka 中顺序性
对于 Kafka ,如果我们创建了一个 topic ,默认有三个 partition 。生产者在写数据的时候,可以指
定一个 key ,比如在订单 topic 中我们可以指定订单 id 作为 key ,那么相同订单 id 的数据,一定
会被分发到同一个 partition 中去,而且这个 partition 中的数据一定是有顺序的。消费者从
partition 中取出来数据的时候,也一定是有顺序的。通过制定 key 的方式首先可以保证在 kafka
内部消息是有序的。
如何保证消费者处理消费的顺序性
对于某个 topic 的一个 partition ,只能被同组内部的一个 consumer 消费,如果这个 consumer
内部还是单线程处理,那么其实只要保证消息在 MQ 内部是有顺序的就可以保证消费也是有顺序的。但
是单线程吞吐量太低,在处理大量 MQ 消息时,我们一般会开启多线程消费机制,那么如何保证消息在
多个线程之间是被顺序处理的呢?对于多线程消费我们可以预先设置 N 个内存 Queue ,具有相同 key
的数据都放到同一个内存 Queue 中;然后开启 N 个线程,每个线程分别消费一个内存 Queue 的数据
即可,这样就能保证顺序性。当然,消息放到内存 Queue 中,有可能还未被处理, consumer 发生宕
机,内存 Queue 中的数据会全部丢失,这就转变为上面提到的 如何保证消息的可靠传输 的问题了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Kafka保证消息顺序有多种方法。首先,Kafka只能保证单个分区内的消息有序,而不是整个Topic的全局顺序。这是因为如果要保证多个分区的消息有序,不仅需要保证Broker保存的数据有序,消费时也需要按照顺序消费。但是,如果一个分区堵塞了,为了保持顺序,其他分区也不能被消费,这将降低整个系统的并发能。 第一种保证消息顺序的方法是创建一个主题(Topic)时只创建一个分区(Partition),这样生产者的所有数据都发送到同一个分区。这样就能保证消息的消费顺序。这种方法适用于需要全局顺序的场景,比如多个直播间同时发送消息,需要保证消息按照直播间的顺序到达消费者。123 #### 引用[.reference_title] - *1* *2* [kafka怎么保证消息顺序?](https://blog.csdn.net/breeze210/article/details/122587073)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] - *3* [kafka如何保证消息的有序](https://blog.csdn.net/m0_53396342/article/details/130083135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值