【实战指南】Spring Boot项目:一键式RabbitMQ集成与可靠性配置

文章目录

  • Springboot项目中快速引入Rabbit MQ通用做法
    • 由来
    • 引入MQ目的
    • 步骤
    • 总结
      • 1.引入MQ的目的
      • 2.配置要点
      • 3.实现过程
      • 4.扩展功能

Springboot项目中快速引入Rabbit MQ通用做法

由来

本篇是在做BI项目时尝试引入MQ来优化项目时发现,MQ引入到项目中做法比较类似。变的只是谁发消息给谁,谁去监听消息。至于MQ的可靠性(比如生产者可靠性、消费者可靠性、消息可靠性)都是通过固定参数进行配置。
因此将引入MQ到BI项目的过程抽象出来,变成通用的方法~

引入MQ目的

砍掉耗时久的业务,缩短单个业务时间,监听者异步执行耗时久任务
做完之后,你可以完成springboot项目中MQ基本配置,并且MQ具有一定可靠性~

步骤

  1. 在Application中配置MQ
    • 生产者确认机制,重连机制、消费者能者多劳、确认机制、失败消息处理策略
    • 保证可靠性(配备了生产者确认,重连、消费者能者多劳,确认机制,失败消息处理策略)
      yml配置
    spring:rabbitmq:# 连接信息host: xxx # 你的IP地址port: 5672# 用户相关信息建议在rabbitMQ中设置好virtual-host: /bi # 可在UI界面创建独属项目的虚拟机与用户名username: xxx # 用户名password: xxx # 密码connection-timeout: 200ms # max waited time# 生产者(消息发送者)# 生产者确认机制 - 默认取消,消耗性能publisher-confirm-type: nonepublisher-returns: falsetemplate:# 生产者重连机制retry:enabled: trueinitial-interval: 1000msmultiplier: 1max-attempts: 3# 消费者(监听者)listener:simple:prefetch: 1 # (能者多劳)每次只能获取一条信息,处理完才能获取下一条acknowledge-mode: auto # 消费者确认 - 自动模式retry:enabled: true # 失败消息处理策略
    
    失败者消息处理策略实现 - 消息发到error交换机
    	/*** 失败者消息处理策略实现*/@Beanpublic MessageRecoverer messageRecoverer(RabbitTemplate rabbitTemplate){return new RepublishMessageRecoverer(rabbitTemplate, BI_ERROR_EXCHANGE, BI_ERROR_ROUTING_KEY);}
    
  2. 统一确定并定义业务的有关MQ常量 MQConstant.java
    • 交换机、队列、Key
    • error交换机,队列,Key(按需设置)
  3. 开始初始化
    a. 业务MQ 与 error交换机MQ,并绑定关系(选一个就行,推荐第二种)
    用Bean方法创建
    @Configuration
    public class ErrorConfiguration {@Beanpublic Queue errorQueue() {return QueueBuilder.durable(BI_ERROR_QUEUE).build();}@Beanpublic DirectExchange errorExchange() {return ExchangeBuilder.directExchange(BI_ERROR_EXCHANGE).build();}@Beanpublic Binding errorBinding() {return BindingBuilder.bind(errorQueue()).to(errorExchange()).with(BI_ERROR_ROUTING_KEY);}}
    
    直接在@RabbitListener注解中定义并绑定
    	@RabbitListener(bindings = @QueueBinding(// 队列:// name - 队列名字// durable - 队列持久化,不会随着MQ关闭而消失// arguments:使队列为Lazy queue将消息尽快写入磁盘value = @Queue(name = BI_QUEUE_NAME,durable = "true",arguments = @Argument(name = "x-queue-mode", value = "lazy")),// 交换机:指定交换机的名字与类型(默认direct)exchange = @Exchange(name = BI_EXCHANGE_NAME, type = ExchangeTypes.DIRECT),// 按交换机类型(Direct、Topic),设置Keykey = BI_ROUTING_KEY
    ))
    public void receiveMessage(String msg) {
    
    b. JSON消息转换器(替换掉原生的JDK)
    	 /*** 消息转换器* @return*/@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}
    
    1. 编写业务代码(根据实际业务)
      a. 发送信息:砍掉耗时久的业务,变成发送消息
      ⅰ. 选用唯一性的信息,如id
      ⅱ. 确定好消息的数据类型
      b. 监听信息:添加监听者,执行耗时久的业务。
      ⅰ. 需要根据实际情况修改代码
      ⅱ. 可以根据业务实际情况使:业务幂等性
    	@RabbitListener(bindings = @QueueBinding(// 队列:// name - 队列名字// durable - 队列持久化,不会随着MQ关闭而消失// arguments:使队列为Lazy queue将消息尽快写入磁盘value = @Queue(name = BI_QUEUE_NAME,durable = "true",arguments = @Argument(name = "x-queue-mode", value ="lazy")),// 交换机:指定交换机的名字与类型(默认direct)exchange = @Exchange(name = BI_EXCHANGE_NAME, type = ExchangeTypes.DIRECT),// 按交换机类型(Direct、Topic),设置Keykey = BI_ROUTING_KEY
    ))
    public void receiveMessage(Long chatId) {// 0. 业务幂等性判断 - 基于乐观锁改造boolean update = chartService.lambdaUpdate().set(Chart::getStatus, RUNNING_STATUS).eq(Chart::getId, chatId).eq(Chart::getStatus, WAIT_STATUS).update();if (!update) {handleChartUpdateError(chatId, "该图表正在生成中!请耐心等待");return;}
    
    当然,还可以对其进行拓展,比如对error队列进行监听,针对错误消息进行特殊业务处理等等~
    至此之后,MQ基本操作以及配置完毕~并且MQ可靠性相对高。

总结

在Spring Boot项目中快速集成RabbitMQ以增强系统性能和可靠性,主要涉及以下几个关键步骤:

1.引入MQ的目的

  • 业务优化:通过异步处理长时间运行的任务,减少单个业务请求的响应时间。
  • 可靠性提升:确保消息传递的稳定性和准确性,即使在网络不稳定或系统故障的情况下。

2.配置要点

  • 连接信息:在application.yml中配置RabbitMQ服务器的连接细节,包括主机、端口、虚拟主机、用户名、密码及连接超时时间。
  • 生产者确认机制:启用确认机制,配置重试策略,确保消息成功发布。
  • 消费者策略:实施“能者多劳”原则,即每次仅处理一条消息,以及自动确认和失败消息重试策略。
  • 失败消息处理:定义失败消息的重发逻辑,例如重定向至错误交换机。

3.实现过程

  1. 配置MQ:在application.yml中设置RabbitMQ相关参数,包括连接信息、生产者和消费者的配置。
  2. 定义MQ常量:统一定义交换机、队列和路由键等MQ相关常量,便于维护和扩展。
  3. 初始化MQ组件
    • 创建错误队列、交换机和绑定关系。
    • 使用Bean方式或直接在@RabbitListener注解中定义队列、交换机和绑定关系。
    • 替换默认的消息转换器为JSON消息转换器。
  4. 编写业务代码
    • 发送端:使用唯一标识符发送消息,并确保数据类型的正确性。
    • 接收端:监听队列,处理耗时任务,实现业务幂等性确保数据一致性。

4.扩展功能

  • 监听错误队列,对错误消息进行特殊处理,进一步完善系统健壮性。

通过上述步骤,可以实现在Spring Boot项目中高效、可靠地使用RabbitMQ作为消息中间件,优化业务流程并提升系统整体性能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA:Filer过滤器+案例:请求IP访问限制和请求返回值修改

JAVA:Filer过滤器 介绍 Java中的Filter也被称为过滤器,它是Servlet技术的一部分,用于在web服务器上拦截请求和响应,以检查或转换其内容。 Filter的urlPatterns可以过滤特定地址http的请求,也可以利用Filter对访问请求…

Wireshark抓取HTTP

HTTP请求响应 使用wireshark抓取 本地机器是192.168.33.195,远程机器是192.168.32.129,远程HTTP服务端口是9005 TCP/IP实际共分为4层,抓包信息中可以看到各层的数据,最上面的数据帧包含了所有数据。 附:抓取本地H…

专题四:设计模式总览

前面三篇我们通过从一些零散的例子,和简单应用来模糊的感受了下设计模式在编程中的智慧,从现在开始正式进入设计模式介绍,本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结,和描述具体意义。 设计模式体…

Docker-compose单机容器集群编排

传统的容器管理:Dockerfile文件 -> 手动执行 docker build 一个个镜像的构建 -> 手动执行 docker run 一个个容器的创建和启动 容器编排管理:Dockerfile文件 -> 在docker-compose.yml配置模板文件里定义容器启动参数和依赖关系 -> 执行dock…

团队高效地使用 Git 进行协同开发

1. 确定工作流程 选择一种合适的 Git 工作流程,如 Git Flow、GitHub Flow 或 GitLab Flow。这里我们以 Git Flow 为例: main 分支:用于生产环境的稳定版本。develop 分支:用于整合所有开发者的功能分支,进行集成测试…

集合的扩展性:通过设计模式增强集合功能

引言 在软件开发中,集合是管理数据集合的常用数据结构。Java集合框架提供了丰富的集合类,但有时这些集合类可能无法满足特定需求。幸运的是,我们可以通过设计模式扩展集合的功能,使其更加强大和灵活。本文将探讨如何通过装饰者模式等设计模式扩展集合的功能,并提供详细的…

使用[Flags]和按位操作符优化C#枚举处理

在C#开发中,我们经常会遇到需要检查多个枚举值的情况。为了使代码更加简洁和可读,我们可以利用[Flags]特性和按位操作符来简化枚举值的比较 public enum EnumShapeType {None 0,PointType,LineType,CircleType,BoxType,RectangleType,SphereType,CutFe…

Android EDLA项目 5G热点打开失败分析

Android EDLA项目 5G热点打开失败分析 文章目录 一、前言二、EDLA 打开5G热点的分析和实现1、现象(1) 已原生Settings设置打开5G热点(关闭拓展性开关)(2)设置band2,channel36 的5G热点信息打开热…

PlantUML-UML 绘图工具安装、Graphviz安装、本地使用/在线使用、语法、图示案例

文章目录 前言本地安装vscode安装插件下载安装Graphviz配置Graphviz环境变量测试 在线使用演示PlantUML语法总结活动图(新语法)时序图类图用例图其他图 更多相关内容可查看 前言 本篇提供两种使用方式分别为 在线使用地址1:https://www.pla…

在安卓手机上原生运行docker

前言 之前的文章(香橙派5plus上跑云手机方案一 redroid(带硬件加速))在Ubuntu的docker里运行安卓,这里说下怎么在安卓手机下运行docker,测试也可以跑Ubuntu。 想在手机上运行docker想的不是一天两天了,其实很久之前就有这个想法了&#xff…

Docker网络模式和Cgroup资源限制

目录 1、Docker网络 (1)Docker网络实现原理 查看容器的输出和日志信息 2、Docker 的网络模式 查看docker列表 (1)网络模式详解 1)host模式 2)container模式 3)none模式 4)br…

