当前位置:   article > 正文

如何保证消息队列里消息的生成和消费的顺序性_消息队列 顺序消费

消息队列 顺序消费

业务场景中,我们可能会遇到消息队列顺序消费的情况,那么怎么保证顺序消费呢

一.首先 我们要保证消息投递的顺序性

1.RocketMQ中(RabbitMQ中同理)我们要确保我们需要顺序消费的消息进入同一个queue中

顺序发布:对于指定的一个 Topic,客户端将按照一定的先后顺序发送消息

举例:订单的顺序流程是:创建、付款、物流、完成,订单号相同的消息会被先后发送到同一个队列中,

根据MessageQueueSelector里面自定义策略,根据同个业务id放置到同个queue里面,如订单号取模运算再放到selector中,同一个模的值都会投递到同一条queue

  1. public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
  2.           //如果是订单号是字符串,则进行hash,得到一个hash值
  3.         Long id = (Long) arg;
  4.         long index = id % mqs.size();
  5.         return mqs.get((int)index);
  6.   }

2.kafka中我们要确保我们的消息进入同一个partition中,消息投递的时候需要制定partition,代码中的1即是partition值

  1. producer.send(new ProducerRecord<>("mumu-topic",1,"zwt-key","zwt-value"), new Callback() {
  2. @Override
  3. public void onCompletion(RecordMetadata metadata, Exception exception) {
  4. if (exception == null){
  5. System.out.println("发送状态:"+metadata.toString());
  6. }else{
  7. exception.printStackTrace();
  8. }
  9. }
  10. });

二.其次 我们要保证消费端消费的顺序性

1.RocketMQ中(RabbitMQ中同理)应该使用MessageListenerOrderly,自带单线程消费消息,不能再Consumer端再使用多线程去消费,消费端分配到的queue数量是固定的,集群消费会锁住当前正在消费的队列集合的消息,所以会保证顺序消费。

2.kafka中消费端消费组只能有一个节点,这样就确保了消息的有序性

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/763302
推荐阅读
相关标签
  

闽ICP备14008679号