RabbitMQ各组件参数详解(9)

这里对各个组件的参数进行详解,可能前面有提到过,这里做一个汇总

交换机

在创建交换机的时候用到建造者类ExchangeBuilder,会创建四种交换机

Direct Exchange

直连交换机是 RabbitMQ 中最简单的交换机类型之一。它的工作方式非常简单:它将消息的路由键(Routing Key)与绑定到交换机上的队列的路由键进行精确匹配,然后将消息发送到与之匹配的队列中。

特点
  1. 路由键与队列的精确匹配:当消息的路由键与绑定队列的路由键完全匹配时,消息才会被发送到相应的队列中。

  2. 一对一或一对多:Direct Exchange 可以实现一对一的消息传递,也可以实现一对多的消息传递。当多个队列都与交换机绑定,并且绑定的路由键与消息的路由键匹配时,消息会被发送到多个队列中。

  3. 简单快速:Direct Exchange 是 RabbitMQ 中最简单和最快速的交换机类型之一。它只需要进行简单的路由键匹配即可将消息发送到相应的队列中,无需复杂的逻辑处理。

应用场景

在实际应用中,Direct Exchange 可以用于实现点对点的通信,例如发送订单消息、日志消息等。只需要指定接收消息的队列和消息的路由键,消息就可以直接被发送到相应的队列中,非常适合于一些简单的场景。

Fanout Exchange

扇形交换机是 RabbitMQ 中的一种常见的交换机类型之一。它的工作方式非常简单:将所有发送到该交换机的消息广播到所有与之绑定的队列中,不考虑消息的路由键。

特点
  1. 消息广播:Fanout Exchange 将所有发送到该交换机的消息广播到所有与之绑定的队列中,无需进行路由键匹配。因此,所有绑定到该交换机的队列都会收到相同的消息。

  2. 无需路由键匹配:Fanout Exchange 不考虑消息的路由键,因此无需进行路由键匹配。只要队列绑定到了该交换机,就会接收到所有发送到该交换机的消息。

  3. 一对多:Fanout Exchange 可以实现一对多的消息传递。当多个队列都与该交换机绑定时,所有队列都会收到相同的消息。

应用场景

Fanout Exchange 通常用于需要广播消息的场景,例如发布/订阅模式下的消息通知、日志记录等。通过使用 Fanout Exchange,可以简单快速地将消息广播到所有相关的队列中,实现消息的全局广播。

Topic Exchange

主题交换机是 RabbitMQ 中一种灵活且强大的交换机类型之一。它与 Direct Exchange 类似,但是在路由键与队列的绑定上更加灵活。

Topic Exchange 的工作方式是根据消息的路由键和交换机与队列的绑定模式进行匹配,将消息发送到与之匹配的队列中。Topic Exchange 使用通配符 *# 进行模糊匹配,使得可以根据消息的路由键进行更加灵活的匹配。

Topic Exchange 的匹配规则如下:

  • *(星号)可以匹配一个单词,例如 test.* 可以匹配 test.atest.b,但不能匹配 test.a.b
  • #(井号)可以匹配零个或多个单词,例如 test.# 可以匹配 test.atest.a.btest.a.b.c 等。
特点
  1. 灵活的路由键匹配:Topic Exchange 可以根据消息的路由键进行灵活的匹配,通过使用通配符 *# 可以实现更加灵活的匹配规则。

  2. 支持多对多:Topic Exchange 可以实现多对多的消息传递,即多个交换机可以绑定到多个队列,消息可以根据不同的路由键被发送到不同的队列中。

  3. 高级的路由策略:通过合理使用通配符 *#,可以实现复杂的路由策略,满足不同场景下的需求。

应用场景

Topic Exchange 通常用于需要根据消息的内容进行灵活路由的场景,例如新闻分类、产品订阅、事件通知等。通过使用 Topic Exchange,可以实现灵活的消息路由和过滤,提高系统的灵活性和可扩展性。

Headers Exchange

头交换机是 RabbitMQ 中一种根据消息头部信息进行路由的交换机类型。与 Direct Exchange 和 Topic Exchange 不同,Headers Exchange 不是根据路由键进行匹配,而是根据消息的头部信息进行匹配。

