学习笔记 --- RabbitMQ

简介

RabbitMQ是一款开源的消息队列中间件,它实现了高级消息队列协议(AMQP)标准。作为一个消息代理,RabbitMQ可以在应用程序之间可靠地传递和存储消息,并支持多种消息传递模式。

基本概念和特性

  • 消息:在RabbitMQ中,消息是传输的基本单位。它由消息体和可选的属性组成,消息体是要传递的实际数据,而属性则包含有关消息的元数据信息。

  • 队列:队列是消息的容器,它类似于一个缓冲区,用于存储待处理的消息。生产者将消息发送到队列,消费者从队列中接收和处理消息。

  • 交换机:交换机是消息路由的核心组件,它接收来自生产者的消息,并根据特定的路由规则将消息分发给一个或多个绑定到它上面的队列。

  • 绑定:绑定定义了交换机和队列之间的关系,它指定了消息在被发送到交换机时如何被路由到与之绑定的队列。

  • 路由模式:RabbitMQ支持多种路由模式,包括直连、主题、扇出和头部路由等。不同的路由模式提供了不同的消息分发机制,以满足不同的应用需求。

  • 可靠性:RabbitMQ提供了持久化消息、手动确认和事务等机制来确保消息的可靠性传递和处理。

  • 高可用性:通过设置集群和镜像队列,RabbitMQ可以实现高可用性,确保即使某个节点或队列发生故障,系统仍然可用。

  • 插件生态系统:RabbitMQ具有丰富的插件生态系统,可以扩展其功能和集成其他系统。

Spring Boot 整合 RabbitMQ 简单示例

  • 添加依赖:在Spring Boot项目的pom.xml文件中添加以下依赖,以引入RabbitMQ客户端库:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  • 配置连接信息:在application.properties(或application.yml)文件中配置RabbitMQ的连接信息,如下所示
