<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>队列 on Leanku 的博客</title><link>https://www.leanku.com/tags/%E9%98%9F%E5%88%97/</link><description>Recent content in 队列 on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 08 Aug 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://www.leanku.com/tags/%E9%98%9F%E5%88%97/index.xml" rel="self" type="application/rss+xml"/><item><title>RabbitMQ 使用指南：从入门到实战</title><link>https://www.leanku.com/post/queue/rabbitmq-user-guide/</link><pubDate>Thu, 08 Aug 2024 00:00:00 +0000</pubDate><guid>https://www.leanku.com/post/queue/rabbitmq-user-guide/</guid><description>&lt;h1 id="rabbitmq-使用指南从入门到实战"&gt;RabbitMQ 使用指南：从入门到实战&lt;/h1&gt;&#10;&lt;h2 id="一为什么选择-rabbitmq"&gt;一、为什么选择 RabbitMQ？&lt;/h2&gt;&#10;&lt;p&gt;在分布式系统中，服务之间的&lt;strong&gt;同步调用&lt;/strong&gt;会带来三个棘手的问题：扩展性差、性能下降、级联失败。消息队列正是解决这些问题的良方，它的价值在于：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;异步解耦&lt;/strong&gt;：生产者发送消息后即可返回，无需等待消费者处理完成，降低了服务间的直接依赖。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;流量削峰&lt;/strong&gt;：消息队列作为缓冲层，可以将突增的请求暂存，让消费者按自己的节奏处理，保护下游系统。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;可靠性保障&lt;/strong&gt;：RabbitMQ 凭借其&lt;strong&gt;极高的消息可靠性&lt;/strong&gt;和&lt;strong&gt;微秒级的低延迟&lt;/strong&gt;，在微服务解耦、实时数据处理场景中表现出色。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;与其他消息队列相比，RabbitMQ 的&lt;strong&gt;易用性&lt;/strong&gt;和&lt;strong&gt;社区生态&lt;/strong&gt;的综合分最均衡。据统计，它目前是国内消息队列使用量最大的产品。&lt;/p&gt;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;特别说明：本文部分示例使用了 php 代码，但 RabbitMQ 的核心概念和配置逻辑是跨语言的。后文也会提供基于 PHP &lt;code&gt;php-amqplib&lt;/code&gt; 的代码示例，方便 Hyperf 开发者参考。&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&lt;h2 id="二核心概念理解消息流转的骨架"&gt;二、核心概念：理解消息流转的“骨架”&lt;/h2&gt;&#10;&lt;p&gt;要熟练使用 RabbitMQ，首先需要理清其核心组件的作用。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;四大核心角色：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;生产者（Producer）&lt;/strong&gt;：消息的发送方，负责创建消息并发送到交换机。例如电商系统中，“订单服务”就是生产者，它会发送“订单已创建”的消息。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;交换机（Exchange）&lt;/strong&gt;：接收生产者发送的消息，并根据&lt;strong&gt;路由规则&lt;/strong&gt;将消息分发到对应的队列。&lt;strong&gt;注意&lt;/strong&gt;：交换机不存储消息，若没有匹配的队列，消息会被丢弃。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;队列（Queue）&lt;/strong&gt;：消息的存储容器，用于暂存待消费的消息。队列是线程安全的，一条消息只能被一个消费者消费（默认情况下）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;消费者（Consumer）&lt;/strong&gt;：消息的接收方，负责从队列中获取消息并处理。例如“库存服务”监听订单队列，收到消息后执行库存扣减。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;关键辅助概念：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;绑定（Binding）&lt;/strong&gt;：建立交换机与队列之间的关联，并指定**路由键（Routing Key）**作为匹配规则。没有绑定的交换机无法将消息传递到队列。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;虚拟主机（Virtual Host）&lt;/strong&gt;：RabbitMQ 的“命名空间”，用于隔离不同项目或环境的资源（交换机、队列、用户等）。每个虚拟主机都有独立的权限控制。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="三交换机类型选择正确的路由策略"&gt;三、交换机类型：选择正确的路由策略&lt;/h2&gt;&#10;&lt;p&gt;交换机是 RabbitMQ 路由消息的核心，不同类型的交换机对应不同的路由逻辑。RabbitMQ 支持 4 种交换机类型：&lt;/p&gt;&#10;&lt;h3 id="31-direct-交换机精确匹配"&gt;3.1 Direct 交换机：精确匹配&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：Direct 交换机要求消息的**路由键（Routing Key）&lt;strong&gt;与绑定的&lt;/strong&gt;绑定键（Binding Key）**完全一致，才会将消息路由到对应的队列。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：一对一的精确路由。例如“订单支付成功后，通知物流系统发货”。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;：绑定 &lt;code&gt;Q1&lt;/code&gt; 队列的绑定键为 &lt;code&gt;order.pay.success&lt;/code&gt;，只有路由键完全匹配该值的消息才会进入 &lt;code&gt;Q1&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="32-topic-交换机模糊匹配"&gt;3.2 Topic 交换机：模糊匹配&lt;/h3&gt;&#10;&lt;p&gt;&lt;strong&gt;工作原理&lt;/strong&gt;：Topic 交换机支持使用通配符进行模糊匹配：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;code&gt;*&lt;/code&gt;：匹配&lt;strong&gt;一个&lt;/strong&gt;单词（例如 &lt;code&gt;user.*&lt;/code&gt; 可匹配 &lt;code&gt;user.register&lt;/code&gt;，但不匹配 &lt;code&gt;user.register.success&lt;/code&gt;）&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;#&lt;/code&gt;：匹配&lt;strong&gt;零个或多个&lt;/strong&gt;单词（例如 &lt;code&gt;user.#&lt;/code&gt; 可匹配 &lt;code&gt;user.register&lt;/code&gt; 和 &lt;code&gt;user.register.success&lt;/code&gt;）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：一对多的“订阅-发布”场景，如用户行为日志收集（注册、登录、下单等行为分别路由到不同的日志队列）。&lt;/p&gt;</description></item></channel></rss>