Headers Exchange 的工作方式是根据消息的头部信息和绑定队列时指定的键值对进行匹配,将消息发送到与之匹配的队列中。在绑定队列时,可以指定一组键值对,当消息的头部信息与指定的键值对完全匹配时,消息才会被发送到相应的队列中。

特点
  1. 根据消息头部信息进行匹配:Headers Exchange 不考虑消息的路由键,而是根据消息的头部信息进行匹配。只有当消息的头部信息与绑定队列时指定的键值对完全匹配时,消息才会被发送到相应的队列中。

  2. 灵活的匹配规则:通过合理设置消息的头部信息和绑定队列时指定的键值对,可以实现灵活的匹配规则,满足不同场景下的需求。

  3. 支持复杂的路由策略:Headers Exchange 支持根据消息头部信息进行复杂的路由策略,可以根据消息的头部信息进行精确匹配或者模糊匹配。

应用场景

Headers Exchange 通常用于根据消息的头部信息进行复杂的路由和过滤,例如根据消息的属性、类型、来源等进行路由。通过使用 Headers Exchange,可以实现灵活的消息路由和过滤,提高系统的灵活性和可扩展性。

参数设置

alternate

设置备份交换机,当消息无法被路由到任何队列时,会被发送到备份交换机中。这样可以确保消息不会被丢失。备份交换机通常是另一个交换机,用于处理未被路由的消息。

durable

是一个用于设置交换机或队列是否持久化的参数。当 durable 被设置为 true 时,表示交换机或队列是持久化的;当 durable 被设置为 false 时,表示交换机或队列是非持久化的。

持久化的交换机或队列会将其元数据保存到磁盘上,即使 RabbitMQ 服务器重启或宕机,也不会丢失这些交换机或队列的定义信息。而非持久化的交换机或队列只会存在于内存中,如果 RabbitMQ 服务器重启或宕机,这些交换机或队列的定义信息会丢失。

当需要确保交换机或队列的定义信息不会丢失时,可以将 durable 设置为 true,以提高消息系统的可靠性和持久性。但需要注意的是,将交换机或队列设置为持久化会增加系统的 IO 开销,对性能可能会产生一定的影响。

autoDelete

是一个用于设置交换机或队列是否在所有绑定的队列都与其解绑时自动删除的参数。当 autoDelete 被设置为 true 时,表示交换机或队列在没有绑定的队列时会自动删除;当 autoDelete 被设置为 false 时,表示交换机或队列不会自动删除。

这个参数通常用于临时性的交换机或队列。例如,当一个消费者断开连接时,如果其绑定的队列是临时的,那么当这个队列没有消费者连接时,就会自动删除。这样可以帮助清理无用的交换机或队列,减少系统的资源占用。

delayed

在 RabbitMQ 中,延迟队列并不是直接支持的原生功能,但可以通过插件实现延迟消息的功能。一种常见的实现方式是使用插件 rabbitmq_delayed_message_exchange,该插件可以在 RabbitMQ 中创建一个支持延迟消息的交换机。

这个插件提供了一个特殊的交换机类型 x-delayed-message,它允许用户发送延迟消息并指定延迟的时间。当消息被发送到这个交换机时,消息并不会立即被路由到队列,而是根据消息的延迟时间进行延迟后再路由到队列。

要使用 rabbitmq_delayed_message_exchange 插件,首先需要安装和启用该插件。然后,可以通过声明一个 x-delayed-message 类型的交换机来创建一个支持延迟消息的交换机。接下来,将延迟交换机与需要延迟消息的队列进行绑定,并发送带有延迟时间的消息到这个交换机。

internal

在 RabbitMQ 中,internal 是用于声明交换机时的一个参数,用于指定交换机是否是内部的。当 internal 被设置为 true 时,表示交换机是内部的;当 internal 被设置为 false 时,表示交换机是外部的。

内部交换机只能被直接发送消息到指定的队列,而无法被其他交换机路由。这意味着,内部交换机不接受通过路由键进行消息传递,只能接受直接发送到交换机的消息。

通常情况下,内部交换机用于一些特殊的场景,例如 RabbitMQ 内部的一些系统交换机就是内部交换机。这些交换机通常用于一些系统级别的消息路由和处理,不对外部客户端暴露。

ignoreDeclarationExceptions

是 RabbitMQ 中创建队列或交换机时的一个可选参数,用于指定在声明队列或交换机时是否忽略已存在的同名队列或交换机的声明异常。

