RabbitMQ小记

参考书籍:朱忠华的《RabbitMQ实战指南》

一、基础概念

1.Exchange

1.1 创建方法的参数,exchangeDeclare()

  • exchange:交换器的名称
  • type:交换器的类型
  • durable:是否持久化,true代表持久化。(持久化会将交换器存入磁盘)
  • autoDelete:是否自动删除,true表示自动删除。(当该交换器上绑定的最后一个队列/交换器解除绑定后,该交换器自动删除)
  • internal:是否是内置的,true表示内置交换器。(生产者无法直接发消息给内置交换器,只能通过其他交换器路由到该交换器)
  • argument:其他一些结构化的参数

1.2 交换器类型

1.2.1 fanout
  • 把所有消息路由到与该交换器绑定的队列
1.2.2 direct
  • 路由时需要BindingKey和RoutingKey完全匹配
1.2.3 topic
  • 路由到BindingKey和RoutingKey相匹配的队列
    • RoutingKey和BindingKey为以“.”分隔的字符串
    • BindingKey中可以存在“*”(匹配一个单词),“#”(匹配多个单词,也可以是0个)
1.2.4 header
  • 不依赖路由键的匹配规则来路由消息,而是根据发送的消息内容中的header属性进行匹配

1.3 备份交换器

  • 生产者发送消息时未设置mandatory参数,若根据路由键没有符合的队列该消息将会丢失
  • 如果设置mandatory参数则需要增加程序对应的处理逻辑,相对复杂
  • 可以设置备份交换器来存储这部分消息,后面再根据需要进行处理这部分消息
    请添加图片描述

2.Queue

2.1 创建方法的参数,queueDeclare()

  • queue:队列的名称
  • durable:是否持久化
  • exclusive:是否排他,true表示排他。(队列仅对首次声明他的连接可见,并在该连接断开后自动删除)
    • 排他队列是基于连接(Connection)可见的,同一个连接的不同信道(Channel)可以同时访问该队列
  • autoDelete:是否自动删除,true表示自动删除。(至少有一个消费者连接到这个队列,之后所有与这个连接的消费者都断开时,才会自动删除)
  • arguments:其他一些参数
    • x-message-ttl:指定队列中消息的过期时间(以毫秒为单位)。超过指定时间的消息将被自动删除。
    • x-max-length:指定队列中消息的最大数量。不设置的情况下,将没有长度限制,无限制地消耗系统资源。
    • x-max-length-bytes:指定队列中消息的最大总字节数。当队列中的消息总字节数达到最大值时,新的消息将被拒绝或丢弃。
    • x-expires:指定队列的过期时间(以毫秒为单位)。当队列在指定时间内未被使用时,将自动删除。
    • x-dead-letter-exchange:指定一个交换机名称,用于接收被拒绝或过期的消息。这些消息将被重新路由到指定的交换机中。
    • x-dead-letter-routing-key:指定一个路由键,用于重新路由被拒绝或过期的消息。
    • x-overflow:队列消息数量超过限制后的策略模式。默认采用drop-head策略
      • drop-head:新的消息将覆盖队列中最早的消息
      • reject-publish:新的消息将被拒绝并丢弃
      • reject-publish-dlx:新的消息将被拒绝并发送到死信交换机
    • x-max-priority:队列消费的优先级顺序

3.死信队列

DLX,全称Dead-Letter-Exchange,死信交换器。当消息在一个队列中变成死信后,会被重新发送到另一个交换器,这个交换器就是DLX,其绑定的队列称之为死信队列

3.1消息变成死信的情况

  • 消息被拒绝且requeue设置为false
  • 消息过期
  • 队列达到最大长度,且x-overflow策略为reject-publish-dlx

3.2 流程图

请添加图片描述

4.延迟队列

延迟队列存储的对象是延迟消息,就是在某些特殊情况下,需要让消息在一定时间后再交给消费者进行消费的场景。

实现逻辑

  • 和上面死信队列中的流程图一致,只是上图中消息进入死信队列的情况有三种,延迟队列只是通过消息过期来这一种情况来实现
  • 延迟消息中,queue1不绑定消费者,消费者绑定queue2,等待消息过期后进行消费

5. 优先级队列

这类队列中具有高优先级的消息优先被消费

