简介
介绍
RabbitMQ 是一个由 erlang 开发的基于 AMQP(Advanced Message Queue)协议的开源实现。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面都非常的优秀,是当前最主流的消息中间件之一。RabbitMQ 官网:http://www.rabbitmq.com
AMQP
AMQP 是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,同样,消息使用者也不用知道发送者的存在。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
系统架构
消息队列的使用过程大概如下:
- 客户端连接到消息队列服务器,打开一个 channel;
- 客户端声明一个 exchange,并设置相关属性;
- 客户端声明一个 queue,并设置相关属性;
- 客户端使用 routing key,在 exchange 和 queue 之间建立好绑定关系;
- 客户端投递消息到 exchange,exchange 接收到消息后,就根据消息的 key 和已经设置的 binding,进行消息路由,将消息投递到一个或多个队列里。
如上图所示:AMQP 里主要说两个组件,Exchange 和 Queue。绿色的X就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型。
如上图所示:AMQP 里主要说两个组件,Exchange 和 Queue。绿色的X就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 Producer 和 Consumer 两种类型。
几个概念
- P: 为 Producer,数据的发送方;
- C:为 Consumer,数据的接收方;
- Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列;
- Queue:消息队列载体,每个消息都会被投入到一个或多个队列;
- Binding:绑定,它的作用就是把 exchange 和 queue 按照路由规则绑定起来;
- Routing Key:路由关键字,exchange 根据这个关键字进行消息投递;
- vhost:虚拟主机,一个 broker 里可以开设多个 vhost,用作不同用户的权限分离;
- channel:消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel 代表一个会话任务。
属性说明
spring cloud 通用的绑定配置和属性,请看 Spring Cloud Stream说明文档。
Binder属性
默认情况下,RabbitMQ的binder使用Spring Boot的ConnectionFactory。因此,它支持Spring Boot所有的RabbitMQ配置。这些配置都以spring.rabbitmq
开头(详见Spring Boot说明文档)。
除了Spring Boot的属性,binder还有一些附加的属性:
spring.cloud.stream.rabbit.binder.adminAddresses
配置rabbitmq的管理页面地址,有多个时以逗号分隔;且必须与spring.rabbitmq.addresses
一一对应。当你使用的是RabbitMQ集群时,该属性用于定位队列所在的节点,提高效率。更多说明请看Queue Affinity and the LocalizedQueueConnectionFactory
默认值:空。
注意:
如果有exclusive队列(没指定group),不要配置这个属性,否则会报错。
spring.cloud.stream.rabbit.binder.nodes
RabbitMQ的节点列表,以逗号分隔。与管理页面的node列表一致。当你使用的是RabbitMQ集群时,该属性用于定位队列所在的节点,提高效率。更多说明请看Queue Affinity and the LocalizedQueueConnectionFactory
注意:
如果有exclusive队列(没指定group),不要配置这个属性,否则会报错。
例子:
# RabbitMQ properties
spring:
rabbitmq:
addresses: rmq-node1:5672,rmq-node2:5672
username: guest
password: guest
virtual_host: /
ssl:
enable: false
keyStore:
keyStorePassphrase:
trustStore:
trustStorePassphrase:
channelCacheSize: 100
cloud:
stream:
rabbit:
binder:
admin-addresses: http://rmq-node1:15672,http://rmq-node2:15672
nodes: rabbit@rmq-node1,rabbit@rmq-node2
spring.cloud.stream.rabbit.binder.compressionLevel
压缩绑定的压缩级别。见java.util.zip.Deflater。
默认值:1(BEST_LEVEL)。
spring.cloud.stream.binder.connection-name-prefix
客户端连接名前缀。前缀后会加上一个数字,每次建立连接时会+1。
默认值: none (Spring AMQP default).
消费者属性
下面的属性都必须添加前缀:
spring.cloud.stream.rabbit.bindings.<channelName>.consumer.
对于绑定的默认设置,可以这么配置:
spring.cloud.stream.rabbit.default.<property>=<value>
具体的配置会覆盖默认配置。
acknowledgeMode
确认模式。
默认值:AUTO。
anonymousGroupPrefix
如果绑定没有指定group
属性,会创建一个自动删除的队列,绑定到目标exchange。该队列的默认命名策略为anonymous.<base64 representation of a UUID>
。通过这个属性可以修改缀。
默认值: anonymous.
spring cloud有自己的默认值。
autoBindDlq
是否自动声明DLQ并将其绑定到绑定器DLX。
默认值:false。
bindingRoutingKey
将队列绑定到交换机的路由密钥(如果bindQueue为true)。可以设置多个值,分隔符通过bindingRoutingKeyDelimiter
属性设置。对于分区的destination,会给每个密钥加上-<instanceIndex>
默认值:#。
bindingRoutingKeyDelimiter
如果bindingRoutingKey
有多个时,通常设置为逗号。
默认值: null.
bindQueue
是否声明队列并绑定到目的地交换机。如果您先前已经创建/绑定了队列,请设置为false。
默认值:true。
consumerTagPrefix
用于创建消费者的tag。后面会跟上一个数据,消息者每次创建都会+1。
例子:
${spring.application.name}-${spring.cloud.stream.bindings.input.group}-${spring.cloud.stream.instance-index}.
默认埴: none - 创建一个随机tag
containerType
指定listener的容器类型。更多说明请看Spring AMQP文档。
默认值: simple
deadLetterQueueName
列信队列的名称。
默认值: prefix+destination.dlq
deadLetterExchange
死信队列的exchange名称. 需要autoBindDlq 为 true.
默认值: ‘prefix+DLX’
deadLetterExchangeType
死信队列的exchange的类型。需要autoBindDlq 为 true.
默认值: ‘direct’
deadLetterRoutingKey
死信队列的路由key。需要autoBindDlq 为 true.
默认值: destination
declareDlx
是否为destination声明死信exchange。需要autoBindDlq 为 true.
默认值: true.
declareExchange
是否为destination声明exchange。
默认值: true.
delayedExchange
是否将exchange 声明为Delayed Message Exchange - 需要在代理上安装延迟的消息exchange插件。x-delayed-type参数设置为exchangeType。
默认值:false。
dlqBindingArguments
死信队列绑定到exchange时,添加参数。
默认值:空。
dlqDeadLetterExchange
如果DLQ被声明,则将DLX分配给该队列
默认值:none
dlqDeadLetterRoutingKey
如果DLQ被声明,则会将一个死信路由密钥分配给该队列;
默认值:none
dlqExpires
未使用的死信队列被删除多久(ms)
默认值:no expiration
dlqLazy
使用x-queue-mode=lazy
声明队列,详见"Lazy Queues"。建议使用policy代替这个参数。
将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
默认值: false.
dlqMaxLength
死信队列中的最大消息数
默认值:no limit
dlqMaxLengthBytes
死信队列中的所有消息的最大字节数总和
默认值:no limit
dlqMaxPriority
死信队列中消息的最大优先级(0-255)
队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
默认值:none
dlqOverflowBehavior
当dlqMaxLength
或dlqMaxLengthBytes
被超过时所采取的操作。可选值drop-head
或 reject-publish
。
默认值:none
dlqQuorum.enabled
如果为true,创建quorum类型的死信队列。
quorum机制指,集群中,只要大部分的镜像更新成功,则表示更新成功。是强一致的一种优化。
默认值:false。
dlqQuorum.deliveryLimit
当dlqQuorum.enabled=true
时,消息投递入死信队列的次数限制。需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
dlqQuorum.initialQuorumSize
当dlqQuorum.enabled=true
时,初始quorum值,需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
dlqSingleActiveConsumer
只允许一个活跃的消费者,同x-single-active-consumer
属性。需要同时设置requiredGroups
属性。
默认值:false。
dlqTtl
死信的生存时间(ms)。需要同时设置requiredGroups
属性。
默认值:no limit
exchangeAutoDelete
如果为true,当exchange的队列都销毁时,自动删除该exchange。
默认值: true.
exchangeDurable
exchange是否持久化。
默认值: true.
exchangeType
exchange类型。
非分布式:direct
, fanout
, headers
, topic
分布式:direct
, headers
, topic
默认值: topic.
expires
队列不再使用时,多久会被删除(ms)。需要同时设置requiredGroups
属性。
默认值: no expiration
headerPatterns
出去的消息要带上的header。
默认值: [’*’] (所有).
lazy
将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
使用x-queue-mode=lazy
声明队列,详见"Lazy Queues"。建议使用policy代替这个参数,修改时不需要删除队列。需要同时设置requiredGroups
属性。
默认值: false.
maxConcurrency
最大并行消费者。containerType 为 direct不生效。
默认填:1
maxLength
队列的最大消息数量。
默认值:no limit
maxLengthBytes
队列中的所有消息的最大字节数总和
默认值:no limit
maxPriority
队列中消息的最大优先级(0-255)
队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
默认值:none
missingQueuesFatal
队列找不到时,是否停止listner。默认是false,继续尝试消费。
默认值: false.
overflowBehavior
当dlqMaxLength
或dlqMaxLengthBytes
被超过时所采取的操作。可选值drop-head
或 reject-publish
。
默认值:none
prefetch
预先获取的数量
默认值:1
prefix
destination 和 queue的前缀。
默认值:""
queueBindingArguments
队列绑定到exchange时,添加参数。
默认值:空。
queueNameGroupOnly
只使用group的名字作为队列的名字,否则是destination.group
。当使用已经有的队列消费时,这个属性会有用。
默认值:false
quorum.enabled
如果为true,创建quorum类型的队列。
默认值:false。
quorum.deliveryLimit
当quorum.enabled=true
时,消息投递失败的重试次数限制。需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
quorum.initialQuorumSize
当quorum.enabled=true
时,初始quorum值。
默认值: none - 由broker 决定
recoveryInterval
连接失败重试的间隔,ms。
默认值:5000
requeueRejected
当禁止重试 或 republishToDlq = false时,投递失败时是否重新入列。
默认值:false
republishDeliveryMode
当republishToDlq=true时,重新投递消息时使用的模式。
默认值:DeliveryMode.PERSISTENT
republishToDlq
默认的情况下,投递失败的消息在超过重试次数后会被拒绝。如果配置了死信队列,此属性为false时,失败的消息会原样发送的死信队列,并带上x-death头;如果这个属性为true,消息会在header中带上异常信息,没有x-death头。
默认值:true
singleActiveConsumer
表示队列是否是单一活动消费者,true时,注册的消费组内只有一个消费者消费消息,其他被忽略,false时消息循环分发给所有消费者
默认值:false
transacted
是否使用事务
默认值:false
ttl
队列的生存时间(ms)。
默认值:no limit
txSize
两次确认之间的投递数。
默认值:1
生产者属性
下面的属性都必须添加前缀:
spring.cloud.stream.rabbit.bindings.<channelName>.producer.
对于绑定的默认设置,可以这么配置:
spring.cloud.stream.rabbit.default.<property>=<value>
具体的配置会覆盖默认配置。
autoBindDlq
是否自动声明并绑定死信队列。
默认值:false
batchingEnabled
是否启用批量消息功能。
batchSize
批量消息数量。
默认值:100
batchBufferLimit
批量消息缓存大小
默许值:10000
batchTimeout
批处理超时时间。
默认值:5000
bindingRoutingKey
路由key,可以配置多个。如果是分布式destination,每个key后会加上-n
。需要同时配置requiredGroups
属性。
默认值:#
bindingRoutingKeyDelimiter
路由key的分隔符。需要同时配置requiredGroups
属性。
默认值:null
bindQueue
是否声明并绑定队列。需要同时配置requiredGroups
属性。
默认值:true
compress
发送消息时是否压缩。
默认值:false
confirmAckChannel
如果errorChannelEnabled=true,一个channel来发送投递结果。如果channel不存在,则会新注册一个DirectChannel
,名称为这个属性值。 Connection factory 必须开启发布确认功能。
和useConfirmHeader
属性不能同时设置。
默认值:nullChannel(确认消息会被忽略)
deadLetterQueueName
死信队列名称,需要同时配置requiredGroups
属性。
默认值: prefix+destination.dlq
deadLetterExchange
队列的DLX,autoBindDlq必须为true,需要同时配置requiredGroups
属性。
默认值: ‘prefix+DLX’
deadLetterExchangeType
队列的DLX类型,autoBindDlq必须为true,需要同时配置requiredGroups
属性。
默认值: ‘direct’
deadLetterRoutingKey
队列的DLX路由key,autoBindDlq必须为true,需要同时配置requiredGroups
属性。
默认值:destination
declareDlx
是否声明dlx。autoBindDlq必须为true,需要同时配置requiredGroups
属性。
默认值:false
declareExchange
是否声明exchange
默认值:true
delayedExchange
是否是延迟exchange。
默认值:false
delayExpression
消息的 延迟值,SpEL表达式,
默认值:无
deliveryMode
消息投递模式。
默认值:PERSISTENT
dlqBindingArguments
死信队列绑定到exchange时要带的参数。
默认值: 空
dlqDeadLetterExchange
DLQ的DLX。需要同时配置requiredGroups
属性。
默认值:none
dlqDeadLetterRoutingKey
DLQ的路由key。需要同时配置requiredGroups
属性。
dlqExpires
未使用的死信队列被删除多久(ms)。需要同时配置requiredGroups
属性。
默认值:no expiration
dlqLazy
使用x-queue-mode=lazy
声明队列,详见"Lazy Queues"。建议使用policy代替这个参数。
将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
需要同时配置requiredGroups
属性。
默认值: false.
###dlqMaxLength
死信队列中的最大消息数
需要同时配置requiredGroups
属性。
默认值:no limit
dlqMaxLengthBytes
死信队列中的所有消息的最大字节数总和
需要同时配置requiredGroups
属性。
默认值:no limit
dlqMaxPriority
死信队列中消息的最大优先级(0-255)
队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
需要同时配置requiredGroups
属性。
默认值:none
dlqQuorum.enabled
如果为true,创建quorum类型的死信队列。
quorum机制指,集群中,只要大部分的镜像更新成功,则表示更新成功。是强一致的一种优化。
默认值:false。
dlqQuorum.deliveryLimit
当dlqQuorum.enabled=true
时,消息投递入死信队列失败的次数限制。需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
dlqQuorum.initialQuorumSize
当dlqQuorum.enabled=true
时,初始quorum值,需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
dlqSingleActiveConsumer
只允许一个活跃的消费者,同x-single-active-consumer
属性。需要同时设置requiredGroups
属性。
默认值:false。
dlqTtl
死信的生存时间(ms)。需要同时设置requiredGroups
属性。
默认值:no limit
exchangeAutoDelete
如果为true,当exchange的队列都销毁时,自动删除该exchange。
默认值: true.
exchangeDurable
当declareExchange 为true时,创建的exchange是否是持久化的(重启不消失)。
默认值: true.
exchangeType
exchange类型。
非分布式:direct
, fanout
, headers
, topic
分布式:direct
, headers
, topic
默认值: topic.
expires
默认值: no expiration
队列不再使用时,多久会被删除(ms)。需要同时设置requiredGroups
属性。
headerPatterns
出去的消息要带上的header。
默认值: [’*’] (所有).
lazy
将队列设置为延迟模式,在磁盘上保留尽可能多的消息,以减少RAM的使用;如果未设置,队列将保留内存缓存以尽可能快地传递消息;
使用x-queue-mode=lazy
声明队列,详见"Lazy Queues"。建议使用policy代替这个参数,修改时不需要删除队列。需要同时设置requiredGroups
属性。
默认值: false.
maxLength
队列的最大消息数量。
默认值:no limit
maxLengthBytes
队列中的所有消息的最大字节数总和
默认值:no limit
maxPriority
队列中消息的最大优先级(0-255)
队列要支持的最大优先级数;如果未设置,队列将不支持消息优先级;
默认值:none
prefix
exchange名称的前缀。
默认值:"".
queueBindingArguments
队列绑定到exchange时,添加参数。
默认值:空。
queueNameGroupOnly
只使用group的名字作为队列的名字,否则是destination.group
。当使用已经有的队列消费时,这个属性会有用。
默认值:false
quorum.enabled
如果为true,创建quorum类型的队列。
默认值:false。
quorum.deliveryLimit
当quorum.enabled=true
时,消息投递失败的重试次数限制。需要同时设置requiredGroups
属性。
默认值: none - 由broker 决定
quorum.initialQuorumSize
当quorum.enabled=true
时,初始quorum值。
默认值: none - 由broker 决定
routingKeyExpression
使用一个SpEL表达式,指定发布的消息使用哪个路由key。如果是固定的key,在properties 文件中配置routingKeyExpression='my.routingKey'
;在yaml文件中则是routingKeyExpression: '''my.routingKey'''
默认值: destination,分布式环境是destination-< partition >
singleActiveConsumer
只允许一个活跃的消费者,同x-single-active-consumer
属性。需要同时设置requiredGroups
属性。
默认值:false。
transacted
是否使用事务
默认值:false。
ttl
队列的生存时间(ms)。
默认值:no limit
useConfirmHeader
发送成功确认。与confirmAckChannel
互斥。