首页 > 其他分享 >springboot rabbitmq如何保证消息顺序消费

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

时间:2024-06-12 18:34:19浏览次数:23  
标签:顺序 消费者 队列 routingKey rabbitmq 保证 消息 springboot

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

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

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

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

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

 

 

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

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

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

 以下是一个简单的例子:

@Configuration
public class RabbitConfig {
 
    // 创建队列,设置为排他的,此时队列的名称为routingKey
    @Bean
    Queue orderQueue() {
        return QueueBuilder.durable("routingKey")
                .exclusive()
                .build();
    }
 
    // 绑定交换机和队列,同时指定routingKey
    @Bean
    Binding 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

标签:顺序,消费者,队列,routingKey,rabbitmq,保证,消息,springboot
From: https://www.cnblogs.com/xiaojunbo/p/18244495

相关文章

  • RabbitMQ-如何保证消息不丢失
    RabbitMQ常用于异步发送,mysql,redis,es之间的数据同步,分布式事务,削峰填谷等.....在微服务中,rabbitmq是我们经常用到的消息中间件。它能够异步的在各个业务之中进行消息的接受和发送,那么如何保证rabbitmq的消息不丢失就显得尤为重要。首先要分析问题,我们就要明确rabbitmq在什么时......
  • DockerCompose+Jenkins+Pipeline流水线打包SpringBoot项目(解压安装配置JDK、Maven等)
    场景DockerCompose中部署Jenkins(DockerDesktop在windows上数据卷映射):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/139491855Docker+Jenkins+Gitee+Maven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑:https://blog.csdn.net/BADAO_LIUMANG_......
  • springboot集成socketio
    1.引入依赖<dependency><groupId>com.corundumstudio.socketio</groupId><artifactId>netty-socketio</artifactId><version>2.0.3</version></dependency>2.基本配置server:port:8081socketio:host:localho......
  • springboot3项目的搭建四.3(security登录认证配置)
    security的jwt验证:总体来说,我们加入依赖项,security就已经开始生效了,但是使用的默认的UserDetails和UserDetailsService,一、我们只要继承UserDetailsService,在数据库中查询用户和权限列表,封装成UserDetails的实现类,返回就可以实现,security验证的接管,最多在security配置类中,放行......
  • SpringBoot 多文件打包下载
    第一种@RestController@RequestMapping("/download")publicclassDownloadController{@GetMapping("/files")publicResponseEntity<InputStreamResource>downloadFiles()throwsIOException{//......
  • 网易面试:SpringBoot如何开启虚拟线程?
    虚拟线程(VirtualThread)也称协程或纤程,是一种轻量级的线程实现,与传统的线程以及操作系统级别的线程(也称为平台线程)相比,它的创建开销更小、资源利用率更高,是Java并发编程领域的一项重要创新。PS:虚拟线程正式发布于Java长期支持版(LongTermSuort,LTS)Java21(也就是JDK21)。......
  • SpringBoot面试准备 第一天
    什么是SpringBoot?简化Spring 应用程序开发的框架,通过自动配置、起步依赖和简化的配置方式,使开发人员能够更快速、方便地创建和配置Spring应用程序,提高开发效率和开发体验目标是使开发人员能够更加快速、方便地创建和配置Spring应用程序,同时尽可能地减少样板代码和繁琐......
  • 【接口自动化测试框架练习】springboot+react+mysql~极简版postman
    可以说是一个toyprogram,chatgpt完成了一部分工作,我也完成了一部分工作,我俩合作的,我占百分之80%,他百分之20%,哈哈没他不行,源码奉上。https://github.com/Jinwenxin/test-api-frontend1.功能简介:分成三部分,如左侧导航栏所示:测试用例管理:测试用例的增删改查以及运行测试套件管理......
  • 【S087】Springboot+Thymleaf在线答疑系统项目源码 java源代码
    运行截图:登录学生注册教师注册学生发起问题联系我们后台首页常见问题管理添加常见问题人工答疑学生管理个人信息修改密码项目组成:项目源码:源码获取⬇⬇⬇......
  • 【S086】基于Springboot图书馆管理系统项目源码 java图书借阅管理 含文档
    运行截图:登录后台主页图书列表图书上架借阅图书归还图书用户列表添加用户公告列表发布公告个人信息详情个人信息编辑项目组成:项目源码:项目文档:源码获取⬇⬇⬇......