5.1 注意事项

  • 首先queue需要设置x-max-priority属性,且messge也需要设置priority属性
  • 如果只设置message的priority属性,不设置queue的x-max-priority属性。则消息的 priority 值只是一个消息属性,但不会影响消息的处理顺序
  • 消息的优先级priority为0-9,值为0代表会被最后消费
  • x-max-priority值代表该队列能识别priority的最大值,priority大于该值的消息都视同为x-max-priority的值

5.2 例子

  • 如果队列的x-max-priority为5,分别有priority为0,1,2,3,4,5,6,7,8,9的消息若干条,将会以怎么样的顺序进行消费?
    • 队列的x-max-priority为5,所以所有优先级大于5的消息(即优先级为6,7,8,9的消息)都将被视为优先级为5。
  • 优先级为5(包括原本优先级为6,7,8,9的消息)的消息将首先被消费
  • 然后消费优先级为4的消息
  • 然后消费优先级为3的消息
  • 然后消费优先级为0的消息

6.持久化

6.1 分类

6.1.1 交换器的持久化
  • 通过声明交换器的时候设置durable参数
  • 如果不做持久化,重启服务后,交换器的元数据会丢失,但是消息不会丢失
6.1.2 队列的持久化
  • 通过声明队列的时候设置durable参数
  • 如果不做持久化,重启服务后,队列的元数据会丢失,消息数据也会丢失
6.1.3 消息的持久化
  • 通过生产消息时候设置basicProperties的deliveryMode参数

6.2 注意事项

  • 设置队列和消息的持久化,服务重启后,消息和队列依旧存在
  • 只设置队列持久化,服务重启后,队列存在,但消息丢失
  • 只设置消息持久化,服务重启后,队列消失,继而消息也会丢失
    • 因为消息是存储在队列中的,如果队列丢失了,那么队列中的消息,无论是否持久化,都会丢失。

二、消息

1.生产消息

1.1 basicPublish()
  • exchange:交换器名称
  • routingKey:路由键
  • props:消息的基本属性集
    • contentType:设置消息的内容类型
      • application/json --> json格式的数据
      • application/xml --> XML格式
      • text/plain --> 纯文本格式
    • contentEncoding:设置消息的内容编码
    • header:对应交换器为header类型时使用
    • deliveryMode:设置消息的投递模式,可选值为 1(非持久化)或 2(持久化)
    • priority:设置消息的优先级,优先级由低到高为0 到 9,值为0代表最后消费。注意只有对应的队列设置了x-max-priority 参数才会根据优先级进行消费
    • replyTo:设置消息的回复队列。指定一个队列,用于接收消息的回复或响应,消费者可以将回复发送到指定的队列中,使生产者能够获取到回复消息。
    • expiration:设置消息的过期时间
    • messageId:设置消息的唯一标识符
    • timestamp:设置消息的时间戳
    • type:描述消息的类型。消费者可以根据type属性的不同,分类处理不同type的消息
  • byte[] body:消息体
  • mandatory:true表示交换器根据路由键找不到符合的队列时,会调用basicReturn将消息返回给生产者。false表示这种情况会把消息丢弃
  • immediate:true表示交换机将消息路由到队列上且该队列上没有消费者时,那么该消息不会存入队列,当匹配的所有队列都没有消费者时,会通过basicReturn将消息返回给生产者

2.消费消息

2.1 消费模式
2.1.1 推模式:basicConsumer()
  • queue:队列的名称
  • autoAck:设置是否自动确认
  • consumerTag:消费者标签。用来区分多个消费者
  • noLocal:为true表示不能将同一个Connection中生产者发送的消息传送给这个Connection中的消费者
  • exclusive:是否排他,消费者独占该队列,其他消费者无法同时访问该队列
  • arguments:其他参数
  • callback:设置回调函数
2.1.2 拉模式:basicGet()
2.2 消费端的确认与拒绝
2.2.1 确认
  • 若消费者在订阅时设置autoAck为true,则发送出去的消息会自动被置为确认,然后删除该消息。
  • 若消费者在订阅时设置autoAck为false,则发出的消息后,会等待消费者显式的回复确认信号后再删除该消息。
  • 若在显式的回复确认信号前进程挂掉或者其他原因一直未发出,RabbitMQ会一直等待持有消息,等待消费者显式调用Basic.Ack为止
  • 若autoAck为false,一直没收到确认信号,并且消费者已经断开连接,则会安排该消息重新进入队列,等待投递给下一个消费者,当然也有可能还是原来的那个消费者
