springboot rabbitmq如何保证消息顺序消费

news/2024/10/3 14:24:11

很多时候,消息的消费是不用保证顺序的,比如借助mq实现订单超时的处理。但有些时候,业务中可能会存在多个消息需要顺序处理的情况,比如生成订单和扣减库存消息,那肯定是先执行生成订单的操作,再执行扣减库存的操作。

那么这种情况下,是如何保证消息顺序消费的呢?

首先,为了效率,我们可以设置多个队列都来处理顺序执行的消息。另外,我们需要保证每组顺序消费的消息发到同一个队列中,给这些消息设置一个统一的全局id即可。

其次,保证消息的顺序消费。就像上面所说,一个队列对应一个消费者即可,但是在项目的集群部署下,这又该怎么处理呢?针对这种情况,我们可以设置队列的“单活模式”。

x-single-active-consumer:单活模式,表示是否最多只允许一个消费者消费,如果有多个消费者同时绑定,则只会激活第一个,除非第一个消费者被取消或者死亡,才会自动转到下一个消费者。

 

 

要保证RabbitMQ消息的顺序消费,你需要做两件事:

  1. 确保消息进入相同的队列

  2. 对于队列,使用一个消费者,或者多个消费者,但要保证它们是排他的(exclusive),这意味着在任何时候只有一个消费者能够处理消息。

 以下是一个简单的例子:

@Configuration
public class RabbitConfig {// 创建队列,设置为排他的,此时队列的名称为routingKey
    @BeanQueue orderQueue() {return QueueBuilder.durable("routingKey").exclusive().build();}// 绑定交换机和队列,同时指定routingKey
    @BeanBinding bindingOrder(Queue orderQueue, FanoutExchange exchange) {return BindingBuilder.bind(orderQueue).to(exchange).with("routingKey");}
}@Component
public class OrderConsumer {// 使用@RabbitListener注解指定队列名称,并保证这是Spring容器中唯一的消费者实例@RabbitListener(queues = "routingKey", concurrency = "1")public void handleOrder(String orderMessage) {// 处理消息的逻辑
    }
}

在这个配置中,所有带有routingKey的消息都会进入同一个排他队列。通过@RabbitListener注解的concurrency属性设置为1,确保了只有一个消费者来处理这个队列中的消息,从而保证了消息的顺序性。

请注意,如果你的应用中有多个消费者实例,确保它们都使用相同的队列名称,并且设置为排他。如果不是单实例部署,可能需要额外的同步机制来保证消息的顺序性。

 

稍微总结下:

  1. 消息发送,自己确保是有序的;集群化部署的话,可以通过分布式锁确保消息有序。
  2. 消息到达队列之后,默认就是有序的。
  3. 消息消费,一个队列对应一个消费者,并且一个消费者一个 channel,不能并发消费,就可以确保消息有序。

 

参考链接:

https://www.cnblogs.com/qian-fen/p/17613389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hjln.cn/news/44602.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

e语言 json创建案例

demo代码本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18244499

系统内存占用下降 20%,卓创网络应用 OpenCloudOS 实践

卓创网络主营产品「招采星」在使用 OpenCloudOS 后,系统内存占用由原来的 33% 降低到 11.7%,本文将深入探讨卓创网络从传统架构到 OpenCloudOS 的转变。导语:卓创网络作为一家专注于招标采购领域的企业,主营产品「招采星」为超过 4000 家公司提供电子采购系统及相关配套服务…

深入解析 JMeter TPS 测试:从理论到实践

前言 作为一名测试工程师,理解并能够准确测量每秒事务数(Transactions Per Second, TPS)是确保系统性能的关键指标之一。本文将详细介绍如何使用 Apache JMeter 进行 TPS 测试,包括理论基础、配置步骤和结果分析。 什么是 TPS? TPS(Transactions Per Second)表示系统每秒…

掌握 JMeter 插件管理器:提升性能测试的利器

前言 Apache JMeter 是一款强大的性能测试工具,其灵活性和扩展性使其在性能测试领域广受欢迎。JMeter 插件管理器(JMeter Plugins Manager)为用户提供了一个方便的平台来安装、更新和管理各种插件,从而大大扩展了 JMeter 的功能。本文将详细介绍如何使用 JMeter 插件管理器…

linux mysql麒麟系统部署

1、安装mysqlapt-get install mysql-server mysql-common2、取消大小写敏感(1)、先删除mysql数据库rm -rf /var/lib/mysql (2)、设置my.cnf[mysqld] lower-case-table-names=1 (3)、初始化数据库,取消大小写敏感mysqld --initialize --user=mysql --lower-case-table-…

掌握JMeter:深入解析如何提取和利用JSON数据

前言 Apache JMeter不仅是一个功能强大的性能测试工具,它还可以用于提取和处理响应中的数据。对于现代Web应用,JSON(JavaScript Object Notation)已经成为主要的数据交换格式。本文将详细介绍如何在JMeter中提取JSON数据,并将其用于后续的请求或断言。 环境准备 在开始之前…

Postman变量使用指南

前言 在API测试过程中,变量的使用能够大大提高测试的灵活性和效率。Postman提供了多种变量类型,帮助我们更方便地管理和重用数据。本文将详细介绍Postman中变量的使用方法和实际应用场景。 为什么要使用变量? 在API测试中,变量可以帮助我们:避免重复输入相同的数据 管理和…

深入探索Chrome开发者工具:开发者的利器

前言 作为一名测试,我们经常需要对web页面进行测试,很多时候我们都需要借助Chrome开发者工具(Chrome DevTools)来进行测试,无论是前端开发还是调试问题,都是必不可少的利器。本文就来给大家介绍一下Chrome开发者的使用。 什么是Chrome开发者工具? Chrome开发者工具(Dev…