<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rabbitmq on Leanku 的博客</title><link>https://www.leanku.com/tags/rabbitmq/</link><description>Recent content in Rabbitmq on Leanku 的博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 13 Oct 2024 20:46:01 +0800</lastBuildDate><atom:link href="https://www.leanku.com/tags/rabbitmq/index.xml" rel="self" type="application/rss+xml"/><item><title>关于rabbitmq的一些问题</title><link>https://www.leanku.com/post/queue/%E5%85%B3%E4%BA%8Erabbitmq%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</link><pubDate>Sun, 13 Oct 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/queue/%E5%85%B3%E4%BA%8Erabbitmq%E7%9A%84%E4%B8%80%E4%BA%9B%E9%97%AE%E9%A2%98/</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;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;&#10;&lt;p&gt;&lt;strong&gt;Producer（生产者）：&lt;/strong&gt; 发送消息的应用程序。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Consumer（消费者）：&lt;/strong&gt; 接收消息的应用程序。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Message（消息）：&lt;/strong&gt; 包含有效载荷（数据）和标签（元数据，如路由键）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Exchange（交换机）：&lt;/strong&gt; 接收生产者发送的消息，并根据特定规则（交换机类型、绑定、路由键）将消息路由到一个或多个队列。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Queue（队列）：&lt;/strong&gt; 存储消息的缓冲区，等待消费者消费。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Binding（绑定）：&lt;/strong&gt; 连接交换机和队列的规则。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;完整流程：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;建立连接：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;生产者/消费者与 RabbitMQ Broker 建立一个 TCP 连接。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;在连接上创建一个 Channel（信道），Channel 是轻量级的连接，避免了频繁创建/销毁 TCP 开开销。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;生产者发送消息：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;生产者将消息发送到指定的 &lt;strong&gt;Exchange&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;发送消息时，必须指定一个 &lt;strong&gt;Routing Key&lt;/strong&gt;（路由键）。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;交换机路由消息：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;Exchange 接收到消息后，根据自身的 &lt;strong&gt;类型&lt;/strong&gt; 和 &lt;strong&gt;Binding&lt;/strong&gt; 规则，决定将消息投递到哪些队列。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;主要的交换机类型：&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Direct：&lt;/strong&gt; 精确匹配 Routing Key。消息只会被投递到 Binding Key 与 Routing Key &lt;strong&gt;完全一致&lt;/strong&gt; 的队列。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Fanout：&lt;/strong&gt; 广播模式。将消息投递到所有绑定到该 Exchange 的队列，忽略 Routing Key。&lt;/p&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;&#10;&lt;p&gt;&lt;strong&gt;Topic：&lt;/strong&gt; 模式匹配。使用通配符（&lt;code&gt;*&lt;/code&gt; 匹配一个词，&lt;code&gt;#&lt;/code&gt; 匹配零个或多个词）来匹配 Routing Key 和 Binding Key。&lt;/p&gt;</description></item><item><title>rabbitmq工作原理</title><link>https://www.leanku.com/post/queue/rabbitmq%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/</link><pubDate>Tue, 23 Apr 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/queue/rabbitmq%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86/</guid><description>&lt;h1 id="rabbitmq工作原理"&gt;rabbitmq工作原理&lt;/h1&gt;&#10;&lt;h2 id="一概念"&gt;一、概念&lt;/h2&gt;&#10;&lt;h3 id="amqp协议"&gt;AMQP协议&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;AMQP是一个提供统一消息服务的应用层标准协议，基于此协议的客户端与消息中间件可传递消息，并不受客户端/中间件不同产品，不同开发语言等条件的限制。&#10;&#10;AMQP协议是一种二进制协议，提供客户端应用与消息中间件之间异步、安全、高效地交互。&#10;&#10;AMQP作为中间层服务，把消息生产和消费分割出来，当消息生产者出现异常，不影响消费者对消息的消费，当消费者异常时，生产者生产的消息可以存放到服务的内存或者磁盘，不以影响到消息的消费，同时，消息也可以基于路由的规则可以投递到指定的消费者消费。&#10;&#10;AMQP基于模块化通过Exchange和Message Queue两个组件组合实现消息路由分发&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="生产者和消费者"&gt;生产者和消费者&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;生产者是生产消息的主体，消费者是消费消息的主体&#10;&#10;数据集成与系统解耦、异步处理与事件驱动、流量削峰、事务消息与分布式事务的最终一致等&#10;&#10;生产者生产一条消息丢给消息代理，消息代理根据投递规则将消息传送到消费者手上&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="交换机"&gt;交换机&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;交换机就像是消息代理的路由器，负责拿到一个消息之后，根据确定的规则（路由键）将他路由给一个或零个队列、交换机具备多种路由模式。&#10;&#10;基于消息生产者和路由规则可以将消息投递到指定的Message Queue，交换机收到生产者投递的消息，基于路由规则及队列绑定关系匹配到投递对应的交换机或者队列进行分发，交换机不存储消息，只做转发&#10;&#10;直连交换机：根据路由键完全匹配的投递到对应的队列。&#10;&#10;扇形交换机：无视路由键，将消息进行拷贝，并路由到给绑定到它身上的所有队列，提供了一个广播的效果&#10;&#10;主题交换机： 根据路由键按模式匹配的投递到对应的队列&#10;&#10;交换机也具备自己的属性，可以定义自己的名字，是否持久化等选项&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="队列"&gt;队列&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;消息的暂存地，至少有一个消费者订阅了队列的话，消息会立即发送给这些订阅的消费者。但是如果消息到达了无人的订阅队列，消息会在队列中等待，等待有了消费者便进行分发&#10;&#10;Exchange和Message Queue之间存在绑定关系，消息到了Exchange后基于路由策略可以将消息投递到已绑定且符合路由策略的Message Queue。&#10;&#10;消息队列会将消息存储到内存或者磁盘中，并将这些消息按照一定顺序转发给一个或多个消费者，每个消息队列都是独立隔离的，相互不影响。&#10;&#10;消息队列具有不同的属性：私有，共享，持久化，临时，客户端定义或者服务端定义等，可以基于实际需求选择对应的类型&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="消息"&gt;消息&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;消息是信息的载体，也是MAQP协议的一个实体，消息包含以下两部分&#10;载荷：就是真正的信息，是你想要传输的任何内容，该部分内容对消息代理来说是透明的&#10;元消息：包含路由键、内容类型、编码、是否持久化等等消息属性，会被消息代理所解析，消息代理根据消息的属性对这条消息进行投递，存储等。这部分被消息代理所关心，而消费者对其是不关心的&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h3 id="信道"&gt;信道&lt;/h3&gt;&#10;&lt;pre&gt;&lt;code&gt;网络信道，是建立在Connection连接之上的一种轻量级的连接。几乎所有的操作都在Chanel中进行，Channel是进行消息读写的通道，客户端可以建立对各Channel，每个Channel代表一个会话任务&#10;&#10;如果把Connection比作一条光纤电缆的话，那么Channel信道就比作成光纤电缆中的其中一束光纤。一个Connection上可以创建任意数量的Channel。&#10;&#10;大部分的业务操作是在Channel这个接口中完成的&#10;&#10;队列声明 queueDeclare&#10;交换机的声明 ExchangeDeclare&#10;队列的绑定 queueBind&#10;发布消息 basicPublish&#10;消费消息 basicConsume&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;h2 id="二rabbitmq-工作模式"&gt;二、Rabbitmq 工作模式&lt;/h2&gt;&#10;&lt;h3 id="21-简单模式"&gt;2.1 简单模式&lt;/h3&gt;&#10;&lt;p&gt;生产者p发送消息到队列，消费者c消费消息。（无交换机消息直接进入队列）&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;p-&amp;gt;queue-&amp;gt;c&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="22-工作模式"&gt;2.2 工作模式&lt;/h3&gt;&#10;&lt;p&gt;一个生产者p发送消息到队列，队列将消息分配给多个消费者c1,c2。（实现负载均衡，适合集群异步处理，典型场景：发送邮件、短信等）&#10;p-&amp;gt;queue|-&amp;gt;c1&#10;|-&amp;gt;c2&lt;/p&gt;&#10;&lt;h3 id="23-订阅模式每个队列的消息都是一样的"&gt;2.3 订阅模式，每个队列的消息都是一样的&lt;/h3&gt;&#10;&lt;p&gt;使用广播类型的交换机e, 生产者p把消息发送到交换机e，交换机e把消息发送到和交换机绑定的队列c4、c5(每个消费者接收相同的消息。典型应用场景：天气订阅，微博订阅等)&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt; |-&amp;gt;c4&#10;p-&amp;gt;e-&amp;gt;|&#10; |-&amp;gt;c5&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="24-路由模式"&gt;2.4 路由模式&lt;/h3&gt;&#10;&lt;p&gt;使用Direct类型的交换机，生产者p发送消息到交换机e，交换机E根据路由键（如error发送到c1）匹配队列，消息仅发送到匹配的队列（与订阅模式的区别：按条件筛选发送）&lt;/p&gt;</description></item><item><title>RabbitMQ详解</title><link>https://www.leanku.com/post/queue/rabbitmq%E8%AF%A6%E8%A7%A3/</link><pubDate>Tue, 23 Apr 2024 20:46:01 +0800</pubDate><guid>https://www.leanku.com/post/queue/rabbitmq%E8%AF%A6%E8%A7%A3/</guid><description>&lt;h1 id="rabbitmq详解"&gt;RabbitMQ详解&lt;/h1&gt;&#10;&lt;h2 id="一为什么需要-rabbitmq"&gt;一、为什么需要 RabbitMQ？&lt;/h2&gt;&#10;&lt;h3 id="11-它能解决什么问题"&gt;1.1 它能解决什么问题？&lt;/h3&gt;&#10;&lt;p&gt;在分布式系统中，服务间的通信面临着诸多挑战。RabbitMQ 通过“生产者-消费者”模型，有效解决了以下痛点：&lt;/p&gt;&#10;&lt;h4 id="系统解耦"&gt;系统解耦&lt;/h4&gt;&#10;&lt;p&gt;在紧耦合架构中，订单系统需要直接调用库存、支付、物流等多个服务。一旦某个服务接口变更，所有依赖方都需调整。通过 RabbitMQ，订单系统只需发送一条“订单创建”消息，其他服务订阅即可，服务之间无需直接关联。&lt;/p&gt;&#10;&lt;h4 id="异步通信"&gt;异步通信&lt;/h4&gt;&#10;&lt;p&gt;同步调用中，用户需要等待所有下游操作完成才能得到响应。例如，注册后发送邮件、短信、初始化数据等耗时操作，如果全部同步执行，用户体验会非常差。通过 RabbitMQ，主流程可立即返回，后台消费者异步处理这些非核心任务。&lt;/p&gt;&#10;&lt;h4 id="流量削峰"&gt;流量削峰&lt;/h4&gt;&#10;&lt;p&gt;秒杀、大促场景下，瞬时请求可能高达数万 QPS，直接冲击数据库会导致系统崩溃。RabbitMQ 可以作为缓冲器，将突发请求暂存到队列中，后端服务按自身处理能力逐步消费，确保系统平稳运行。&lt;/p&gt;&#10;&lt;h3 id="12-举例快递分拣中心"&gt;1.2 举例：快递分拣中心&lt;/h3&gt;&#10;&lt;p&gt;可以把 RabbitMQ 想象成一个快递分拣中心：&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;：小区快递柜，暂存等待领取的包裹&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;消费者&lt;/strong&gt;：取快递的人，从快递柜取走包裹&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;寄件人无需等待收件人当场签收，分拣中心会负责精准投递，收件人按需取件——这就是异步解耦的本质。&lt;/p&gt;&#10;&lt;h2 id="二核心架构与工作流程"&gt;二、核心架构与工作流程&lt;/h2&gt;&#10;&lt;h3 id="21-核心组件"&gt;2.1 核心组件&lt;/h3&gt;&#10;&lt;p&gt;RabbitMQ 的架构围绕以下核心组件展开：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;组件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类比&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;生产者（Producer）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;创建并发送消息&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;寄快递的人&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;交换机（Exchange）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接收消息，根据规则路由到队列&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;快递分拣员&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;绑定（Binding）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;建立交换机与队列的关联，指定路由规则&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分拣中心与快递柜的配送路线&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;队列（Queue）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;存储消息的容器&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;小区快递柜&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;消费者（Consumer）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;从队列获取并处理消息&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;取快递的人&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;连接（Connection）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;与 RabbitMQ 服务器的 TCP 连接&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;公路&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;信道（Channel）&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;复用连接的轻量级通信通道&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;公路上的车道&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;关键概念&lt;/strong&gt;：&lt;strong&gt;信道（Channel）&lt;/strong&gt; 是理解 RabbitMQ 性能的关键。每次创建和关闭 TCP 连接的开销很大，信道则允许在一个 TCP 连接上并发进行多个通信，大幅提升效率。&lt;/p&gt;&#10;&lt;h3 id="22-消息流转全流程"&gt;2.2 消息流转全流程&lt;/h3&gt;&#10;&lt;p&gt;一条消息从生产到消费，经历以下步骤：&lt;/p&gt;</description></item></channel></rss>