RabbitMQ-api开发

前言

MQ就是接收并转发消息

核心概念

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

admin是用户
在这里插入图片描述
每个虚拟机上都有多个交换机

快速入门

引入依赖

        <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.22.0</version></dependency>

生产者

在这里插入图片描述

建立连接
在这里插入图片描述
在这里插入图片描述

消费者

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

其实这里消费了两条消息的,因为释放太快了,有一条还来不及打印
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果没有释放资源的话
在这里插入图片描述
这两个就会一直存在东西

在这里插入图片描述
connection关闭的话,channel会自动关闭的,所以会报错这里

工作模式的介绍

官网

在这里插入图片描述
简单模式,一个生产者,一个消费者
工作队列模式:一个生产者,多个消费者,c1和c2共同消费p生产的消息

在这里插入图片描述

交换机类型
作⽤: ⽣产者将消息发送到Exchange, 由交换机将消息按⼀定规则路由到⼀个或多个队列中(上图中⽣产
者将消息投递到队列中, 实际上这个在RabbitMQ中不会发⽣. )
RabbitMQ交换机有四种类型: fanout,direct, topic, headers, 不同类型有着不同的路由策略. AMQP协
议⾥还有另外两种类型, System和⾃定义, 此处不再描述.

  1. Fanout:⼴播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式),就是消息会重复消费的,交换机是广播类型
  2. Direct:定向,把消息交给符合指定routing key的队列(Routing模式)
  3. Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式),就是bingdingkey是通配符,但是routingkey一定是字符串,看匹不匹配
  4. headers类型的交换器不依赖于路由键的匹配规则来路由消息, ⽽是根据发送的消息内容中的
    headers属性进⾏匹配. headers类型的交换器性能会很差,⽽且也不实⽤,基本上不会看到它的存在.
    Exchange(交换机)只负责转发消息, 不具备存储消息的能⼒, 因此如果没有任何队列与Exchange绑
    定,或者没有符合路由规则的队列,那么消息就会丢失
    RoutingKey: 路由键.⽣产者将消息发给交换器时, 指定的⼀个字符串, ⽤来告诉交换机应该如何处理这个消息.
    Binding Key:绑定. RabbitMQ中通过Binding(绑定)将交换器与队列关联起来, 在绑定的时候⼀般会指
    定⼀个Binding Key, 这样RabbitMQ就知道如何正确地将消息路由到队列了

在这里插入图片描述
在这里插入图片描述
就是看routingkey匹配哪个bindingkey,匹配哪个的话,就去哪个队列

当消息的Routing key与队列绑定的Bindingkey相匹配时,消息才会被路由到这个队列
BindingKey其实也属于路由键中的⼀种, 官⽅解释为:the routingkey to use for the binding.
可以翻译为:在绑定的时候使⽤的路由键. ⼤多数时候,包括官⽅⽂档和RabbitMQJava API 中都把
BindingKey和RoutingKey看作RoutingKey, 为了避免混淆,可以这么理解:

  1. 在使⽤绑定的时候,需要的路由键是BindingKey.
  2. 在发送消息的时候,需要的路由键是RoutingKey

第三个,发布订阅模式,x表示的是交换机,有特殊作用,每个生产者都收到的相同消息
也是广播模式

第四个路由模式,增加了routingkey,发布订阅模式没有bingdingkey,会转发到匹配的队列,发布订阅模式的升级

第五个是通配符模式,是路由模式的升级,就是bindingkey支持通配符
在这里插入图片描述

星表示一个单词,#表示多个单词

第六个是RPC模式,RPC通信
在这里插入图片描述

  1. 客⼾端发送消息到⼀个指定的队列, 并在消息属性中设置replyTo字段, 这个字段指定了⼀个回调队
    列, ⽤于接收服务端的响应.
  2. 服务端接收到请求后, 处理请求并发送响应消息到replyTo指定的回调队列
  3. 客⼾端在回调队列上等待响应消息. ⼀旦收到响应,客⼾端会检查消息的correlationId属性,以
    确保它是所期望的响应

