笔记-《RabbitMQ实战指南》

news2024/11/18 6:01:40

目录

    • 1.发到Mq对应的3个参数:Exchange(交换器),RountingKey(路由键),param
    • 2.队列
    • 3.Exchange(交换器)
    • 4.Binding(绑定)
    • 5.交换器类型
    • 6.Connection(连接),Channel(信道)
    • 7. AMQP协议
    • 8. 判断Channel或者Connection关闭状态
    • 9. 交换器和队列的autodelete属性
    • 10.交换器的internal属性
    • 11.队列的exclusive属性
    • 12.性能
    • 13.消费模式
    • 14.重新推给消费者的契机
    • 15.发送的消息丢了怎么办
    • 16.消息的TTL
    • 17.队列的TTL
    • 18.死信队列DLX
    • 19.其他队列
    • 20.持久化
    • 21.生产者确认
    • 22.消费者-消息分发策略
    • 23.消息传输保障
    • 24.多租户
    • 25.RabbitMq定制化
    • 26.RabbitMq集群
    • 99.其他

1.发到Mq对应的3个参数:Exchange(交换器),RountingKey(路由键),param

请添加图片描述

2.队列

RabbitMq中的消息只能存在队列中,消费者从队列中获取消息并消费。
而Kafka讲消息存在topic中,对应的队列只是topic实际存储文件中的位移标识。

多个消费者订阅同一个队列时,轮询,所以也不支持队列层面的广播(可以二次开发)

3.Exchange(交换器)

RabbitMq内真实情况:
生产者将消息发送给Exchange,由交换器将消息路由到一个或多个队列。若路由不到,则返回生产者,或直接丢弃

4.Binding(绑定)

Rounting key需要与交换器类型和绑定键(BindingKey)联合起来使用。
通过绑定将交换器和队列关联。
生产者将消息发送给交换器时,需求一个RountingKey,当BindingKey和RountingKey相匹配时,消息会被路由到对应的队列中。在绑定多个队列到同一个交换器时,这些绑定允许使用相同的BindingKey。
BindingKey并不是所有的情况都生效,取决于交换器类型。

5.交换器类型

  • fanout
    把发送的消息路由到所有与该交换器绑定的队列中。
  • direct
    RountingKey与BindingKey完全匹配
  • topic
    RountingKey与BindingKey模糊匹配
    “*“用于匹配一个单词,”#”用于匹配多规格单词(可以是零个)
    在这里插入图片描述
  • headers
    不依赖于路由键的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。
    性能差,基本上不用。

6.Connection(连接),Channel(信道)

Connection,TCP连接
Channel,AMQP信道,每个信道都会被指派一个唯一 的ID。
在这里插入图片描述
引入信道的原因:
多Connection也可以用,但是在多线程情况下,建立多个Connection即建立多个TCP连接,而建立和销毁TCP连接是非常昂贵的,如遇使用高峰,性能也会有瓶颈。RabbitMq采用类似NIO的做法,选择TCP连接复用。

注:NIO,非阻塞IO,包含Channel,Buffer和Selector。NIO基于Channel和Buffer进行操作,数据总是从信道读取数据到缓冲区,或者从缓冲区读取到信道中。Selector用于监听多个信道的事件。因此,单线程可以监听多个数据的信道。

7. AMQP协议

包含三层:

  1. Module Layer:位于协议最高层。定义了一些供客户端调用的命令。
  2. Session Layer:位于中间层。主要负责将客户端的命令发送给服务器,再讲服务器的应答返回给客户端。为客户端和服务器之间的通信提供可靠性同步机制和错误处理。
  3. Transport Layer:位于最底层。主要传输二进制数据流,提供帧的处理,信道复用,错误检测和数据表示等。

8. 判断Channel或者Connection关闭状态

Channel或Connection中有个isOpen方法,但是有可能会产生竞争,所以并不可靠。
正确的是,在使用Channel的时候处于关闭状态的时候,会抛出ShutdownSignalException异常;Connection关闭的时候,会抛出SocketException或IOException异常。捕捉异常即可。

9. 交换器和队列的autodelete属性

交换器:当属性值设置为true时,当所有的队列断开于交换器的绑定,那么交换器会自动删除。如果从未被绑定过,则不会被删除。
队列:当所有的相关消费者断开连接时,队列将会被删除
autodelete属性针对的是曾经有过但后来没有的事物。

10.交换器的internal属性

设置是否是内置的。如果设置为true,表示是内置的交换器。客户端程序无法直接发送消息到这个交换器中,只能通过交换器路由到交换器这种方式。

11.队列的exclusive属性

