<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>RabbitMQ on Nick's Blog</title><link>https://ibelieving.com/tags/rabbitmq/</link><description>Recent content in RabbitMQ on Nick's Blog</description><generator>Hugo</generator><language>zh-cn</language><copyright>2014 ibelieving.com. All rights reserved.</copyright><lastBuildDate>Wed, 31 Jan 2018 23:18:08 +0800</lastBuildDate><atom:link href="https://ibelieving.com/tags/rabbitmq/index.xml" rel="self" type="application/rss+xml"/><item><title>RabbitMQ 消息队列：队列的参数与消息的属性</title><link>https://ibelieving.com/posts/2018-01-31-rabbitmq2/</link><pubDate>Wed, 31 Jan 2018 23:18:08 +0800</pubDate><guid>https://ibelieving.com/posts/2018-01-31-rabbitmq2/</guid><description>&lt;p&gt;队列的参数即声明Queues时的Arguments。
消息的属性即向Exchange发布消息时的Properties。&lt;/p&gt;
&lt;h2 id="queues-arguments"&gt;Queues Arguments&lt;/h2&gt;
&lt;p&gt;Message TTL
消息的存活时间，写入队列后被消费前可以存活的时间单位毫秒，通过&lt;code&gt;x-message-ttl&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Auto expire
队列的存活时间，指定时间内没有consumer或get方式请求队列消息则会自动删除，通过&lt;code&gt;x-expires&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Dead letter exchange
死信消息的exchange，通过&lt;code&gt;x-dead-letter-exchange&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Dead letter routing key
死信消息的路由键，通过&lt;code&gt;x-dead-letter-routing-key&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Maximum priority
消息支持的最大优先级，可实现优先级消息队列，通过&lt;code&gt;x-max-priority&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Max length
队列的最大消息数，通过&lt;code&gt;x-max-length&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Max length bytes
队列的消息的最大字节数，通过&lt;code&gt;x-max-length-bytes&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Lazy mode
懒惰队列模式，将队列内容移动到磁盘上，当消息者请求时加载入内存，这样可以支持非常长的队列，通过&lt;code&gt;x-queue-mode&lt;/code&gt;属性设置。&lt;/p&gt;
&lt;p&gt;Master locator
在RabbitMQ的高可用镜像模式中，队列消息首先会写入主节点再依次备份至从节点，通过&lt;code&gt;x-queue-master-locator&lt;/code&gt;属性设置队列的主节点选择策略。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择承担主节点最少的节点&lt;code&gt;min-masters&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;选择声明队列客户端连接到的节点&lt;code&gt;client-local&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;随机挑选一个节点&lt;code&gt;random&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;死信相关
当消息满足以下三种情况之一时会当做死信来处理：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;消息被拒绝 (basic.reject or basic.nack)&lt;/li&gt;
&lt;li&gt;消息未消费超时&lt;/li&gt;
&lt;li&gt;超出队列长度限制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;队列最大长度相关
通过&lt;code&gt;x-max-length&lt;/code&gt;、&lt;code&gt;x-max-length-bytes&lt;/code&gt;来设置队列的最大长度。一个可以控制队列消息的个数，一个可以控制队列占用的空间。如果两个都设置任何一个触发都会执行队列溢出行为，默认的队列溢出后会从队列头开始丢弃消息或进行死信处理。通过&lt;code&gt;x-overflow&lt;/code&gt;可以设置队列溢出后的行为，值为&lt;code&gt;drop-head&lt;/code&gt;(默认值)或&lt;code&gt;reject-publish&lt;/code&gt;(拒绝新消息)。&lt;/p&gt;
&lt;h2 id="message-properties"&gt;Message Properties&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;属性&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;content_type&lt;/td&gt;
&lt;td&gt;MIME类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;content_encoding&lt;/td&gt;
&lt;td&gt;MIME编码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;priority&lt;/td&gt;
&lt;td&gt;消息优先级&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;correlation_id&lt;/td&gt;
&lt;td&gt;业务应用关联标识&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;reply_to&lt;/td&gt;
&lt;td&gt;回复队列名称&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;expiration&lt;/td&gt;
&lt;td&gt;过期时间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;message_id&lt;/td&gt;
&lt;td&gt;业务应用消息标识&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;timestamp&lt;/td&gt;
&lt;td&gt;消息写入时间戳&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;type&lt;/td&gt;
&lt;td&gt;消息类型&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;user_id&lt;/td&gt;
&lt;td&gt;用户id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;app_id&lt;/td&gt;
&lt;td&gt;应用id&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;cluster_id&lt;/td&gt;
&lt;td&gt;集群id&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description></item><item><title>RabbitMQ 消息队列：浅谈</title><link>https://ibelieving.com/posts/2017-12-28-rabbitmq1/</link><pubDate>Thu, 28 Dec 2017 22:21:12 +0800</pubDate><guid>https://ibelieving.com/posts/2017-12-28-rabbitmq1/</guid><description>&lt;h2 id="简介"&gt;简介&lt;/h2&gt;
&lt;p&gt;消息队列用来解决不同项目间通信、业务解耦。消息队列有很多种比如用Redis实现的轻量级消息队列。RabbitMQ是消息队列的一种，基于AMQP协议，用Erlang语言编写，属于一种消息队列中间件。&lt;/p&gt;
&lt;h2 id="消息机制"&gt;消息机制&lt;/h2&gt;
&lt;p&gt;&lt;img loading="lazy" src="https://ibelieving.com/images/15143024048456.jpg"&gt;&lt;/p&gt;
&lt;h3 id="connection---链接"&gt;Connection 链接&lt;/h3&gt;
&lt;p&gt;真实的TCP链接&lt;/p&gt;
&lt;h3 id="channel------信道"&gt;Channel 信道&lt;/h3&gt;
&lt;p&gt;基于Connection创建的Channel，所有的数据传输都是基于Channel的。大家都知道TCP链接需要三次握手，业务频繁每次开TCP链接对性能也会有不小的损耗，TCP链接数也有限制。Channel的存在主要是为了复用TCP链接。&lt;/p&gt;
&lt;h3 id="exchange-----交换机"&gt;Exchange 交换机&lt;/h3&gt;
&lt;p&gt;消息生产者生产的所有消息都会先写入Exchange中，再路由到Queues中，如果Exchange没有绑定或未匹配到Queues则消息会被丢弃。&lt;/p&gt;
&lt;h3 id="queues-------队列"&gt;Queues 队列&lt;/h3&gt;
&lt;p&gt;生产者生产的消息会从Exchange中路由到Queues中，消费者从Queues中消费消息。&lt;/p&gt;
&lt;h3 id="binding------绑定"&gt;Binding 绑定&lt;/h3&gt;
&lt;p&gt;Binding将Exchange与Queues关联起来。&lt;/p&gt;
&lt;h3 id="routing-key--路由键"&gt;Routing key 路由键&lt;/h3&gt;
&lt;p&gt;路由键是消息从Exchange进入到某个Queues的规则。
在将Queues绑定至Exchange时会设置消息从Exchange路由至Queues的绑定路由键规则。
在将消息写入Exchange时会附带消息的路由键。&lt;/p&gt;
&lt;p&gt;Exchange类型为direct或topic时，消息的投递会根据消息的路由键和绑定的路由键进行匹配，Exchange将消息投递给所有匹配上的Queues。&lt;/p&gt;
&lt;h4 id="路由键写法"&gt;路由键写法&lt;/h4&gt;
&lt;p&gt;路由键可以由&lt;code&gt;.&lt;/code&gt; 进行分隔，如&lt;code&gt;computer.mac&lt;/code&gt;或&lt;code&gt;computer.win&lt;/code&gt;。
路由键还支持通配符来模糊匹配，&lt;code&gt;*&lt;/code&gt;与&lt;code&gt;#&lt;/code&gt;
&lt;code&gt;*&lt;/code&gt;匹配一个分隔的单词
&lt;code&gt;#&lt;/code&gt;匹配多个或零个分隔的单词&lt;/p&gt;
&lt;p&gt;应用举例&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Exchange&lt;/th&gt;
&lt;th&gt;Routing key&lt;/th&gt;
&lt;th&gt;Queues&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*.*.imac&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;code&gt;apple.#&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;apple&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;X&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*.phone.*&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;此时写入一条消息路由键为&lt;code&gt;apple.phone.iphone4&lt;/code&gt;会被投递到队列apple与phone。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;再写入一条消息路由键为&lt;code&gt;apple.computer.imac&lt;/code&gt;仅会被投递到apple，此时apple队列匹配了两个路由键，但是也只会投递到apple一次。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;再写入一条消息路由键为&lt;code&gt;micro.computer.win&lt;/code&gt;因为没有匹配的路由键队列该消息会被丢弃。&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt; &lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id="exchange-types---交换机类型"&gt;Exchange Types 交换机类型&lt;/h3&gt;
&lt;h4 id="fanout-广播"&gt;fanout 广播&lt;/h4&gt;
&lt;p&gt;fanout类型的Exchange会无视路由键，将消息投递给所有绑定到该Exchange上的Queues。&lt;/p&gt;
&lt;h4 id="direct-单播"&gt;direct 单播&lt;/h4&gt;
&lt;p&gt;direct类型的Exchange会将消息投递给路由键完全匹配的Queues中。&lt;/p&gt;
&lt;h4 id="topic-组播"&gt;topic 组播&lt;/h4&gt;
&lt;p&gt;topic类型的Exchange会将消息投递给路由键模糊匹配的Queues中。&lt;/p&gt;
&lt;h4 id="headers"&gt;headers&lt;/h4&gt;
&lt;p&gt;headers类型的Exchange也会无视路由键，会根据headers中的属性来进行匹配。该类型应用较少，不过在RabbitMQ内部还是有使用。&lt;/p&gt;</description></item></channel></rss>