当 ignoreDeclarationExceptions 被设置为 true 时,如果已经存在同名的队列或交换机,则不会抛出异常,而是会忽略这个声明操作。这样可以避免因为重复声明队列或交换机而导致的异常,适用于一些无状态、幂等性的操作场景。

通常情况下,建议将 ignoreDeclarationExceptions 设置为 false,这样可以确保声明队列或交换机时能够及时发现潜在的问题,例如队列或交换机的属性配置错误或不一致等。这有助于提高系统的可靠性和稳定性

withArgument

是一种用于设置 RabbitMQ 中队列或交换机的参数的方法。通常,在声明队列或交换机时,可以通过 withArgument 方法来设置一些额外的参数,以满足特定的需求或实现特定的功能。

设置参数可以直接使用建造器ExchangeBuilder,withArgument不如建造器简单明了

队列

创建队列时通常使用QueueBuilder

参数设置

durable

将队列设置为持久化的(durable 设为 true),RabbitMQ 会将队列的元数据保存到磁盘上,以保证在 RabbitMQ 服务器重启时不会丢失这个队列的定义。这意味着即使 RabbitMQ 服务器重启或宕机,持久化队列也会被重新声明,不会丢失其中的消息。

nonDurable

将队列设置为非持久化的(durable 设为 false),队列的元数据只会保存在内存中。当 RabbitMQ 服务器重启时,非持久化队列的定义会被删除,其中的消息也会丢失。

ttl

队列中的每条消息在被投递到队列时,都会被赋予一个过期时间,如果消息在队列中的时间超过了设定的过期时间,则会被标记为过期消息

expires

expires 是指在声明队列时设置的一个参数,用于指定队列的过期时间。这个参数指定了队列的生存时间,即从队列创建开始计算的时间段。当队列的过期时间到达后,队列会被自动删除。

maxLength

maxLength 是用于设置队列的最大消息数量的参数。这个参数用于限制队列中可以存储的消息的最大数量。当队列中的消息数量达到最大限制时,新的消息将会被拒绝或被丢弃,取决于队列的溢出行为设置。 

autoDelete

autoDelete 是一个用于设置队列是否在所有消费者断开连接时自动删除的参数。当 autoDelete 被设置为 true 时,表示队列在没有任何消费者连接时会自动删除;当 autoDelete 被设置为 false 时,表示队列不会自动删除。

deadLetterExchange

deadLetterExchange 是用于设置死信队列的交换机的参数。死信队列(Dead Letter Queue,DLQ)用于存储无法被消费者成功处理的消息。当消息被拒绝、过期或者达到最大投递次数时,消息会被发送到死信队列中。

deadLetterExchange 参数用于指定死信队列的交换机,即当消息被发送到死信队列时,会使用的交换机。

 exclusive

exclusive 是一个用于设置队列是否是排他的参数。当 exclusive 被设置为 true 时,表示队列是排他的;当 exclusive 被设置为 false 时,表示队列不是排他的。

排他队列只能被声明它的连接使用,并且当连接关闭时,队列会被自动删除。这意味着排他队列对于特定连接是私有的,其他连接无法访问。

排他队列通常用于实现一些特定的场景,例如,当需要临时创建一个私有的队列,只有创建它的连接可以使用时,就可以使用排他队列。

lazy

lazy 不是队列声明时的标准参数。通常情况下,RabbitMQ 的队列和消息都是存储在内存中的,这样可以提高消息的传输速度。但是,当队列中的消息数量很大时,会消耗大量的内存资源。

如果你希望对于部分队列,消息只在被消费时才被加载到内存中,以节省内存资源,你可以使用 RabbitMQ 的插件 rabbitmq-lazy-queues。这个插件允许将队列设置为“延迟加载”的模式,即队列中的消息只有在被消费时才会被加载到内存中。

quorum

在 RabbitMQ 3.8 版本中引入了 Quorum 队列,这是一种全新的队列类型,旨在提供更高的可用性和数据安全性。

声明队列为 quorum队列