SpringCloud教程 | 第十篇: 读取Nacos的配置

1、nacos服务器选用 2、test.yaml这一个DataId配置如下: config:name: aabb222 spring:application:name: testdatasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://127.0.0.1:3306/hmblogs?useUni…

MongoDB教程(十二):MongoDB数据库索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、MongoD…

openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法兼容性评估工具

文章目录 openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法兼容性评估工具311.1 代码获取311.2 编译插件311.3 运行311.4 举例311.4.1 case 1:311.4.2 case 2:311.4.3 case 3:311.5 结果311.6 原理openGauss学习笔记-311 openGauss 数据迁移-MySQL迁移-MySQL语法…

【鸿蒙OS】【ArkUI】鸿蒙OS UI布局适配终极攻略

鸿蒙OS UI布局适配终极攻略 像素适配大法,此方法也适合Android ArkUI为开发者提供4种像素单位,框架采用vp为基准数据单位。 vp相当于Android里的dp fp相当于Android里的sp 官方是如何定义的呢,如下图 今天我来教大家如何用PX做到ArkUI的终级适配&…

Leetcode 2011. 执行操作后的变量值

问题描述: 存在一种仅支持 4 种操作和 1 个变量 X 的编程语言: X 和 X 使变量 X 的值 加 1--X 和 X-- 使变量 X 的值 减 1 最初,X 的值是 0 给你一个字符串数组 operations ,这是由操作组成的一个列表,返回执行所有…