第七个发布确认模式

Publisher Confirms模式是RabbitMQ提供的⼀种确保消息可靠发送到RabbitMQ服务器的机制。在这
种模式下,⽣产者可以等待RabbitMQ服务器的确认,以确保消息已经被服务器接收并处理.

  1. ⽣产者将Channel设置为confirm模式(通过调⽤channel.confirmSelect()完成)后, 发布的每⼀条消
    息都会获得⼀个唯⼀的ID, ⽣产者可以将这些序列号与消息关联起来,以便跟踪消息的状态.
  2. 当消息被RabbitMQ服务器接收并处理后,服务器会异步地向⽣产者发送⼀个确认(ACK)给⽣产者
    (包含消息的唯⼀ID),表明消息已经送达
    通过Publisher Confirms模式,⽣产者可以确保消息被RabbitMQ服务器成功接收, 从⽽避免消息丢失
    的问题

在这里插入图片描述
是生产者和队列之间的保证

工作队列模式

简单模式中的生产者,就是把消息转发到和routingkey相同的队列中
多个消费者

在这里插入图片描述
在这里插入图片描述
因为使用的是默认交换机,所以就可以根据routingkey找到相同队列名称

在这里插入图片描述
先启动消费者,因为先启动生产者的话,消费者一个就一下消费完了
而且消费者要关闭close
在这里插入图片描述
在这里插入图片描述
工作队列模式就是共同消费的意思
一个生产者,一个队列,多个消费者,默认交换机

发布订阅模式

多了exchange的角色

在发布/订阅模型中,多了⼀个Exchange⻆⾊.
Exchange 常⻅有三种类型, 分别代表不同的路由规则
a) Fanout:⼴播,将消息交给所有绑定到交换机的队列(Publish/Subscribe模式)
b) Direct:定向,把消息交给符合指定routing key的队列(Routing模式)
c) Topic:通配符,把消息交给符合routing pattern(路由模式)的队列(Topics模式)
也就分别对应不同的⼯作模式

就是广播了

与上面的区别就是生产者要声明交换机,然后队列与交换机的绑定关系
在这里插入图片描述

在这里插入图片描述
发布订阅模式就是把收到的消息全部转发到所有的队列中,每个队列都有这个消息,所以routingkey为空
消费者的话,就是两个消费者分别消费两个队列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

路由模式

发布订阅模式就是会把消息发给所有和这个交换机绑定的队列
而路由模式交换机类型不同,第二就是与队列建立绑定关系的时候,要建立bindingkey
第三就是发送消息的时候,要指定routingkey,routingkey与bindingkey一致的时候就会发送了
在这里插入图片描述
第三个参数就是bindingkey
在这里插入图片描述

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

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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

通配符模式

在这里插入图片描述

在topic类型的交换机在匹配规则上, 有些要求:

  1. RoutingKey 是⼀系列由点( . )分隔的单词, ⽐如 " stock.usd.nyse ", " nyse.vmw ",
    " quick.orange.rabbit "
  2. BindingKey 和RoutingKey⼀样, 也是点( . )分割的字符串.
  3. Binding Key中可以存在两种特殊字符串, ⽤于模糊匹配
    ◦ * 表⽰⼀个单词,不是一个字母
    ◦ # 表⽰多个单词(0-N个)

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

在这里插入图片描述

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

在这里插入图片描述
消费者获取到消息,默认就删除了

在这里插入图片描述

RPC通信-客户端

RPC(Remote Procedure Call), 即远程过程调⽤. 它是⼀种通过⽹络从远程计算机上请求服务, ⽽不需要了解底层⽹络的技术. 类似于Http远程调⽤.
RabbitMQ实现RPC通信的过程, ⼤概是通过两个队列实现⼀个可回调的过程

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

