MQ中怎样去实现消息的顺序消费

常见的MQ中间件中,RocketMQ实现了顺序消费的支持,其他的MQ基本都是没有在MQ层面做顺序消费方面的支持的,毕竟要保证顺序就会对性能带来很大的影响。

消费的顺序性问题

当消息不在同一个队列中或者同一队列有多个消费者消费的情况下才会有消费的顺序性问题,如果只有一个队列,只有一个消费者且每次都获取一条消息进行消费,那么消息一定是按顺序消费的。

全局顺序消费

  • 所有进入MQ的消息都要保证顺序消费,如果要实现这种顺序性会大幅度降低MQ的性能。

局部顺序消费

  • 局部顺序消费是在某些场景的消息需要按顺序消费,例如创建订单,付款,发货是有序的流程,付款不能在创建订单之前

顺序消费的实现方式

1.单Queue+单消费者模式

  • 如果业务简单MQ消息堆积也小,那就可以使用一个Queue和一个消费者来确保消息的顺序消费,这样依赖只要消息是按顺序生产投入同一个Queue中的的,就可以按投入的顺序被同一个消费者消费

2.消息体顺序标识+落库+消费者逻辑判断

  • 在需要顺序消费的消息体中添加顺序标识和分组标识,发送后存入数据表,消费者接收消息消费前,查询数据表判断属于同一分组内顺序靠前的消息有没有被消费,如果没有就拒绝ack重新被投递。

拿点餐场景举例说明下

下单和取消订单分别对应一条订单号为1234顺序为10的息和一条订单号为1234顺序为20的消息,生产者发送后把两条消息存入数据库,如果取消订单的消息先被消费者先接收到,在执行消费逻辑前首先要查询数据表有没有订单号1234的顺序小于20的消息,有的话是否已经被消费,如果没有被消费则拒绝ack,一直到下单消息被消费后才可以执行对取消订单消息的消费

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MQ消息队列)可以通过一些机制来保证消息消费顺序。在RocketMQ,可以通过严格的消息有序性来确保消息消费顺序。具体来说,RocketMQ使用消息的生产者有序存储来保证消息顺序性。然后,在消费者端,RocketMQ提供了两种消费模式来实现有序消费:MessageListenerOrderly和MessageListenerConcurrently。 在这两种消费模式,MessageListenerOrderly是有序消费的模式。RocketMQ会按照消息的发送顺序,将同一个消息队列内的消息顺序传递给消费者进行消费。这样可以保证同一队列内的消息被按照发送顺序消费。而在并发消费模式下,多个消息队列的消息可以并行消费,但是同一个队列内的消息仍然按照顺序消费。 总之,通过RocketMQ的有序存储和有序消费模式,可以保证消息消费顺序。这使得在需要消息有序性的场景下,能够有效地保证消息顺序性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [RocketMQ顺序消息顺序消费)](https://blog.csdn.net/weixin_43767015/article/details/121028059)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [java面试题_消息间件--RabbitMQ(22题).pdf](https://download.csdn.net/download/qq_44273429/20923905)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WannaRunning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值