慢SQL分析和优化

慢SQL查询优化是一个多方面的过程,涉及SQL语句本身、数据库表结构、索引设计、硬件性能以及数据库配置等多个层面。下面我将详细介绍慢SQL优化的一般步骤: 捕获慢查询 开启慢查询日志:在MySQL中,可以通过设置slow_query_log和lon…

electron 应用的生命周期

Electron应用的生命周期涵盖了从应用启动到关闭的各个阶段,以及在这些阶段中发生的一系列事件。了解这些生命周期事件对于开发Electron应用至关重要,因为它们允许开发者在应用的不同阶段执行特定的操作,如创建窗口、处理文件打开请求、执行清理工作等。以下是对Electron应用…

C++初学者指南-5.标准库(第一部分)--标准库算法介绍

C初学者指南-5.标准库(第一部分)–标准库算法介绍 文章目录 C初学者指南-5.标准库(第一部分)--标准库算法介绍C的标准算法是:第一个示例组织输入范围自定义可调用参数并行执行(C17)迭代器和范围的类别错误消息命名空间std::ranges中的算法 (C20)算法参数图标相关内容…

Unity Editor 小工具集合(持续更新)

1.LOD批量设置 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor;public class LODModelSet : EditorWindow {public GameObject rootObj;public GameObject lowAndMiddleRootObj;public float highLevel, middleLevel, lo…