设置是否排他。为true则设置队列是排他的,则队列仅对首次声明它的连接(Connection)可见,并在断开连接时自动删除。
同一个Connection中的Channel可以同时访问同一连接创建的排他队列。
首次是指,如果一个连接已声明一个排他队列,则其他连接不允许创建同名的排他队列。
与普通队列不同,一旦连接关闭或客户端退出,该排他队列都会被自动删除。
这种队列适用于一个客户端同时发送和读取消息的应用场景。

12.性能

RabbitMq的消息存储在队列中,因此交换器的使用并不会真正消耗服务器的性能,而队列会。
如果要衡量RabbitMq的QPS只需要看队列即可。

13.消费模式

分为两种:推(Push)模式和拉(Pull)模式。推模式采用Basic.Consume进行消费,拉模式采用Basic.Get进行消费。
推:持续订阅

14.重新推给消费者的契机

RabbitMq不会为未确认(即autoack为false时,消费者还未返回ack)的消息设置过期时间,判断的唯一依据是该消息的消费者连接是否已经断开。

15.发送的消息丢了怎么办

两个参数:
mandatory:为true时,交换器无法根据自身的类型和路由键找到符合的队列,那么RabbitMq会调用Basic.Return命令将消息返回给生产者;为false,则消息直接丢弃。
immediate(RabbitMq现已不支持该参数的维护):为true,如果交换器在将消费路由到队列时发现队列上并不存在任何消费者,那么消息不会存入该队列。所有与路由匹配的队列都没有消费者时,会通过Basic.Return返回给生产者。

16.消息的TTL

  1. 设置队列属性,即队列中所有消息都有相同的过期时间。
    消息一旦过期,立马会从队列中抹去。队列中已过期的消息肯定在队列头部,RabbitMq只要定期从队头开始扫描是否有过期的消息即可。
  2. 对消息本身单独设置。
    即使消息过期,也不会立马从队列中抹去。每条消息的过期时间不一致,如果要删除只能扫描整个队列,所以会等到此消息即将被消费时才会判断是否过期及删除。

两种一起使用,则以两者较小的那个数值为准。
消息在队列中的时间超过TTL,则变成“死信”,消费者无法再接收(不绝对)。
不设置TTL代表消息永不过期;设置为0,代表除非此时可以直接将消息投递给消费者,否则直接丢弃。

17.队列的TTL

x-expires(单位:毫秒)参数可以控制队列被自动删除前处于未使用状态的时间。未使用的意思是队列上没有任何的消费者,也没有被重新声明,并且在过期时间段内也未调用过Basic.Get命令。
会确保在过期时间到达后将队列删除,但不保障删除的动作的及时性。在RabbitMq重启后,持久化的队列的过期时间会被重新计算。

18.死信队列DLX

也叫做死信交换器或死信邮箱。
当一个消息在一个队列中变成死信后,它能被重新发送到另一个交换器中,这个交换器就是DLX,绑定DLX的队列就称之为死信队列。
消息变成死信的几种情况:

  1. 消息被拒绝(Basic.Rejext/Basic.Nack),并且设置requeue参数为false;
  2. 消息过期;
  3. 队列达到最大长度。

19.其他队列

延迟队列:存储的对象是对应的延迟消息。
优先级队列:默认最低为0。

20.持久化

  • 交换器的持久化:声明交换器时设置durable参数为true;
    若不设置持久化,则相关的交换器元数据会丢失,消息不会丢失,只是不能将消息发送到这个交换器中了。
  • 队列的持久化:声明队列时设置durable参数为true;
    若不设置持久化,则相关的队列元数据会丢失,消息也会丢失。
    队列的持久化能保证本身的元数据不会因异常情况丢失,但不能保证内部存储的消息不丢失。要确保消息不丢失,需要消息的持久化。
  • 消息的持久化。
    将投递模式deliveryMode属性设置为2即可实现消息的持久化。

21.生产者确认

  • 事务(重量级,带来性能损耗)
    RabbitMq客户端与事务机制相关的三个方法:
    1 . channel.txSelect:用于将当前信道设置为事务模式
    2 . channel.txCommit:提交事务
    3 . channel.txRollback:回滚事务
  • 发送方确认(publisher confirm)机制实现
    生产者将信道设置成confirm(确认)模式,一旦信道进入confirm模式,所有在该信道上发布的消息都会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列,RabbitMq就会发送一个确认(Basic.Ack)给生产者(包含消息的唯一ID)。
    如果消息和队列是持久化的,那确认消息会在消息写入磁盘后发出。