RabbitMQ 消息确定机制
在RabbitMQ中,basicConsume⽅法的autoAck参数⽤于指定消费者是否应该⾃动向消息队列确认
消息
⾃动确认(autoAck=true): 消息队列在将消息发送给消费者后, 会⽴即从内存中删除该消息. 这意味
着, 如果消费者处理消息失败,消息将丢失,因为消息队列认为消息已经被成功消费
⼿动确认(autoAck=false): 消息队列在将消息发送给消费者后,需要消费者显式地调⽤basicAck
⽅法来确认消息. ⼿动确认提供了更⾼的可靠性, 确保消息不会被意外丢失, 适⽤于消息处理重要且需
要确保每个消息都被正确处理的场景
在这里插入图片描述

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

发布确认

就是最后一个模式
作为消息中间件, 都会⾯临消息丢失的问题.
消息丢失⼤概分为三种情况:

  1. ⽣产者问题. 因为应⽤程序故障, ⽹络抖动等各种原因, ⽣产者没有成功向broker发送消息.
  2. 消息中间件⾃⾝问题. ⽣产者成功发送给了Broker, 但是Broker没有把消息保存好, 导致消息丢失.
  3. 消费者问题. Broker 发送消息到消费者, 消费者在消费消息时, 因为没有处理好, 导致broker将消费
    失败的消息从队列中删除了

RabbitMQ也对上述问题给出了相应的解决⽅案. 问题2可以通过持久化机制. 问题3可以采⽤消息应答机制. (后⾯详细讲)
针对问题1, 可以采⽤发布确认(Publisher Confirms)机制实现.

⽣产者将信道设置成confirm(确认)模式, ⼀旦信道进⼊confirm模式, 所有在该信道上⾯发布的消息都
会被指派⼀个唯⼀的ID(从1开始), ⼀旦消息被投递到所有匹配的队列之后, RabbitMQ就会发送⼀个确认给⽣产者(包含消息的唯⼀ID), 这就使得⽣产者知道消息已经正确到达⽬的队列了, 如果消息和队列是可持久化的, 那么确认消息会在将消息写⼊磁盘之后发出. broker回传给⽣产者的确认消息中
deliveryTag 包含了确认消息的序号, 此外 broker 也可以设置channel.basicAck⽅法中的multiple参
数, 表⽰到这个序号之前的所有消息都已经得到了处理
在这里插入图片描述

第一个是批量确认,第二个不是

发送⽅确认机制最⼤的好处在于它是异步的, ⽣产者可以同时发布消息和等待信道返回确认消息.

  1. 当消息最终得到确认之后, ⽣产者可以通过回调⽅法来处理该确认消息.
  2. 如果RabbitMQ因为⾃⾝内部错误导致消息丢失, 就会发送⼀条nack(Basic.Nack)命令, ⽣产者同样
    可以在回调⽅法中处理该nack命令.
    使⽤发送确认机制, 必须要信道设置成confirm(确认)模式.
    发布确认是 AMQP 0.9.1 协议的扩展, 默认情况下它不会被启⽤. ⽣产者通过channel.confirmSelect()将信道设置为confirm模式

有三种确认方式,单独确认,批量确认(就是发布数量达到一定数量的时候开始去确认),异步确认(另外开一个线程却确认)

可以去看官网

单独确认

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

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

这个确认的话,是虚拟机自己确认的,不关我们的事,不关消费者的事,这个一个一个确认就很慢

如果队列还要持久化这个数据的话,就更慢了

批量确认

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

异步确认

异步confirm⽅法的编程实现最为复杂. Channel 接⼝提供了⼀个⽅法addConfirmListener. 这个⽅法
可以添加ConfirmListener 回调接⼝.
ConfirmListener 接⼝中包含两个⽅法: handleAck(long deliveryTag, boolean
multiple) 和 handleNack(long deliveryTag, boolean multiple) , 分别对应处理
RabbitMQ发送给⽣产者的ack和nack.
deliveryTag 表⽰发送消息的序号. multiple 表⽰是否批量确认