2.2.2 拒绝
  • 拒绝单条消息:basicReject()
    • deliveryTag:消息的编号
    • requeue:为true表示将该消息重新存入队列,以便发送给下一个消费者。为false表示把消息从队列中移除
  • 批量拒绝消息:basicNack()
    • deliveryTag
    • multiple:false表示拒绝编号为delivery的这一条消息,为true表示拒绝deliveryTag编号之前所有未被当前消费者确认的消息
    • requeue
  • 重新请求未确认的消息:basicRecover()
    • requeue:消息未被确认的消息重新加入到队列后,为true表示同一条消息会被分配给与之前不同的消费者,为false表示同一条消息会被分配给与之前相同的消费者

3.消息过期时间TTL

3.1 实现方式
  • 设置队列属性。x-message-ttl指定队列中消息的过期时间(以毫秒为单位)。超过指定时间的消息将被自动删除。
  • 生产消息时候针对该消息设置过期时间。expiration设置消息的过期时间
3.2 注意事项
  • 如果两种方法一起使用,消息的TTL以两者较小的数值为准
  • 消息在队列中的生存时间超过TTL后,就会变成“死信”,不会再被消费者接收
  • 在队列属性TTL方式中,消息过期后就会从队列中删除
  • 在消息属性TTL方式中,消息过期后不回立即删除,因为消息只有在被投递到消费者的时候才会进行判定

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

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

相关文章

【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

Git命令(1)[删除,恢复与移动]

文章目录 1.删除文件1.1命令----rm <filename>1.2命令----git rm <filename>1.1命令----git rm <filename> -f 2.恢复文件2.1命令----git restore <filename>2.1命令----git restore --staged <filename> 3.重命名文件3.1命令----mv 旧文件 新文…

八股面试速成—Java语法部分

暑期实习面试在即&#xff0c;这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图&#xff0c;然后看详细的面试知识点&#xff0c;最后刷题 其中导图包含的是常考的题&#xff0c;按照思维导图形式整理&#xff0c;会在复盘后更新 细节研究侧重补全&a…

租用阿里云的服务器多少钱?30元、61元、99元、165元、199元

租个阿里云的服务器多少钱&#xff1f;很便宜&#xff0c;云服务器2核2G3M固定带宽99元一年、2核4G服务器30元3个月、199元一年&#xff0c;轻量应用服务器2核2G3M配置61元一年、2核4G4M带宽165元一年&#xff0c;可以在阿里云CLUB中心查看 aliyun.club 当前最新的优惠券和活动…

GitOps - 为 OpenShift GitOps 配置邮件通知

《OpenShift 4.x HOL教程汇总》 说明&#xff1a;本文已经 在OpenShift 4.15 OpenShift GitOps 1.11.2 环境中验证 文章目录 ArgoCD 的 Notification 功能简介启动 OpenShift GitOps 的 Notification 功能配置邮件通知验证参考 说明&#xff1a;先根据《OpenShift 4 之 GitOp…

学习 Git 基础知识 - 日常开发任务手册

欢迎来到我关于 Git 的综合指南&#xff0c;Git 是一种分布式版本控制系统&#xff0c;已经在软件开发中彻底改变了协作和代码管理方式。 无论你是经验丰富的开发者还是刚开始编程之旅的新手&#xff0c;理解 Git 对于正确掌控代码、高效管理项目和与他人合作至关重要。 在本…

App应用的服务器如何增加高并发能力

大家好&#xff01;我是你们的好朋友咕噜铁蛋&#xff01;近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;各类App应用如雨后春笋般涌现&#xff0c;用户量呈现爆发式增长。然而&#xff0c;随之而来的高并发访问问题也开始频繁出现&#xff0c;给服务器带来了极大的挑…

UV胶水与聚氯乙烯PVC材料的塑料粘接,效果如何?

UV胶水可以与聚氯乙烯PVC很好地粘接。 PVC是一种常见的塑料材料&#xff0c;UV胶水通常对PVC具有良好的粘接性能。UV胶水可以在紫外线照射下迅速固化&#xff0c;形成坚固的粘接&#xff0c;因此通常被用于PVC制品的粘接和修复。 UV胶水与PVC粘接的优点&#xff1a; 1. 快速固…

java数据结构与算法刷题-----LeetCode172. 阶乘后的零

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 文章目录 数学&#xff1a;阶乘的10因子个数数学优化:思路转变为求5的倍数…