事务机制和confirm机制的QPS差不多,confirm机制略胜一点点。因为confirm机制也是每发送一条消息就需要等待服务端的确认,实际上是一种串行同步等待的方式。事务机制也一样,发送消息后等待服务端确认,之后再发送消息。两者的存储确认原理相同,尤其对于持久化的消息来说,两者都需要等待消息确认落盘之后才会返回。
事务机制和confirm机制是互斥的,不能共存。
事务机制和confirm机制确保的是消息能够正确的发送到RabbitMq,这里是指发动到交换器,如果此交换器没有匹配的队列,那么消息也会丢失。

优化:批量或异步。

22.消费者-消息分发策略

默认:轮询
有可能会造成整体吞吐量下降
优化:计数,每发一条消息,计数+1,消费完一条消息,计数-1。设置一个计数上限。类似于TCP/IP的滑动窗口。(对于拉模式的消费方式无效)

23.消息传输保障

一般消息中间件的消息传输保障分为三个层级

  1. At most once:最多一次。消息可能会丢失,但绝不会重复传输。
  2. At least once:最少一次。消息绝不会丢失,但可能会重复传输。
  3. Exactly once:恰好一次。每条消息肯定会被传输一次且仅传输一次。

RabbitMq支持”最多一次“和”最少一次“

24.多租户

虚拟主机(vhost):每一个RabbitMq服务器都能创建虚拟的消息服务器。每一个vhost本质上是一个独立的小型RabbitMq服务器,拥有自己独立的队列,交换器及绑定关系等,并且它拥有自己独立的权限。
RabbitMq里,权限规则是以vhost为单位的。

25.RabbitMq定制化

RabbitMq提供了三种方式来定制化服务

  1. 环境变量:shell环境中设置,或rabbitmq-env.conf配置文件
  2. 配置文件:rabbitmq.config
    配置加密,默认的Hash算法是SHA512
  3. 运行时参数和策略
    RabbitMq中一共有两种类型的Parameter:vhost级别的Parameter和global级别的Parameter。

26.RabbitMq集群

集群的所有节点都会备份所有的元数据信息:

  1. 队列元数据:队列的名称及属性
  2. 交换器:交换器的名称及属性
  3. 绑定关系元数据:交换器与队列或者交换器与交换器之间的绑定关系
  4. vhost元数据:为vhost内的队列、交换器和绑定提供命名空间及安全属性

99.其他

优化网络配置的一个重要目标就是提高吞吐量,比如禁用Nagle算法(主要用于减少延迟)、增大TCP缓冲区的大小。每个TCP连接都分配了缓冲区。一般来说,缓冲区越大,吞吐量也会越高,但是每个连接上耗费的内存也就越多,从而使总体服务的内存增大,这是一个权衡的问题。

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

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

相关文章

【论文解读】RLAIF基于人工智能反馈的强化学习

一、简要介绍 人类反馈强化学习(RLHF)可以有效地将大型语言模型(LLM)与人类偏好对齐,但收集高质量的人类偏好标签是一个关键瓶颈。论文进行了一场RLHF与来自人工智能反馈的RL的比较(RLAIF) -一种由现成的LLM代替人类标记偏好的技术,论文发现它们能带来相…

Spring MVC的常用注解

目录 RequestMapping 例子: RequestMapping 支持什么类型的请求 使 RequestMapping 只支持特定的类型 RestController 通过 HTTP 请求传递参数给后端 1.传递单个参数 注意使⽤基本类型来接收参数的情况 2.传递多个参数 3.传递对象 4.RequestParam 后端参数…

Haskell Stack编译cannot encode character ‘8226‘ 错误 (Win10)

文章目录 Haskell Stack编译cannot encode character 8226 错误解决方案 : 更改Windows语言和区域设置(locale setting)为支持UTF-18 Haskell Stack编译cannot encode character ‘8226’ 错误 解决方案 : 更改Windows语言和区域设置(locale setting)为支…

测开(自动化测试selenium(WebDriver API))

一个简单的 Web自动化 演示 百度一下 迪丽热巴。这样的一个用户行为 ,会涉及的那些操作呢?1、打开浏览器 2、在输入框里面输入关键词【迪丽热巴】PS:当然这里可能还涉及到一个操作,回车执行操作。或者说:点击 “百度一…

vue源码分析(四)——vue 挂载($mount)的详细过程

文章目录 前言一、使用RuntimeCompiler解析$mount的原因二、$mount 解析的详细过程1.解析挂载的#app执行了vm.$mount2. 通过$mount方法执行以下文件的mount方法3. 执行util工具文件夹中的query方法4. 执行query方法后返回$mount方法判断el是否是body5. 判断!options.render&…

Spring的执行流程与Bean的生命周期

目录 一、Spring的执行流程(生命周期) 二、Bean的生命周期 一、Spring的执行流程(生命周期) 首先在Spring的执行过程中会先启动容器,这里是将配置文件进行加载。根据配置文件完成Bean的实例化,比如是配置的…

