RabbitMQ关于队列与交换机的作用说明
有勇气的牛排
61
服务器/中间件
2025-03-26 21:17:12
1 前言
在 RabbitMQ 中,“队列(Queue)” 和 “交换机(Exchange)” 是两个核心概念,它们承担不同的职责,彼此配合完成消息传递任务。
2 队列(Queue)是什么?有什么作用?
队列 是用来 存储消息 的数据结构,相当于一个“收件箱”。
- 作用:存储从生产者发送过来的消息,等待消费者来消费。
- 每个消息在队列中只存在一份。
- 消费者从队列中读取并处理消息。
- 队列是有名称的,消费者订阅时是根据队列名来的。
3 那为啥还需要交换机(Exchange)?不能直接发给队列吗?
这是个很常见的疑问。RabbitMQ 不直接让生产者发消息到队列,而是采用了间接模式:
🔸 生产者 ➜ 发送消息给交换机(Exchange) ➜ 交换机根据绑定规则分发消息给队列(Queue)

4 好处是:
- 解耦合:生产者只管往交换机发消息,不关心具体投递给哪个队列,方便扩展。
- 灵活路由:交换机可以根据路由规则将消息分发给一个或多个队列(甚至0个)。
- 支持广播/订阅/路由等多种模型:
fanout
:广播消息给所有绑定的队列。
direct
:根据精确匹配的 routing key 路由。
topic
:支持通配符的模式匹配。
headers
:根据 header 属性路由。
5 举个例子对比一下:
5.1 如果没有交换机:
- 生产者必须知道每个队列的名字,直接发消息到它。
- 无法实现一条消息发送给多个队列。
- 不好动态增加/减少消费队列。
5.2 有了交换机之后:
- 生产者只和交换机交互。
- 路由规则由交换机和队列绑定关系决定。
- 更灵活、更易维护。
6 总结一句话:
队列是消息的最终落地存储地点,而交换机是消息的分发调度中心。
生产者不是直接发给队列,而是通过交换机,让系统更灵活、更解耦。
<h3><a id="1__1"></a>1 前言</h3>
<p>在 RabbitMQ 中,“<strong>队列(Queue)</strong>” 和 “<strong>交换机(Exchange)”</strong> 是两个核心概念,它们承担不同的职责,彼此配合完成消息传递任务。</p>
<h3><a id="2_Queue_5"></a>2 队列(Queue)是什么?有什么作用?</h3>
<p><strong>队列</strong> 是用来 <strong>存储消息</strong> 的数据结构,相当于一个“收件箱”。</p>
<ul>
<li><strong>作用</strong>:存储从生产者发送过来的消息,等待消费者来消费。</li>
<li>每个消息在队列中只存在一份。</li>
<li>消费者从队列中读取并处理消息。</li>
<li>队列是有名称的,消费者订阅时是根据队列名来的。</li>
</ul>
<h3><a id="3_Exchange_14"></a>3 那为啥还需要交换机(Exchange)?不能直接发给队列吗?</h3>
<p>这是个很常见的疑问。RabbitMQ 不直接让生产者发消息到队列,而是采用了<strong>间接模式</strong>:<br />
🔸 生产者 ➜ <strong>发送消息给交换机(Exchange)</strong> ➜ <strong>交换机根据绑定规则分发消息给队列(Queue)</strong></p>
<p><img src="https://static.couragesteak.com/article/12b7791efd08d3d5a47ab5be780ec62b.png" alt="image.png" /></p>
<h3><a id="4__21"></a>4 好处是:</h3>
<ol>
<li><strong>解耦合</strong>:生产者只管往交换机发消息,不关心具体投递给哪个队列,方便扩展。</li>
<li><strong>灵活路由</strong>:交换机可以根据路由规则将消息分发给一个或多个队列(甚至0个)。</li>
<li><strong>支持广播/订阅/路由等多种模型</strong>:
<ul>
<li><code>fanout</code>:广播消息给所有绑定的队列。</li>
<li><code>direct</code>:根据精确匹配的 routing key 路由。</li>
<li><code>topic</code>:支持通配符的模式匹配。</li>
<li><code>headers</code>:根据 header 属性路由。</li>
</ul>
</li>
</ol>
<hr />
<h3><a id="5__33"></a>5 举个例子对比一下:</h3>
<h4><a id="51__35"></a>5.1 如果没有交换机:</h4>
<ul>
<li>生产者必须知道每个队列的名字,直接发消息到它。</li>
<li>无法实现一条消息发送给多个队列。</li>
<li>不好动态增加/减少消费队列。</li>
</ul>
<h4><a id="52__41"></a>5.2 有了交换机之后:</h4>
<ul>
<li>生产者只和交换机交互。</li>
<li>路由规则由交换机和队列绑定关系决定。</li>
<li>更灵活、更易维护。</li>
</ul>
<hr />
<h3><a id="6__49"></a>6 总结一句话:</h3>
<blockquote>
<p>队列是<strong>消息的最终落地存储地点</strong>,而交换机是<strong>消息的分发调度中心</strong>。<br />
生产者不是直接发给队列,而是通过交换机,让系统更灵活、更解耦。</p>
</blockquote>
留言