wordpress全站开发指南-面向开发者及深度用户(全中文实操)--创建新主题

前言 你可以在wordpress里面下载使用人家打包好的主题&#xff0c;但可能不是很好用&#xff0c;接下来就自己做一个自己的主题。你需要先找到xampp文件夹–htdocs–wordpress(我给更名为wplocal)–wp-content–themes 进入该文件夹之后你可以看到你之前下载导入的所有主题文件…

vue + koa + Sequelize + 阿里云部署 + 宝塔:宝塔数据库连接

之前文章已经介绍了宝塔上传前后端代码并部署&#xff0c;不清楚的请看这篇文章&#xff1a; vue koa 阿里云部署 宝塔&#xff1a;宝塔前后端部署 下面是宝塔创建数据库&#xff1a; 我用的 koa Sequelize 连接的数据库&#xff0c;Sequelize 非常适合前端使用&#xf…

【Python】字符串处理技巧大揭秘:从基础到高级

欢迎来CILMY23的博客 本篇主题为 字符串处理技巧大揭秘&#xff1a;从基础到高级 个人主页&#xff1a;CILMY23-CSDN博客 Python系列专栏&#xff1a;http://t.csdnimg.cn/HqYo8 上一篇博客&#xff1a; http://t.csdnimg.cn/5NRlT C语言专栏&#xff1a; http://t.csdnim…

虚幻UE5智慧城市全流程开发教学

一、背景 这几年&#xff0c;智慧城市/智慧交通/智慧水利等飞速发展&#xff0c;骑士特意为大家做了一个这块的学习路线。 二、这是学习大纲 1.给虚幻UE5初学者准备的智慧城市/数字孪生蓝图开发教程 https://www.bilibili.com/video/BV1894y1u78G 2.UE5数字孪生蓝图开发教学…

Docker 安装 Linux 系统可视化监控 Netdata

docker 安装 netdata 前提准备Docker 两种方式部署 Netdata1、使用 docker run 命令运行 netdata 服务2、使用 docker compose 运行 netdata 服务 Netdata 服务可视化界面Netdata 汉化处理 前提准备 说明&#xff1a;此处使用 windows11 安装的 docker desktop & wsl2/apli…

linux E: You don‘t have enough free space in /var/cache/apt/archives/. 空间不足

问题&#xff1a; 在ubuntu的亚马逊云计算机平台上&#xff0c;apt install的时候&#xff0c;报错&#xff0c;空间不足 解决方法&#xff1a; 查看磁盘情况&#xff1a; 设置自动清理&#xff1a; sudo apt-get autoclean sudo apt-get clean 解决&#xff1a;

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现

RabbitMQ3.13.x之十_流过滤的内部结构设计与实现 文章目录 RabbitMQ3.13.x之十_流过滤的内部结构设计与实现1. 概念1. 消息发布2. 消息消费 2. 流的结构1. 在代理端进行过滤2. 客户端筛选3. JavaAPI示例4. 流过滤配置5. AMQP上的流过滤6. 总结 3. 相关链接 1. 概念 流过滤的思…

前端与后端协同:实现Excel导入导出功能

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

RISC-V GNU Toolchain 工具链安装问题解决(含 stdio.h 问题解决)

我的安装过程主要参照 riscv-collab/riscv-gnu-toolchain 的官方 Readme 和这位佬的博客&#xff1a;RSIC-V工具链介绍及其安装教程 - 风正豪 &#xff08;大佬的博客写的非常详细&#xff0c;唯一不足就是 sudo make linux -jxx 是全部小写。&#xff09; 工具链前前后后我装了…

非关系型数据库--------------------Redis 群集模式

目录 一、集群原理 二、集群的作用 &#xff08;1&#xff09;数据分区 &#xff08;2&#xff09;高可用 Redis集群的作用和优势 三、Redis集群的数据分片 四、Redis集群的工作原理 五、搭建redis群集模式 5.1启用脚本配置集群 5.2修改集群配置 5.3启动redis节点 5…

Django--admin 后台管理站点

Django最大的优点之一&#xff0c;就是体贴的提供了一个基于项目model创建的一个后台管理站点admin。这个界面只给站点管理员使用&#xff0c;并不对大众开放。虽然admin的界面可能不是那么美观&#xff0c;功能不是那么强大&#xff0c;内容不一定符合你的要求&#xff0c;但是…