通过cpolar分享本地电脑上有趣的照片:部署piwigo网页

通过cpolar分享本地电脑上有趣的照片:部署piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片:部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo 总结 前言 作为一个游戏爱好者,笔者在闲暇之余也会登录…

ChatGLM系列二:ChatGLM2的介绍及代码实践

一、介绍 2023年06月25日,清华大学开源了 ChatGLM2-6B 模型,是 ChatGLM 模型的升级版本。ChatGLM2-6B 在多个方面有显著提升:模型性能更强,在各种测试集上的表现更好;支持更长的上下文,最大上下文长度提升…

Java练习题2021-3

"某地大数据防疫平台记录了往来的所有防疫相关信息,包括 本地或外地人员、健康码颜色、接种疫苗情况、最近一次核酸结果、最近一次核酸检测时间等。 该地希望依据平台数据组织新一轮的疫苗接种,现有2针免疫的疫苗A和1针免疫的疫苗B。 对于本地人员&…

漏洞复现-Apache Druid 任意文件读取 _(CVE-2021-36749)

Apache Druid 任意文件读取 _(CVE-2021-36749) 漏洞信息 Apache Druid Version 0.22以下版本中存在安全漏洞CVE-2021-36749文件读取漏洞 描述 ​ 由于用户指定 HTTP InputSource 没有做出限制,可以通过将文件 URL 传递给 HTTP InputSourc…

氧化锌纳米线 Zinc oxide nanowires

氧化锌纳米线 英文:Zinc oxide nanowires 分子式:ZnO 直径: 50nm 长度: 20um 纯度: 99% 外观:白色 描述:纳米线可以被定义为一种具有在横向上被限制在100纳米以下(纵向没有限制)的一维结构。悬置纳米…

Builder 请进:波卡最新开发入门指南

撰文:Dennis Zoma 编译:OneBlock 社区 本文更新于 2023 年 10 月 3 日,来源:https://wiki.polkadot.network/docs/build-guide Polkadot 是一个区块链协议,有两个目标:在所有连接的平行链之间提供共享安全…

你绝对不知道的JMeter中如何实现接口之间的关联?

关联是Jmeter工具中非常重要的一个技术。因为在测试过程过有些数据是经常发生变化的,要获取并使用这些数据,就要使用关联。 比如:用户登录后,session信息都不同,有些操作要使用session,就需要将这个动态的信…

计算机网络_04_传输层

文章目录 1.什么是传输层2.传输层提供了什么服务3.传输层协议TCP 1.什么是传输层 传输层是OSI七层体系架构中的第四层, TCP/IP四层体系架构中的第二层, 从通信和信息处理两方面来看,“传输层”既是面向通信部分的最高层,与下面的三层一起共同构建进行网…

bootstap_小项目

通过bootstrap画一个简单的后台管理页面&#xff0c;知识有限&#xff0c;页面粗糙&#xff0c;一种记录方式 页面效果展示 首页页面代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible&qu…

Uva11059 Maximum Product(最大乘积)

1、题目 Uva 11059 2、题意 输入 n n n 个元素组成的序列 S S S&#xff0c;你需要找出一个乘积最大的连续子序列。如果这个最大的乘积不是正数&#xff0c;应输出0&#xff08;表示无解&#xff09;。 1 ≤ n ≤ 18 &#xff0c; − 10 ≤ S i ≤ 10 1 \le n \le 18&…

测试小白必看!接口测试必需掌握的知识要点!

接口测试 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 接口测试原理 通过测试程序模拟客…

SpringBoot中使用JdbcTemplate访问Oracle数据库

Oracle相信大家都不陌生吧&#xff0c;一个大型的数据库&#xff0c;至于数据库&#xff0c;我相信各位都比较熟悉了&#xff0c;一个软件系统&#xff0c;不论是我们常做的App、小程序、还是传统的web站点&#xff0c;我们都有用户的信息&#xff0c;相关业务的数据&#xff0…

公司如何禁止拷贝文件

公司如何禁止拷贝文件 安企神U盘管理系统下载使用 禁止拷贝文件是一种数据安全措施&#xff0c;通常在企业中用于保护重要信息和知识产权。禁止拷贝文件的方法需要根据公司的实际情况来选择和实施&#xff0c;以下是一些常见的方法&#xff0c;可用于防止文件拷贝&#xff1a…

Splunk 之 filed 恢复

1: 背景&#xff1a; 我们在工作过程中&#xff0c;或者是和很多team 进行交互的时候&#xff0c;总会有 filed 共用的情况&#xff0c;还有就是filed 会被相同权限的同事删除等等&#xff0c;这种情况下&#xff0c;就要求做好 /opt/splunk/etc/apps 的备份工作。 如果知道原…