这里对各个组件的参数进行详解,可能前面有提到过,这里做一个汇总
交换机
在创建交换机的时候用到建造者类ExchangeBuilder,会创建四种交换机
Direct Exchange
直连交换机是 RabbitMQ 中最简单的交换机类型之一。它的工作方式非常简单:它将消息的路由键(Routing Key)与绑定到交换机上的队列的路由键进行精确匹配,然后将消息发送到与之匹配的队列中。
特点
-
路由键与队列的精确匹配:当消息的路由键与绑定队列的路由键完全匹配时,消息才会被发送到相应的队列中。
-
一对一或一对多:Direct Exchange 可以实现一对一的消息传递,也可以实现一对多的消息传递。当多个队列都与交换机绑定,并且绑定的路由键与消息的路由键匹配时,消息会被发送到多个队列中。
-
简单快速:Direct Exchange 是 RabbitMQ 中最简单和最快速的交换机类型之一。它只需要进行简单的路由键匹配即可将消息发送到相应的队列中,无需复杂的逻辑处理。
应用场景
在实际应用中,Direct Exchange 可以用于实现点对点的通信,例如发送订单消息、日志消息等。只需要指定接收消息的队列和消息的路由键,消息就可以直接被发送到相应的队列中,非常适合于一些简单的场景。
Fanout Exchange
扇形交换机是 RabbitMQ 中的一种常见的交换机类型之一。它的工作方式非常简单:将所有发送到该交换机的消息广播到所有与之绑定的队列中,不考虑消息的路由键。
特点
-
消息广播:Fanout Exchange 将所有发送到该交换机的消息广播到所有与之绑定的队列中,无需进行路由键匹配。因此,所有绑定到该交换机的队列都会收到相同的消息。
-
无需路由键匹配:Fanout Exchange 不考虑消息的路由键,因此无需进行路由键匹配。只要队列绑定到了该交换机,就会接收到所有发送到该交换机的消息。
-
一对多:Fanout Exchange 可以实现一对多的消息传递。当多个队列都与该交换机绑定时,所有队列都会收到相同的消息。
应用场景
Fanout Exchange 通常用于需要广播消息的场景,例如发布/订阅模式下的消息通知、日志记录等。通过使用 Fanout Exchange,可以简单快速地将消息广播到所有相关的队列中,实现消息的全局广播。
Topic Exchange
主题交换机是 RabbitMQ 中一种灵活且强大的交换机类型之一。它与 Direct Exchange 类似,但是在路由键与队列的绑定上更加灵活。
Topic Exchange 的工作方式是根据消息的路由键和交换机与队列的绑定模式进行匹配,将消息发送到与之匹配的队列中。Topic Exchange 使用通配符 *
和 #
进行模糊匹配,使得可以根据消息的路由键进行更加灵活的匹配。
Topic Exchange 的匹配规则如下:
*
(星号)可以匹配一个单词,例如test.*
可以匹配test.a
、test.b
,但不能匹配test.a.b
。#
(井号)可以匹配零个或多个单词,例如test.#
可以匹配test.a
、test.a.b
、test.a.b.c
等。
特点
-
灵活的路由键匹配 :Topic Exchange 可以根据消息的路由键进行灵活的匹配,通过使用通配符
*
和#
可以实现更加灵活的匹配规则。 -
支持多对多:Topic Exchange 可以实现多对多的消息传递,即多个交换机可以绑定到多个队列,消息可以根据不同的路由键被发送到不同的队列中。
-
高级的路由策略 :通过合理使用通配符
*
和#
,可以实现复杂的路由策略,满足不同场景下的需求。
应用场景
Topic Exchange 通常用于需要根据消息的内容进行灵活路由的场景,例如新闻分类、产品订阅、事件通知等。通过使用 Topic Exchange,可以实现灵活的消息路由和过滤,提高系统的灵活性和可扩展性。
Headers Exchange
头交换机是 RabbitMQ 中一种根据消息头部信息进行路由的交换机类型。与 Direct Exchange 和 Topic Exchange 不同,Headers Exchange 不是根据路由键进行匹配,而是根据消息的头部信息进行匹配。
Headers Exchange 的工作方式是根据消息的头部信息和绑定队列时指定的键值对进行匹配,将消息发送到与之匹配的队列中。在绑定队列时,可以指定一组键值对,当消息的头部信息与指定的键值对完全匹配时,消息才会被发送到相应的队列中。
特点
-
根据消息头部信息进行匹配:Headers Exchange 不考虑消息的路由键,而是根据消息的头部信息进行匹配。只有当消息的头部信息与绑定队列时指定的键值对完全匹配时,消息才会被发送到相应的队列中。
-
灵活的匹配规则:通过合理设置消息的头部信息和绑定队列时指定的键值对,可以实现灵活的匹配规则,满足不同场景下的需求。
-
支持复杂的路由策略: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 参数用于指定消息发送到死信队列时的路由键。这个参数可以帮助我们对死信消息进行更加精细的路由和处理。