Quorum 队列具有以下特点:

  •  多主复制:Quorum 队列使用了多主复制机制,将数据复制到多个节点上。这样即使其中一个节点发生故障,数据仍然可以从其他节点恢复。
  • 选举机制:Quorum 队列使用选举机制来决定哪个节点是 leader 节点,负责接收客户端的写入操作。其他节点则作为 follower 节点,负责复制 leader 节点上的数据。
  • 数据一致性:Quorum 队列通过多数派选举和多数派提交来保证数据一致性。只有当数据被大多数节点确认提交后,才会认为写操作成功。
  • 持久化:Quorum 队列中的消息和元数据都是持久化的,确保消息不会丢失。

使用 Quorum 队列时,可以提供比传统的镜像队列(Mirrored Queue)更高的可用性和更好的性能,尤其在高负载和高并发的情况下表现更优秀。

maxPriority

maxPriority 是一个可选参数,用于设置队列支持的最大优先级数。当一个队列设置了 maxPriority 参数后,发送到这个队列的消息可以包含优先级属性,并且优先级的取值范围是从 0 到指定的最大优先级数。

优先级队列允许开发人员为消息指定优先级,使得 RabbitMQ 在处理消息时可以根据优先级来决定消息的处理顺序。通常情况下,优先级较高的消息会被优先处理,而优先级较低的消息则会在后续处理。

singleActiveConsumer

singleActiveConsumer 是一个用于设置队列是否只允许有一个消费者活跃消费的参数。当 singleActiveConsumer 被设置为 true 时,表示队列只允许有一个消费者处于活跃状态,其他消费者处于等待状态;当 singleActiveConsumer 被设置为 false 时,表示队列允许多个消费者同时处于活跃状态。

这个参数通常用于一些需要确保消息顺序处理的场景。当队列只允许有一个消费者处于活跃状态时,可以确保消息按照发送的顺序被消费,避免并发消费带来的顺序混乱问题。

deadLetterRoutingKey

deadLetterRoutingKey 是用于设置死信队列中消息的路由键的参数。死信队列(Dead Letter Queue,DLQ)用于存储无法被消费者成功处理的消息。当消息被拒绝、过期或者达到最大投递次数时,消息会被发送到死信队列中。

deadLetterRoutingKey 参数用于指定消息发送到死信队列时的路由键。这个参数可以帮助我们对死信消息进行更加精细的路由和处理。

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

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

相关文章

python基础知识—while和for循环(三)

🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 一:while循环1.1程序的三种执行流程1.2while循环1.3循环变量和死循环 二:for循环2.1for循环2.2range 一&…

安装crossover游戏提示容量不足怎么办 如何把游戏放到外置硬盘里 Mac电脑清理磁盘空间不足

CrossOver作为一款允许用户在非原生操作系统上运行游戏和应用程序的软件,为不同平台的用户提供了极大的便利。然而,随着游戏文件大小的不断增加,内置硬盘的容量往往无法满足安装需求。幸运的是,通过一些简单的步骤,我们…

Penpad 再获 Animoca Brands 投资,全新生态历程

Penpad 是 Scroll 生态的 LaunchPad & Yield Aggregator 平台,该平台近日在融资上取得了系列进展。据悉,Penpad 在前不久率先获得了来自于 Gate Labs 以及 Scroll 联合创始人 Sandy Peng 的融资,并且在近日,其又获得了来自于知…

LeetCode题目73:矩阵置零

作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。 会一些的技术:数据分析、算法、SQL、大数据相关、python 欢迎加入社区:码上找工作 作者专栏每日更新: LeetCode解锁1000题: 打怪升级之旅 python数据分析…

Amazon云计算AWS之[4]非关系型数据库服务SimpleDB和DynamoDB

文章目录 简介非关系型VS关系数据库SimpleDB域条目属性值SimpleDB的使用 DynamoDBSimpleDB VS DynamoDB 简介 非关系型数据库服务主要用于存储结构化的数据,并为这些数据提供查找、删除等基本的数据库功能。AWS中提供的非关系型数据库主要包括SimpleDB和DynamoDB …

(学习日记)2024.04.20:UCOSIII第四十八节:各文件功能概览

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

牛客网:S老师的公式 ← 取模运算

【题目来源】https://ac.nowcoder.com/acm/contest/76652/A【题目描述】 S 老师丢给你了一个简单的数学问题: 求 。 请你求出答案。【输入格式】 一行一个整数 n (1≤n≤10^6)。【输出格式】 一行一个整数表示答案。【说明】 例如,若n3,则本题…

设计模式-责任链模式(Chain of Responsibility Pattern)结构|原理|优缺点|场景|示例

