RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等)

news2025/8/14 18:11:43

RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等)

1. RabbitMQ简介及AMQP协议

  • 开源的消息代理和队列服务器。基于AMQP(Advanced Message Queuing Protocol 高级消息队列协议)。
  • 底层基于Erlang语言编写;
  • 开源,性能优秀,稳定性保障;
  • 与SpringAMQP完美的整合,API丰富
  • 集群模式丰富,表达式配置,HA模式(负载均衡),镜像队列模型
  • 保证数据不丢失的前提做到高可靠性、可用性

Publisher
Server
Virtual Host
Exchange
Queue
Consumer

2. RabbitMQ安装及使用

在这里插入图片描述

启动 
rabbitmq-server start &
rabbitmq 默认端口号5672,查看是否启动
lsof -i:5672
安装插件rabbitmq-management后才能登录
查看插件列表
rabbitmq-plugins list
启动插件
rabbitmq-plugins enable rabbitmq-management
rabbit-management管控台的端口号15672
浏览器访问:http://localhost:15672/

3. RabbitMQ核心概念

Producer
Consumer
Exchange
在这里插入图片描述
AMQP核心概念

  • Server:又称Broker,接受客户端的了解,实现AMQP实体服务;
  • Connection:连接,应用程序与Broker的网络连接;类似pg的jdbcTemplate
  • Channel:网络信道,几乎所有的操作都在Channel中进行。Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话任务。类似pg的Session。
  • Message:消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高等特性;Body则就是消息体内容。
  • Virtual host:虚拟地址,用于进行逻辑分离,最上层的消息路由。 一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange和Queue。每一个Virtual Host是独立的单元,用于隔离不同的项目应用;
  • Exchange:交换机,接受生产者的消息,根据路由键转发消息到绑定的队列;
  • Binding:Exchange和Queue之间的虚拟连接,bingding中可以包含routing key;
  • Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息;
  • Queue:也成为Message Queue,消息队列,保存消息并将它们转发给消费者;

在这里插入图片描述

4. 与SpringBoot2.x整合-急速入门

1. 引入相关pom
2. 配置application.yml

3. 对象Message 实现接口 implements Serilizable
4. Producer,RabbitTemplate自动装配@Autowired
消费者自动监听 @RabbitHandler @RabbitListener
5. 生产者发消息:converAndSend(exchange, routeKey, MessageObject, CorrelationData); 交换机,路由key,消息体内容,消息唯一id