我们需要为每⼀个Channel 维护⼀个已发送消息的序号集合. 当收到RabbitMQ的confirm 回调时, 从集
合中删除对应的消息. 当Channel开启confirm模式后, channel上发送消息都会附带⼀个从1开始递增的
deliveryTag序号. 我们可以使⽤SortedSet 的有序性来维护这个已发消息的集合.

  1. 当收到ack时, 从序列中删除该消息的序号. 如果为批量确认消息, 表⽰⼩于等于当前序号
    deliveryTag的消息都收到了, 则清除对应集合
  2. 当收到nack时, 处理逻辑类似, 不过需要结合具体的业务情况, 进⾏消息重发等操作

可以一下发布多个消息,然后multiple =true就是批量确认,deliveryTag =3,就是确认它之前的,包括它,要么multiple =false,就是确认单个

在这里插入图片描述

在这里插入图片描述
如果数据量很大的话,异步确认就要比批量确认快得多

总结

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

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

相关文章

PostgreSQL Patroni集群组件作用介绍:Patroni、etcd、HAProxy、Keepalived、Watchdog

1. Watchdog 简介 1.1 核心作用 • 主节点故障检测 Watchdog 会定时检测数据库主节点&#xff08;或 Pgpool 主节点&#xff09;的运行状态。 一旦主节点宕机&#xff0c;它会发起故障切换请求。 • 协调主备切换 多个 Pgpool 节点时&#xff0c;Watchdog 保证只有一个 Pg…

【多种不同提交方式】通过springboot实现与前端网页数据交互(非常简洁快速)

【多种不同提交方式】通过springboot实现与前端网页数据交互 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是springboot的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&am…

使用 AI 如何高效解析视频内容?生成思维导图或分时段概括总结

一、前言 AI 发展的如此迅速&#xff0c;有人想通过 AI 提效对视频的解析&#xff0c;怎么做呢&#xff1f; 豆包里面有 AI 视频总结的功能&#xff0c;可以解析bilibili网站上部分视频&#xff0c;如下图所示&#xff1a; 但有的视频解析时提示&#xff1a; 所以呢&#x…

鞅与停时 - 一种特别的概率论问题

讨论一个有趣的概率问题&#xff1a; [P3334 ZJOI2013] 抛硬币 - 洛谷 实际上是一个猴子打字问题&#xff0c;考虑一直无规律随即打字的猴子&#xff0c;键盘上只有A-Z一共26个字母&#xff0c;对于一个特定的字符串 S S S &#xff1a; ABCABCAB &#xff0c;能否在有限的打…

arcgis和ENVI中如何将数据输出为tif

一、arcgis中转换为tif 右键图层&#xff1a; Data -> Export Data, 按照图示进行选择&#xff0c;选择tiff格式导出即可&#xff0c;还可以选择其他类型的格式&#xff0c;比如envi。 二、 ENVI中转换为tif File -> Save As -> Save As (ENVI, NITF, TIFF, DTED) …

如何用命令行判断一个exe是不是c#wpf开发的