设计模式(分类) 设计模式(六大原则) 创建型(5种) 工厂方法 抽象工厂模式 单例模式 建造者模式 原型模式 结构型(7种) 适配器…

对于C# 任务并行库(TPL)的一些理解

C# 的任务并行库(Task Parallel Library,TPL)是 .NET 框架的一个部分,它提供了一组丰富的API,旨在简化并行编程,使开发人员能够更容易地构建可以利用多核处理器优势的高性能应用程序。TPL 的设计目的是减少…

【redis】Redis数据类型(一)——String类型(包含redis通用命令)

目录 Redis通用命令String类型常用的操作命令一些特殊命令详解setnx示例使用 setrange示例 mset示例 msetnx示例 append示例 getset示例 incr示例使用1.计数器2.限速器 bitcount示例使用:使用 bitmap 实现用户上线次数统计性能 String类型String类型简介String类型的…

统一威胁情报如何赋能SOC应对复杂威胁?

安全运营中心(SOC)是组织网络安全战略的核心组成部分,扮演着至关重要的角色。其负责实时监控整个IT基础设施,以检测、响应和预防各类网络安全威胁。网络安全威胁日益复杂且多变的数字化时代,攻击平面泛化、基础设施复杂…

GET 和 POST 请求方式的区别

GET 和 POST 请求方式的区别 GET请求和POST请求在HTTP通信中有着不同的用途和限制。以下是两者之间的一些主要区别: URL可见性 GET请求的参数直接附加在URL后面,因此可以被用户看到POST请求的参数位于请求体中,对URL参数是不可见的 数据传输方…

C#技巧之窗体去鼠标化

简介 在窗体程序中不用鼠标,直接使用键盘完成想要的操作。 实现的方法有两种,一种是使用键盘上的Tab键使控件获得焦点,然后用enter键触发该控件上的事件(一般为click事件)。另一种是,为控件添加快捷键&am…

新手去做视频号小店常见的问题解答!全篇干货!建议收藏!

大家好,我是电商小V 视频号小店现在可以说是越来越火,在创业者的人群中被提及的次数也是越来越高,导致这种情况的原因就是,新项目,正处于红利期,现在去做是可以很轻易分到属于自己的一杯羹,就是…

Android 蓝牙无法发送或接收某些类型文件

Android 蓝牙应用使得用户能够在蓝牙设备之间进行文件传输。用户可以通过蓝牙连接两台设备,并在它们之间传输文件,如照片、音乐、视频等。这对于用户来说是非常便利的,无需使用数据线或互联网连接,可以直接在附近的设备之间进行文…

基于SpringBoot的“大学生社团活动平台”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“大学生社团活动平台”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统结构图 管理员登录界面图 管理员功能界…

C#基础|数组的使用、字符串的分隔与连接

哈喽,你好,我是雷工! 01 数组概念 数组是一个变量,用来存储“相同数据类型”的“一组数据”。 02 数组与普通变量的区别 声明一个变量,就是在内存空间分配一块儿合适的空间; 声明一个数组,就是在内存空间分配一串儿连续的空间。 03 数组基本要素 标识符:数组的名…

SpringCloud中网关-详解、案例(代码)

简介:在Spring Cloud中,网关的角色是非常重要的,它负责整个系统的入口流量,并且可以处理路由、过滤、协议转换等操作 目录 1、网关的技术实现 1.1 网关功能 1.2 网关的形式 2、网关实现步骤 2.1 添加相关依赖 2.2 创建此mod…

【算法刷题 | 贪心算法05】4.27(K次取反后最大化的数组和、加油站)

文章目录 8.K次取反后最大化的数组和8.1题目8.2解法:贪心8.2.1贪心思路8.2.2代码实现 9.加油站9.1题目9.2解法:贪心9.2.1贪心思路9.2.2代码实现 8.K次取反后最大化的数组和 8.1题目 给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数…

【深度学习-番外1】Win10系统搭建VSCode+Anaconda+Pytorch+CUDA深度学习环境和框架全过程

专栏的老读者们都知道,以前的文章以使用MATLAB的为多。 不过后续陆续开始展开深度学习算法的应用,就会逐渐引入Python语言了(当然MATLAB的代码也会同步更新),这是由于在深度学习领域,Python应用更为广泛。…