消费者监听消息:
@RabbitListener指定bindings,queue,exchange,routingKey. 这个注解强大的地方是当交换机,队列,绑定关系,路由键不存在时自动创建;

	@RabbitListener(bindings= @QueueBinding(
	value=@Queue(value="order-queue",durable="true"),
	exchange= @Exchange(name="order-exchange",durable="true",type="topic",
	key="order.*")
	)
	@RabbitHandler
	public void onOrderMessage(@Payload Order order, @Headers Map<String,Object> headers, Channel channel){ #**消息体,headers,通道**
		// 消费者操作
		// ...
		Long deliveryTag = (Long)headers.get(AmqpHdears.DELIVEY_TAG);
		// 当配置为手动签收时,必须要手动ACK,否则管理控制台即使消费了还是显示队列有数据。
		channel.basicAck(deliveryTag,false); // 手动确认提交
	}

可以在管理界面:http://xx.xx.xx.xx:15672/ 创建交换机,队列,交换机和队列进行绑定,或者删除;

路由key RoutingKey: order.*, order.#匹配差别;
order.#: order.111 order.111.abcd 只能匹配前者;
order.#: order.111 order.111.abcd 都能匹配;

<!--rabbitmq依赖-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
# springboot整合rabbitmq基本配置
spring.rabbitmq.addresses=xx.xx.xx.xx:5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000

# 保证100%投递模式
# 发送消息后等待消息确认
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true
spring.rabbitmq.template.mandatory=true

# springboot整合rabbitmq消费端配置
# 并发数
spring.rabbitmq.listener.simple.concurrency=5
# 自动签收 NONE AUTO manual
spring.rabbitmq.listener.simple.acknowledge-model=AUTO
spring.rabbitmq.listener.simple.max-concurrency=15
spring.rabbitmq.listener.simple.idle-event-interval=10000
spring.rabbitmq.listener.simple.retry.enabled=true
# 高峰期海量数据压过来,则进行限流,表示最大100条
#spring.rabbitmq.listener.simple.prefetch=100
# 不建议事务,性能太差了
#spring.rabbitmq.listener.simple.transaction-size=1

5. 保证100%的消息可靠性投递方案落地实现

蓝色框为生产者
红色框为消费者
为保证100%生产者消息投递成功,当Sender在收到需要发送的消息时

  1. 先存储到业务数据库Biz DB;
  2. 存储到消息数据库 MSG DB,修改状态为0;
  3. 发送消息到Broker
  4. 等待Broker返回确认收到的状态
  5. 更新MSG DB中消息状态为1;
  6. 对于网络闪断/超时等长时间未收到状态返回,则更新状态为失败-1;多次时可更新状态为2进行人工确认等。
  7. 定时任务从MSG DB查询对失败的消息-1进行重新发送;

这种情况只能保证100%发送到队列,但可能会重复推送,需要消费者业务端自动去确认收到重复消息的处理。
在这里插入图片描述

3.2 pg 预先把消息存进message记录表

记录消息体,重试次数,投递状态,下一次投递时间或者超时时间,下次重试投递时间;
在这里插入图片描述在这里插入图片描述

3.3 定时任务补救重发

在这里插入图片描述在这里插入图片描述

3.4 RabbitMQOrderSender 发送消息确认

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

3.5

参考

  • http://www.rabbitmq.com
  • https://www.imooc.com/video/17851
  • https://github.com/niezhiliang/springboot-rabbitmq

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

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

相关文章

矢量网络分析仪如何校准?安泰测试来助力

要想学会测试, 首先要学会校准! 对矢量网络分析仪的校准是非常重要的一个步骤&#xff0c;能够提高仪器的测量精度。今天安泰测试就给大家分享一下矢量网络分析仪的校准操作步骤&#xff1a; 一、单端口校准 校准目的&#xff1a; 通过单端口校准可以消除该端口的反射跟踪误差、…

[附源码]SSM计算机毕业设计教学辅助系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

双层神经网络实现非线性回归——机器学习

目录 一、算法思想 二、算法原理 三、算法分析 四、源程序代码 五、运行结果及分析 一、算法思想 在两层神经网络之间&#xff0c;必须有激活函数连接&#xff0c;从而加入非线性因素&#xff0c;提高神经网络的能力。所以&#xff0c;我们先从激活函数学起&#xff0c;一类…

线代——求逆矩阵的快捷方法

通常&#xff0c;求逆矩阵有两种方法&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 但是&#xff0c;对于特殊矩阵&#xff0c;如: 1、二阶矩阵 A[abcd]A \begin{bmatrix} a & b\\ c & d \end{bmatrix}A[ac​bd​]&#xff0c;其逆矩阵 A−11ad−bc[d−b−ca…

FienReport在线报表工具-大数据集导出示例

前言 在企业管理中&#xff0c;报表可以以图表等简洁的方式向用户显示数据&#xff0c;从而提高工作效率。许多公司紧跟信息技术的潮流&#xff0c;已经应用了报表软件工具。“我们企业想用一个报表工具&#xff0c;你有推荐吗&#xff1f;”这是这两年被问到最多的问题&#…

MySQL 进阶 怎么去了解MySQL的架构原理

前言 在了解 MySQL 原理之前&#xff0c;对我而言 MySQL 就是一个黑盒子&#xff0c;我写的SQL 语句通过服务发送给 MySQL 数据库&#xff0c;然后数据库就执行 SQL 语句&#xff0c;返回一些查询结果或做一些操作。然后就没然后了。。。再深入一点&#xff0c;就是知道某些 S…

机器学习-聚类算法

机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录聚类算法1. K-Means算法1.1. 理论基础1.2. 具体代码1.2.1. 数据集1.2.2. 自定义k-means算法类1.2.3. 测试模块1.3. 效果展示1.3.1.…

Flink 多流转换

多流转换分流使用侧输出流基本合流操作联合&#xff08;Union&#xff09;连接&#xff08;Connect&#xff09;基于时间的合流——双流联结&#xff08;Join&#xff09;窗口联结&#xff08;Window Join&#xff09;间隔联结&#xff08;Interval Join&#xff09;窗口同组联…

C#界面里Form.IsMdiContainer 属性的使用

C#界面里Form.IsMdiContainer 属性的使用 由于屏幕的局限,以及软件需求的复杂,并且还需要方便使用, 面对这样的任务,就需要好好地考虑使用多窗口的界面设计。 因为每一个窗口可以实现不同的功能,这样方便把相关的功能放在一起,不同的功能分为不同的窗口。 这样既可解决屏…

PC_DRAM

动态 RAM(DRAM)的刷新 刷新的过程实质上是先将原存信息读出,再由刷新放大器形成原信息并重新写入的再生过程 根据这个特点,可以估计刷新电路执行趟耗费的时间大致和访存时间相当 刷新放大器及读放大器均起此作用 由于存储单元被访问是随机的,有可能某些存储单元长期得不到访问…

OceanBase 4.0 all-in-one 版本如何离线升级 obd

今天遇到了一个问题&#xff0c;现象是这样的。 问题出现的原因&#xff1a; 在测试 ob 4.0 allinone 版本时&#xff0c;我用了自动部署的方式&#xff08;autodeploy&#xff09;&#xff0c;发现部署完的集群无法启动&#xff0c;错误原因可以参考这里&#xff1a;https:/…

three.js之缓冲类型几何体顶点

文章目录简介构成代码顶点构成图形核心代码顶点的位置与颜色BufferAttribute颜色差值法向量不设置法向量顶点索引不复用顶点复用顶点专栏目录请点击 简介 顶点一般使我们在创建模型的时候使用的&#xff0c;他一般对应buffer类型的几何体&#xff0c;使用BufferGeometry创建 点…

有效备考浙大MEM的五个好习惯建议

作为去年上岸浙大mem项目的学长&#xff0c;很多身边计划备考的朋友都在咨询如何才能一年上岸&#xff0c;我在去年拿到了203分的成绩&#xff0c;在不影响工作和生活的前提下&#xff0c;自己认为有效备考浙大mem项目要基本做到五大好习惯&#xff0c;特别针对我们在职人群&am…

软件测试面试题及答案 这个可以免费白嫖的题库不要错过了

对于很多新手软件测试人来说&#xff0c;除了掌握扎实的专业技能之外&#xff0c;你还需要一份个互联网软件测试工程师面试题库才能在万千面试者中杀出重围&#xff0c;成功拿下offer。 一般软件测试的面试分为三轮&#xff1a;笔试&#xff0c;HR面试&#xff0c;技术面试。前…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社区疫情防控管理系统nt4k1

最近发现近年来越来越多的人开始追求毕设题目的设创、和新颖性。以往的xx管理系统、xx校园系统都过时了。大多数人都不愿意做这类的系统了&#xff0c;确实&#xff0c;从有毕设开始就有人做了。但是很多人又不知道哪些毕设题目才算是新颖、创意。太老土的不想做&#xff0c;创…

HTML学生个人网站作业设计:宠物网站设计——宠物网站带会员登陆表单验证功能7页

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 |宠物网页设计 | 保护动物网页 | 鲸鱼海豚主题 | 保护大象 | 等网站的设计与制作 | HTML宠物网页设计 | HTML期末大学生网页设计作业&#xff0c;Web大学…

怎么裁剪视频时长?建议收藏这些方法

我们经常会在业余的时间&#xff0c;观看一些视频来放松自己。小伙伴们平时有没有喜欢看的视频呢&#xff1f;有时视频中会出现一些比较精彩的片段&#xff0c;如果我们想要将这些精彩片段分享给好友&#xff0c;还需要跟他们说跳转到视频的哪个位置&#xff0c;在操作上有些麻…

量化交易进行回测时有哪些有意义的统计指标?

做量化少不了要做回测&#xff0c;因为回测做好了才能进行梯度研究分析&#xff0c;但是回测报中&#xff0c;需要包含哪些指标呢&#xff1f;下面分享一下&#xff0c;小编觉得还比较有意义的统计指标&#xff0c;以及参照分析的原则与意义。 策略收益率&#xff1a;这部份没得…

2022Q3母婴行业三大热门赛道总结

本篇我们将继续来分析22年Q3季度中母婴行业的高增长概念。 在母婴行业中&#xff0c;我们发现了3个高增长品类&#xff0c;分别是&#xff1a;果泥、辅食料理机、婴儿湿巾。 一、营养辅食类高增长概念——果泥 在婴幼儿阶段&#xff0c;除了母乳和婴幼儿奶粉之外&#xff0c;后…

[打卡笔记]-RK3399平台开发入门到精通系列视频-Linux 设备树

14天学习训练营导师课程&#xff1a; 内核笔记《RK3399平台开发入门到精通系列视频》 14天学习训练营导师课程&#xff1a;周贺贺《ARMv8/ARMv9架构-快速入门》 前言 学习了一下雪松老师的视频课程&#xff0c;然后做出本文笔记。 如果您也想baipiao&#xff0c;开通学习会员&…