spring:# rabbitmq相关配置rabbitmq:host: 127.0.0.1port: 5672username: demopassword: demo#虚拟host 可以不设置,使用server默认hostvirtual-host: /demo# 链接超时时间connection-timeout: 1000# 缓存配置cache:channel:# 要保留在高速缓存中的通道数,注意此值不能超过 requested-channel-max size: 2980# 如果已达到高速缓存大小,则等待获取通道的持续时间。如果为0,则始终创建一个新通道。checkout-timeout: 500connection:# 链接模式 channel 和 connection 两种,建议channel,channel使用ThreadLocal绑定,记得使用线程池mode: channelpublisher-returns: truepublisher-confirm-type: simple# 监听器相关配置(可以看作消费者链接工厂配置)listener:# 设置默认连接器(simple)type: simple# 简单的链接工厂(默认)simple:# 可选最大消费者数量 cpu * 2max-concurrency: 20# 手动确认消费acknowledge-mode: manual# 初始化消费者数量concurrency: 10# 消费者一次从MQ服务器拉取的数据量,prefetch: 250# 最大channel 数量,该数量和rabbit mq server中配置相关,二者取最小值requested-channel-max: 3000# 生产者配置template:retry:# 是否开启重试enabled: true# 最大重试次数 5 次max-attempts: 5
  • 创建消息发送者:创建一个用于发送消息的消息发送者(生产者)类。
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class MessageSender {private final AmqpTemplate rabbitTemplate;@Autowiredpublic MessageSender(AmqpTemplate rabbitTemplate) {this.rabbitTemplate = rabbitTemplate;}public void sendMessage(String message) {rabbitTemplate.convertAndSend("<交换机名称>", "<路由键>", message);}
}
  • 创建消息接收者:创建一个用于接收消息的消息接收者(消费者)类。
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageReceiver {@RabbitListener(queues = "<队列名称>")public void receiveMessage(String message) {// 处理接收到的消息System.out.println("Received message: " + message);}
}

注意事项

channel 部分

  • channel的最大限制,取决于 requested-channel-max 和Rabbit-MQ server中配置相关,二者取最小值
  • channel 是线程绑定对象,使用ThreadLocal存储,多线程环境下一定要注意
  • channel 的数量,是针对每个应用,也就是说,如果server配置5000,requested-channel-max=5000,那么每个应用都可以开启5000个 channel
  • channel 是消费者和生产者共享
  • 如果channel 不足,则会抛出异常 org.springframework.amqp.AmqpTimeoutException: No available channels,需要做好容错处理

消费者部分

  • 在RabbitMQ的程序中,消费者称之为 Listener
  • 消费者有两种模式,分别是 SIMPLE 和 DIRECT,推荐使用simple,通过配置参数 spring.rabbitmq.listener.type 进行设置
    • SIMPLE:RabbitMQ 使用者将消息分派到调用者线程的容器
    • DIRECT :在 RabbitMQ 消费者线程上直接调用侦听器的容器。
  • simple和direct 都有自己的独立配置,不要混用,混用也不会生效
  • simple中 prefetch 参数是针对每个消费者的,具体工作流程参考下图
  • concurrency 和 max-concurrency 数量差距不要太大,要不然数据会有比较严重的积压,因为扩充到 max也需要一定时间

生产者部分

  • 连接管理:确保在处理完消息后正确关闭连接,以避免资源泄漏。建议使用连接池来管理和复用连接。连接池推荐使用 CachingConnectionFactory ,默认的也是这种

  • 消息确认:当发送消息到 RabbitMQ 时,可以选择等待确认。这样可以确保消息被成功处理,或者在发生错误时进行重试。确保在代码中实现消息确认机制,以保证消息的可靠性。

  • 消息持久化:为了防止消息丢失,在发送消息时应将消息标记为持久化。这样即使 RabbitMQ 服务意外关闭,消息也会被保存在磁盘上,并在重新启动后恢复。

  • 序列化与反序列化:在将对象转换为消息发送到 RabbitMQ 之前,需要进行序列化操作。同样,在接收到消息后,需要进行相应的反序列化操作。确保选择一种适合你的数据类型和语言的序列化方式。并且你的生产者和消费者的序列化方式必须相同

  • 错误处理:当发送消息时,要考虑可能出现的异常情况。例如,RabbitMQ 服务器不可用或消息队列已满。在代码中实现适当的错误处理机制,可以记录日志、重试发送或采取其他措施

附注,简易工作流程图

自己整理的 Spring boot 中RabbitMQ工作的简易流程图,可能有不对的地方,仅供参考

请添加图片描述

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

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

相关文章

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiGRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.Matlab实现WOA-CNN-BiGRU-Attention多特征分类预测&#xff0c;多特征输入模型&…

MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

目录 1、摘要 2、Method 2.1 模拟异常样本 2.2 Memory Module 2.3 空间注意模块 2.4 多尺度特征融合模块 2.5 损失函数设置 2.6 Decoder模块 1、摘要 本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力&#xff0c;从而更好地区分非正常图像。如…

分布式核心知识以及常见微服务框架

分布式中的远程调用 在微服务架构中&#xff0c;通常存在多个服务之间的远程调用的需求。远程调用通常包含两个部分&#xff1a;序列化和通信协议。常见的序列化协议包括json、xml、 hession、 protobuf、thrift、text、 bytes等&#xff0c;目前主流的远程调用技术有基于HTTP…

【运筹优化】贪心启发式算法和蜘蛛猴优化算法求解连续选址问题 + Java代码实现

文章目录 一、问题描述二、思路分析三、解决方案3.1 贪心启发式算法3.2 群体智能算法&#xff08;蜘蛛猴优化算法&#xff09; 四、总结 一、问题描述 选址问题是指在规划区域里选择一个或多个设施的位置&#xff0c;使得目标最优。 按照规划区域的结构划分&#xff0c;可以将…

spring异步框架使用教程

背景 在需求开发过程中&#xff0c;为了提升效率&#xff0c;很容易就会遇到需要使用多线程的场景。这个时候一般都会选择建一个线程池去专门用来进行某一类动作&#xff0c;这种任务到来的时候往往伴随着大量的线程被创建调用。而还有另外一种场景是整个任务的执行耗时比较长…

系统架构设计师-信息安全技术(2)

目录 一、安全架构概述 1、信息安全所面临的威胁 二、安全模型 1、安全模型的分类 2、BLP模型 3、Biba 模型 4、Chinese Wall模型 三、信息安全整体架构设计 1、WPDRRC模型 2、各模型的安全防范功能 四、网络安全体系架构设计 1、开放系统互联安全体系结构 2、安全服务与安…

万字长文带你快速了解整个Flutter开发流程

文章目录 背景1.简介与优势Flutter是什么&#xff1f;为什么选Flutter&#xff1f; 2.开发环境搭建安装Flutter SDK配置开发环境 3.创建项目项目结构概览&#xff1a; 4.UI 构建与布局什么是Widget&#xff1a;StatelessWidget和StatefulWidget&#xff1a;Widget的组合&#x…

Java开发面试题 | 2023

Java基础 接口和抽象类的区别&#xff1f;Java动态代理HashMap 底层实现及put元素的具体过程currenthashmap底层实现原理&#xff1f;map可以放null值吗&#xff0c;currenthashmap为什么不能放null值synchronze和reetrantlock区别&#xff1f;怎样停止一个运行中的线程&#…

机器学习笔记 - 使用 AugMix 增强图像分类模型的鲁棒性

一、简述 图像分类模型能够预测与训练数据具有相同分布的数据。然而,在现实场景中,输入数据可能会发生变化。例如,当使用不同的相机进行推理时,照明条件、对比度、颜色失真等可能与训练集不同,并显着影响模型的性能。为了应对这一挑战,Hendrycks 等人提出了 AugMix 算法。…

IP地址SSL证书

在许多企业用例中&#xff0c;公司需要SSL证书作为IP地址。公司使用IP地址通过Internet或Intranet访问各种类型的应用程序。根据组织策略&#xff0c;您希望使用SSL证书保护IP地址。 在本文中&#xff0c;我将向您解释获取IP地址SSL证书的过程&#xff0c;以及哪种类型的SSL证…

实验二 Hdoop2.7.6+JDK1.8+SSH的安装部署与基本操作

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

Web和云开发,Rust会起飞?

Web和云开发&#xff0c;Rust会起飞&#xff1f; 一、前言 二、大厂偏爱&#xff0c;Rust的未来 三、Rust做Web的雄心 四、有必要换Rust做Web&#xff1f; 1.效率和性能 2.可靠性和可维护性 五、Rust先苦后甜 六、用Rust前的几个问题 七、开发界的强者 一、前言 去年…

什么是Eureka?以及Eureka注册服务的搭建

导包 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 htt…

《Go 语言第一课》课程学习笔记(六)

变量声明&#xff1a;静态语言有别于动态语言的重要特征 变量所绑定的内存区域是要有一个明确的边界的。也就是说&#xff0c;通过这样一个变量&#xff0c;我们究竟可以操作 4 个字节内存还是 8 个字节内存&#xff0c;又或是 256 个字节内存&#xff0c;编程语言的编译器或解…

知虾|Shopee数据分析工具是什么?Shopee虾皮卖家必备工具

知虾|Shopee数据分析工具是什么&#xff1f;Shopee虾皮卖家必备工具 在当今竞争激烈的电商行业&#xff0c;拥有准确的市场洞察和数据驱动的决策是成功的关键。Shopee作为全球领先的电商平台之一&#xff0c;市场也出现很多为商家提供了一系列强大的工具和功能&#xff0c;其中…

计算机网络-物理层(三)编码与调制

计算机网络-物理层&#xff08;三&#xff09;编码与调制 在计算机网络中&#xff0c;计算机需要处理和传输用户的文字、图片、音频和视频&#xff0c;它们可以统称为消息 数据是运输信息的实体&#xff0c;计算机只能处理二进制数据&#xff0c;也就是比特0和比特1。计算机中…

AIR001开箱测试

最近&#xff0c;合宙的动作还是挺大的&#xff0c;又出了两款AIR001和RP2040&#xff0c;而且前段时间还出了AIR32F103系列&#xff0c;记的21年要采购STM32F1103的时候&#xff0c;1片的价格从开发时的5块涨到了生产阶段的100多&#xff0c;即使最后无奈采用了别的芯片&#…

融云深度参与「新加坡 GTLC 大会」,连接亚太机遇、开拓国际市场

8 月 18 日&#xff0c;由 TGO 鲲鹏会主办的新加坡 GTLC&#xff08;Global Tech Leadership Conference&#xff0c;全球技术领导力大会&#xff09;圆满收官&#xff0c;融云作为共创伙伴深度参与了大会。关注【融云全球互联网通信云】了解更多 本次大会以“Connecting Asia…

Python批量爬虫下载文件——把Excel中的超链接快速变成网址

本文的背景是&#xff1a;大学关系很好的老师问我能不能把Excel中1000个超链接网址对应的pdf文档下载下来。虽然可以手动一个一个点击下载&#xff0c;但是这样太费人力和时间了。我想起了之前的爬虫经验&#xff0c;给老师分析了一下可行性&#xff0c;就动手实践了。    没…

数学建模及数据分析 || 4. 深度学习应用案例分享

PyTorch 深度学习全连接网络分类 文章目录 PyTorch 深度学习全连接网络分类1. 非线性二分类2. 泰坦尼克号数据分类2.1 数据的准备工作2.2 全连接网络的搭建2.3 结果的可视化 1. 非线性二分类 import sklearn.datasets #数据集 import numpy as np import matplotlib.pyplot as…