RabbitMQ 消息队列:队列的参数与消息的属性

队列的参数即声明Queues时的Arguments。 消息的属性即向Exchange发布消息时的Properties。 Queues Arguments Message TTL 消息的存活时间,写入队列后被消费前可以存活的时间单位毫秒,通过x-message-ttl属性设置。 Auto expire 队列的存活时间,指定时间内没有consumer或get方式请求队列消息则会自动删除,通过x-expires属性设置。 Dead letter exchange 死信消息的exchange,通过x-dead-letter-exchange属性设置。 Dead letter routing key 死信消息的路由键,通过x-dead-letter-routing-key属性设置。 Maximum priority 消息支持的最大优先级,可实现优先级消息队列,通过x-max-priority属性设置。 Max length 队列的最大消息数,通过x-max-length属性设置。 Max length bytes 队列的消息的最大字节数,通过x-max-length-bytes属性设置。 Lazy mode 懒惰队列模式,将队列内容移动到磁盘上,当消息者请求时加载入内存,这样可以支持非常长的队列,通过x-queue-mode属性设置。 Master locator 在RabbitMQ的高可用镜像模式中,队列消息首先会写入主节点再依次备份至从节点,通过x-queue-master-locator属性设置队列的主节点选择策略。 选择承担主节点最少的节点min-masters 选择声明队列客户端连接到的节点client-local 随机挑选一个节点random 死信相关 当消息满足以下三种情况之一时会当做死信来处理: 消息被拒绝 (basic.reject or basic.nack) 消息未消费超时 超出队列长度限制 队列最大长度相关 通过x-max-length、x-max-length-bytes来设置队列的最大长度。一个可以控制队列消息的个数,一个可以控制队列占用的空间。如果两个都设置任何一个触发都会执行队列溢出行为,默认的队列溢出后会从队列头开始丢弃消息或进行死信处理。通过x-overflow可以设置队列溢出后的行为,值为drop-head(默认值)或reject-publish(拒绝新消息)。 Message Properties 属性 说明 content_type MIME类型 content_encoding MIME编码 priority 消息优先级 correlation_id 业务应用关联标识 reply_to 回复队列名称 expiration 过期时间 message_id 业务应用消息标识 timestamp 消息写入时间戳 type 消息类型 user_id 用户id app_id 应用id cluster_id 集群id

January 31, 2018 · 1 min · 76 words · Nick

RabbitMQ 消息队列:浅谈

简介 消息队列用来解决不同项目间通信、业务解耦。消息队列有很多种比如用Redis实现的轻量级消息队列。RabbitMQ是消息队列的一种,基于AMQP协议,用Erlang语言编写,属于一种消息队列中间件。 消息机制 Connection 链接 真实的TCP链接 Channel 信道 基于Connection创建的Channel,所有的数据传输都是基于Channel的。大家都知道TCP链接需要三次握手,业务频繁每次开TCP链接对性能也会有不小的损耗,TCP链接数也有限制。Channel的存在主要是为了复用TCP链接。 Exchange 交换机 消息生产者生产的所有消息都会先写入Exchange中,再路由到Queues中,如果Exchange没有绑定或未匹配到Queues则消息会被丢弃。 Queues 队列 生产者生产的消息会从Exchange中路由到Queues中,消费者从Queues中消费消息。 Binding 绑定 Binding将Exchange与Queues关联起来。 Routing key 路由键 路由键是消息从Exchange进入到某个Queues的规则。 在将Queues绑定至Exchange时会设置消息从Exchange路由至Queues的绑定路由键规则。 在将消息写入Exchange时会附带消息的路由键。 Exchange类型为direct或topic时,消息的投递会根据消息的路由键和绑定的路由键进行匹配,Exchange将消息投递给所有匹配上的Queues。 路由键写法 路由键可以由. 进行分隔,如computer.mac或computer.win。 路由键还支持通配符来模糊匹配,*与# *匹配一个分隔的单词 #匹配多个或零个分隔的单词 应用举例 Exchange Routing key Queues X *.*.imac apple X apple.# apple X *.phone.* phone 此时写入一条消息路由键为apple.phone.iphone4会被投递到队列apple与phone。 再写入一条消息路由键为apple.computer.imac仅会被投递到apple,此时apple队列匹配了两个路由键,但是也只会投递到apple一次。 再写入一条消息路由键为micro.computer.win因为没有匹配的路由键队列该消息会被丢弃。 Exchange Types 交换机类型 fanout 广播 fanout类型的Exchange会无视路由键,将消息投递给所有绑定到该Exchange上的Queues。 direct 单播 direct类型的Exchange会将消息投递给路由键完全匹配的Queues中。 topic 组播 topic类型的Exchange会将消息投递给路由键模糊匹配的Queues中。 headers headers类型的Exchange也会无视路由键,会根据headers中的属性来进行匹配。该类型应用较少,不过在RabbitMQ内部还是有使用。

December 28, 2017 · 1 min · 62 words · Nick