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

2023-10-31

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
# address相当于host,port
# spring.rabbitmq.host=xx.xx.xx.xx
# spring.rabbitmq.port=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 使用3部曲

生产者:

  1. pom
  2. yml配置(host port username password virtualhost
    生产者发送时指定交换机,路由键发送;
    消费者可以直接使用注解指定交换机,路由键,队列不存在会自动创建;)
  3. @RabbitTemplate
  4. 当在docker部署时,存在超时访问不到,可以在mq队列把docker机器的网段配置上就ok

参考

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 仅运行相应源代码已更改的单元测试?

    我正在 Jenkins CI 服务器中运行单元测试和 Selenium 测试 众所周知 在大型项目中测试需要很长时间才能运行 Java 是否有一个工具 框架只能触发其源代码已更改的测试 这是因为并非每次对 SCM 的提交都会影响源代码的所有
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 将更改(永久)保存在数组列表中?

    那可能吗 例如 用户将新的项目 元素添加到数组列表 缓冲读取器进程 中 并且肯定会发生更改 我的问题是 即使用户多次更改数组列表 它也可能会永久存在 即使他们关闭程序并再次打开它 它也会一直存在 注意 不使用 txt 很抱歉问这样的问题 但
  • 如何知道内存中是否已经存在类的实例?

    如何知道内存中是否已经存在类的实例 我的问题是 如果存在类实例 则不想读取方法 这是我的代码 private void jButton java awt event ActionEvent evt PNLSpcMaster pnlSpc n
  • 竞争条件和 Clojure Atoms

    clojure atom 的文档指出 Changes to atoms are always free of race conditions 然而 竞争条件不仅是根据更改定义的 而且是在不同线程中并行逻辑操作的上下文中定义的 我想知道 保证
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • 如何在不冒 StackOverflowError 风险的情况下使用 CompletableFuture?

    我想遍历异步函数的搜索空间 我将逻辑编码如下 Assuming that a function maps a range of inputs to the same output value minimizes the input valu
  • 在休眠搜索中使用现有分析器AnalyzerDiscriminator

    Entity Indexed AnalyzerDefs AnalyzerDef name en tokenizer TokenizerDef factory StandardTokenizerFactory class filters To
  • String.intern() 线程安全吗

    我想在Java中使用 String intern 来节省内存 对具有相同内容的字符串使用内部池 我从不同的线程调用这个方法 这是个问题吗 对你的问题的简短回答是肯定的 它是线程安全的 但是 您可能需要重新考虑使用此工具来减少内存消耗 原因是
  • org.apache.poi 中的异常

    我试图编写一个可以读取和写入的程序 xlsx文件中 下面提供的代码旨在能够编写其第一个 Excel 程序 package excel reader import java io FileOutputStream import java io
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • 在 Hibernate 的 XML 配置文件中指定默认值

    我通过映射配置文件配置 Hibernate
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • 具有重新排队功能的 BasicReject 实际上去了哪里?

    这似乎是一个简单的问题 但我很难找到明确的答案 如果在 RabbitMQ 3 6 1 中我有一个如下所示的队列 5 4 3 2 1 lt head 我使用消息 1 然后执行以下操作 channel BasicReject ea Delive
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • 9个 强化学习现实生活中的应用

    大多数人类和动物的学习可以说属于无监督学习 有人说 如果智能是一块蛋糕 那么无监督学习就是蛋糕 监督学习是锦上添花 强化学习是锦上添花 这似乎很有趣 对吧 强化学习是最接近人类学习的 就像我们人类从我们生活的动态环境中学习 我们的行为决定我
  • java不通过构造函数创建对象(Unsafe)

    java中不通过构造函数创建对象 也有说不创建对象直接执行成员方法 这里就不和你们扯什么通过 反序列化 clone等方法了 个人觉得都是在胡扯 如何不执行构造函数创建对象 先来带大家认识一个类 sun misc Unsafe 该类主要提供一
  • MySQL入門_テーブル作成

    create database case a show databases drop database case a create database case db use case db drop table if exists user
  • JS之返回字符串最后出现的位置lastIndexOf

    作用 lastIndexOf 方法可返回一个指定的字符串值最后出现的位置 在一个字符串中的指定位置从后向前搜索 语法 stringObject lastIndexOf searchvalue fromindex 参数1 必需 规定需检索的字
  • [ 人力资源面试篇 ] HR 面试题分析详解大集合,看完直怼面试官(一)

    博主介绍 博主介绍 大家好 我是 PowerShell 很高兴认识大家 主攻领域 渗透领域 数据通信 通讯安全 web安全 面试分析 点赞 评论 收藏 养成习惯 一键三连 欢迎关注 一起学习 一起讨论 一起进步 文末有彩蛋 作者水平有限 欢
  • Python面试题

    1 一行代码实现1 100之和 利用sum 函数求和 2 如何在一个函数内部修改全局变量 函数内部global声明 修改全局变量 3 列出5个python标准库 os 提供了不少与操作系统相关联的函数 sys 通常用于命令行参数 re 正则
  • 社区发现:论文中模块度Q的计算

    2 Extending the definition of modularity to directed graphs with overlapping communities 参考文献 1 刘传建 复杂网络中的社团结构划分及分析应用 D
  • glfwPollEvents()程序崩溃

    系列文章目录 文章目录 系列文章目录 前言 一 程序崩溃的地方找不到 二 解决步骤 1 vs2019中打开 诊断工具 窗口 2 在vs2019中打开 并行堆栈 窗口 总结 例子 源码下载 前言 如果使用GLFW 没有这句glfwPollEv
  • dz 2级域名

    例如 http www cheungfei com 开启了二级域名 http bbs cheungfei com 开启之后发现不能同步登陆 刚开始以为要在Ucenter中添加应用 后来发现问题还没有解决 到DISCUZ官网看看别人的帖子 才
  • 多线程、定时器----基础认识篇1

    1 多线程一般通过使用thread的子类或者往thread构造方法中传入runnable对象实现 也就是常说的 继承 thread类 和 实现runnable接口 注 实现runnable接口可以实现线程 原理是 在thread的run方法
  • Instagram Shop如何开通?如何销售?最全面攻略

    借助 Instagram 商店 品牌可以策划一系列可购物的商品 这些商品可通过其 Instagram 个人资料直接访问 这使得在应用程序上销售更容易 也被潜在客户发现 一 什么是Instagram Shop Instagram 商店为商家提
  • 2021 年山东省职业院校技能大赛中职组“网络安全” 赛项

    2021 年山东省职业院校技能大赛 中职组 网络安全 赛项 竞赛题库 网络安全赛项专家组 2021 年 11 月 赛题说明 一 竞赛时间安排与分值权重 二 竞赛拓扑图 模块编号 模块名称 竞赛时间 小时 权值 A 基础设施设置与安全加固 3
  • php 操作 MySQL 中的Blob类型

    我们需要保存一个文件或者一张图片或者其他二进制或多媒体文件时 经常选择使用 类型 一 基本使用 Blob就是一种Mysql的数据类型 它是一个二进制大型对象 可以作为大量数据的容器 其实更准确地说Blob是一系列数据类型 MySQL的四种B
  • 深入源码分析Spring为什么不支持构造方法的循环依赖

    我们知道当通过构造方法的方式注入属性时 是不支持循环依赖这种场景的 本文主要通过分析源码看看为什么构造方法不能支持循环依赖 当然 如果读者还不了解循环依赖的问题 建议先结合源码搞清楚 可以先看看这篇文章 深入源码分析Spring如何解决循环
  • 高通LK代码devinfo分区 read_device_info

    有一个devinfo分区专门用来保存一些信息 在devinfo分区没烧录过的情况下 默认Charger screen enabled false 没有关机充电动画 fastboot oem device info lk调用读这些信息 当然不
  • 宝塔搭建网站教程php,怎么利用宝塔面板搭建网站详细教程

    利用宝塔面板搭建网站是当前主流形式 宝塔面板操作简单 可视化操作 是新手和老司机搭建网站的首选 今天我的主题网就给小白们分享下怎么利用宝塔搭建自己的网站 如果你还没有安装宝塔可以参考 宝塔面板安装小白教程 来进行安装 1 宝塔面板添加站点步
  • 【满分】【华为OD机试真题2023B卷 JAVA&JS】经典屏保

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 经典屏保 知识点循环迭代编程基础 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 DVD机在视频输出时 为了保护电视显像管 在待机状态会显示 屏保动画 如下图所示 DV
  • JS的一些数据类型的转换

    bytes 转 16进制字符串 function bytesToHex bytes for var hex i 0 i lt bytes length i hex push bytes i gt gt gt 4 toString 16 he
  • 入行网络工程师一年的心得体会

    本人与2019年毕业与天津某高校的网络工程专业 大学期间就考了一个网络工程师的软考中级职称 过了一个没啥用的英语四级 也有想过考一个华为或者思科的IE证书 但是价格对于一个学生党来说 确实代价太大了 报一个培训班1w5 考试费用零零散散加起
  • RabbitMQ入门教程(安装,管理插件,Publisher/Consumer/交换机/路由/队列/绑定关系,及如何保证100%投递等)

    RabbitMQ入门教程 安装 管理插件 Publisher Consumer 交换机 路由 队列 绑定关系 及如何保证100 投递等 1 RabbitMQ简介及AMQP协议 开源的消息代理和队列服务器 基于AMQP Advanced Me