在powershell下执行 $assembly [Reflection.Assembly]::ReflectionOnlyLoadFrom("你的exe全路径") $references $assembly.GetReferencedAssemblies() echo $assembly $references | Where-Object { $_.Name -match "PresentationFramework|PresentationCore…

2025.05.07-华为机考第三题300分

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 03. 城市紧急救援队伍协同规划 问题描述 智慧城市建设中,卢小姐负责设计一套紧急救援队伍协同系统。城市被规划为一个 n n n \times n

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…

jupyter notebook汉化教程

本章教程记录&#xff0c;jupyter notebook汉化步骤&#xff0c;如果对汉化有需求的小伙伴可以看看。 一、安装jupyter 如果你是安装的anaconda的那么默认是包含了Jupyter notebook的&#xff0c;如果是miniconda或者基础python&#xff0c;默认是不包含的jupyter组件的&#x…

模拟设计中如何减小失配

Xx 芯片测试结果显示&#xff0c;offset 指标偏高&#xff0c;不符合指标要求。所以查看了资料&#xff0c;温习了减小的失配的方法。 注意点一&#xff1a; 将所有offet折算到输入端&#xff0c;得到以下公式&#xff1a; 可以看到a&#xff09;阈值电压失配直接折算成输…

C++ 与 Lua 联合编程

在软件开发的广阔天地里&#xff0c;不同编程语言各有所长。C 以其卓越的性能、强大的功能和对硬件的直接操控能力&#xff0c;在系统开发、游戏引擎、服务器等底层领域占据重要地位&#xff0c;但c编写的程序需要编译&#xff0c;这往往是一个耗时操作&#xff0c;特别对于大型…

烤箱面包烘焙状态图详解:从UML设计到PlantUML实现

题目&#xff1a;假设你正着手设计一个烤箱。建立一个跟踪烤箱中面包状态的状态图。要包括必要的触发器事件、动作和监视条件。 一、状态图概述 状态图是UML&#xff08;统一建模语言&#xff09;中的一种行为图&#xff0c;它用于描述系统中对象的状态变化以及触发这些变化的…

三款实用工具推荐:配音软件+Windows暂停更新+音视频下载!

各位打工人请注意&#xff01;今天李师傅掏出的三件套&#xff0c;都是经过实战检验的效率放大器。先收藏再划走&#xff0c;说不定哪天就能救命&#xff01; 一.祈风TTS-配音大师 做短视频的朋友肯定深有体会——配个音比写脚本还费劲&#xff01;要么付费买声音&#xff0c…

物流无人机结构与载货设计分析!

一、物流无人机的结构与载货设计模块运行方式 1.结构设计特点 垂直起降与固定翼结合&#xff1a;针对复杂地形&#xff08;如山区、城市&#xff09;需求&#xff0c;采用垂直起降&#xff08;VTOL&#xff09;与固定翼结合的复合布局&#xff0c;例如“天马”H型无人机&am…

Decode rpc invocation failed: null -> DecodeableRpcInvocation

DecodeableRpcInvocation 异常情况解决方法 错误警告官方FAQ 异常情况 记录一下Dubbo调用异常 java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2025-05-07 22:09:5…

Excel VBA 词频统计宏

在Excel中&#xff0c;我们经常需要分析文本数据&#xff0c;例如统计某个单词或短语在文档中出现的次数。虽然Excel本身提供了一些文本处理功能&#xff08;如COUNTIF&#xff09;&#xff0c;但对于复杂的词频统计&#xff0c;手动操作可能效率低下。这时&#xff0c;VBA宏可…

DRV8301 三相电机驱动芯片的硬件参数与应用设计

DRV8301 硬件参数分析 1. 电源与驱动能力 输入电压范围&#xff1a;PVDD1&#xff08;主电源&#xff09;6V~60V&#xff0c;PVDD2&#xff08;降压转换器电源&#xff09;3.5V~60V&#xff0c;支持宽电压应用场景。 驱动电流&#xff1a;1.7A 源极驱动电流&#xff08;Sourc…

QT Sqlite数据库-教程03 插入数据-下

【1】手动提交事务 #include <QtSql/QSqlDatabase> #include <QtSql/QSqlQuery> #include <QtSql/QSqlRecord>QSqlDatabase db; db.transaction(); for(int i0; i<100000; i){QSqlQuery cmd(QString("UPDATE %1 SET %2%3 WHERE id%4").arg(tab…

LeetCode 每日一题 2025/4/28-2025/5/4

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/28 2302. 统计得分小于 K 的子数组数目4/29 2962. 统计最大元素出现至少 K 次的子数组4/30 1295. 统计位数为偶数的数字5/1 2071. 你可以安排的最多任务数目5/2 838. 推多…

三、Hadoop1.X及其组件的深度剖析

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 专栏&#xff1a;Hadoop教程 一、Hadoop 1.X 概述 &#xff08;一&#xff09;概念 Hadoop 是 Apache 开发的分布式系统基础架构&#xff0c;用 Java 编写&#xff0c;为集群处理大型数据集提供编程模型&#xff0c;…