【RabbitMQ】消息队列理论部分,另一种环境搭建Docker运行RabbitMQ
<h2>消息队列与RabbitMQ初探</h2><h3>本章学习目标</h3>
<ul>
<li>
<p class="ds-markdown-paragraph">理解什么是消息队列以及它解决了什么核心问题。</p>
</li>
<li>
<p class="ds-markdown-paragraph">了解RabbitMQ是什么及其在技术生态中的位置。</p>
</li>
<li>
<p class="ds-markdown-paragraph">另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。</p>
</li>
<li>
<p class="ds-markdown-paragraph">熟悉RabbitMQ的管理控制台。</p>
</li>
</ul>
<h2>一、理论部分</h2>
<h3>1. 同步调用 vs. 异步消息</h3>
<p class="ds-markdown-paragraph">在传统的应用开发中,组件之间通常通过同步调用(如HTTP API、gRPC)进行通信。</p>
<ul>
<li>
<p class="ds-markdown-paragraph">优点:简单、直接,能立即得到结果。</p>
</li>
<li>
<p class="ds-markdown-paragraph">缺点:</p>
<ul>
<li>
<p class="ds-markdown-paragraph">耦合性强:服务A必须知道服务B的地址,并且服务B必须在线才能成功调用。</p>
</li>
<li>
<p class="ds-markdown-paragraph">性能瓶颈:如果服务B处理缓慢,服务A也必须跟着等待,整个链路的响应时间会变长。</p>
</li>
<li>
<p class="ds-markdown-paragraph">容错性差:服务B宕机会导致服务A的功能不可用。</p>
</li>
</ul>
</li>
</ul>
<p class="ds-markdown-paragraph">异步消息模式引入了消息代理(Message Broker) 作为中间人。</p>
<ul>
<li>
<p class="ds-markdown-paragraph">工作流程:服务A(生产者)将消息发送到消息队列(Message Queue)中,然后就可以立即返回,无需等待。服务B(消费者)在合适的时候从队列中取出消息并进行处理。</p>
</li>
<li>
<p class="ds-markdown-paragraph">优点:</p>
<ul>
<li>
<p class="ds-markdown-paragraph">解耦:生产者和消费者彼此不知晓对方的存在,只与消息队列交互。</p>
</li>
<li>
<p class="ds-markdown-paragraph">削峰填谷:在面对突发流量时,消息队列可以作为一个缓冲区,避免后端服务被瞬间冲垮。</p>
</li>
<li>
<p class="ds-markdown-paragraph">异步处理:生产者无需等待消费者处理完成,提高了系统的响应速度。</p>
</li>
<li>
<p class="ds-markdown-paragraph">弹性扩展:可以很容易地启动多个消费者来并行处理队列中的消息。</p>
</li>
</ul>
</li>
</ul>
<h3>2. 消息队列能解决什么问题?</h3>
<ul>
<li>
<p class="ds-markdown-paragraph">应用解耦:微服务之间不再直接调用,而是通过消息队列通信,系统架构变得更灵活。</p>
</li>
<li>
<p class="ds-markdown-paragraph">流量削峰:秒杀、抢购等场景下,将大量请求先存入队列,后端服务再根据自己的处理能力匀速消费。</p>
</li>
<li>
<p class="ds-markdown-paragraph">异步通信:将非核心业务异步化,如注册成功后发送邮件/短信通知,提高主流程的响应速度。</p>
</li>
<li>
<p class="ds-markdown-paragraph">最终一致性:在分布式系统中,通过消息队列实现事务的最终一致性。</p>
</li>
</ul>
<h3>3. 常见消息队列产品对比</h3>
<div class="ds-scroll-area _1210dd7">
<table style="height: 302px; width: 966px">
<thead>
<tr><th>特性</th><th>RabbitMQ</th><th>Apache Kafka</th><th>Azure Service Bus</th><th>ActiveMQ</th></tr>
</thead>
<tbody>
<tr>
<td>协议</td>
<td>AMQP</td>
<td>自定义协议</td>
<td>AMQP, HTTP</td>
<td>JMS, AMQP</td>
</tr>
<tr>
<td>设计理念</td>
<td>消息代理,通用</td>
<td>分布式流平台,高吞吐</td>
<td>企业级消息服务</td>
<td>JMS实现,通用</td>
</tr>
<tr>
<td>吞吐量</td>
<td>高</td>
<td>极高</td>
<td>高</td>
<td>高</td>
</tr>
<tr>
<td>延迟</td>
<td>低</td>
<td>低-中</td>
<td>低</td>
<td>低</td>
</tr>
<tr>
<td>主要优势</td>
<td>灵活的路由、可靠性、管理界面</td>
<td>高吞吐、持久化日志、流处理</td>
<td>云托管、与Azure生态集成</td>
<td>Java生态友好、支持多种协议</td>
</tr>
<tr>
<td>适用场景</td>
<td>业务解耦、异步任务、RPC</td>
<td>日志收集、流处理、事件溯源</td>
<td>Azure云上的企业应用</td>
<td>Java项目,需要支持多种议</td>
</tr>
</tbody>
</table>
</div>
<p class="ds-markdown-paragraph">为什么本系列选择RabbitMQ?<br>因为它成熟、稳定、功能丰富,提供了强大的消息路由功能和完善的管理界面,是学习消息队列和应对大多数业务场景的绝佳选择。</p>
<h3>4. RabbitMQ简介</h3>
<p class="ds-markdown-paragraph">RabbitMQ是一个开源的消息代理和队列服务器,使用Erlang语言编写,实现了AMQP 0-9-1协议。它轻量级、易于部署,同时支持多种消息传递协议,并能在分布式系统中可靠地传输消息。</p>
<h2>二、实操部分:搭建环境</h2>
<p class="ds-markdown-paragraph">上一章记录了Erlang和RabbitMQ的安装配置,这里再学习另一种环境搭建方式,使用Docker来运行RabbitMQ,这是最简单、最干净的方式,无需在本地安装Erlang和RabbitMQ服务。</p>
<h3>1. 使用Docker部署RabbitMQ</h3>
<p class="ds-markdown-paragraph">确保你的机器上已经安装了Docker Desktop。</p>
<p class="ds-markdown-paragraph">打开你的终端(PowerShell, CMD, 或 Bash),执行以下命令:</p>
<div class="cnblogs_code">
<pre>docker run -<span style="color: rgba(0, 0, 0, 1)">d \
</span>--name my-<span style="color: rgba(0, 0, 0, 1)">rabbitmq \
</span>-p <span style="color: rgba(128, 0, 128, 1)">5672</span>:<span style="color: rgba(128, 0, 128, 1)">5672</span><span style="color: rgba(0, 0, 0, 1)"> \ # AMQP协议端口,应用程序使用这个端口连接
</span>-p <span style="color: rgba(128, 0, 128, 1)">15672</span>:<span style="color: rgba(128, 0, 128, 1)">15672</span><span style="color: rgba(0, 0, 0, 1)"> \# HTTP管理界面端口
</span>-e RABBITMQ_DEFAULT_USER=<span style="color: rgba(0, 0, 0, 1)">myuser \# 设置默认用户名
</span>-e RABBITMQ_DEFAULT_PASS=<span style="color: rgba(0, 0, 0, 1)">mypassword \ # 设置默认密码
rabbitmq:</span><span style="color: rgba(128, 0, 128, 1)">3</span>-management</pre>
</div>
<p class="ds-markdown-paragraph">命令解释:</p>
<ul>
<li>
<p class="ds-markdown-paragraph"><code>-d</code>: 在后台运行容器。</p>
</li>
<li>
<p class="ds-markdown-paragraph"><code>--name</code>: 给容器起一个名字,方便后续管理。</p>
</li>
<li>
<p class="ds-markdown-paragraph"><code>-p</code>: 端口映射,将容器内的端口映射到宿主机。</p>
</li>
<li>
<p class="ds-markdown-paragraph"><code>-e</code>: 设置环境变量。这里我们设置了默认的用户名和密码,强烈建议替换掉默认的<code>guest/guest</code>,因为新版RabbitMQ默认禁止通过远程连接使用<code>guest</code>账户。</p>
</li>
<li>
<p class="ds-markdown-paragraph"><code>rabbitmq:3-management</code>: 这是镜像名。<code>-management</code> 后缀表示这个镜像自带Web管理插件。如果使用不带此后缀的镜像,将没有管理界面。</p>
</li>
</ul>
<h3>2. 访问管理控制台</h3>
<p class="ds-markdown-paragraph">容器启动后,打开你的浏览器,访问:http://localhost:15672</p>
<p class="ds-markdown-paragraph">使用刚才设置的用户名(<code>myuser</code>)和密码(<code>mypassword</code>)登录。</p>
<p class="ds-markdown-paragraph">你会看到一个功能丰富的管理后台,这是我们日后观察和调试RabbitMQ的利器。主要功能区域包括:</p>
<ul>
<li>
<p class="ds-markdown-paragraph">Overview:总览,显示整个集群的信息、数据统计等。</p>
</li>
<li>
<p class="ds-markdown-paragraph">Connections:当前所有活跃的连接。</p>
</li>
<li>
<p class="ds-markdown-paragraph">Channels:通道(Channel),基于连接创建的轻量级链接,大部分操作都在通道上进行。</p>
</li>
<li>
<p class="ds-markdown-paragraph">Exchanges:交换机,消息的入口,根据规则将消息路由到队列。</p>
</li>
<li>
<p class="ds-markdown-paragraph">Queues:队列,存储消息的地方。</p>
</li>
<li>
<p class="ds-markdown-paragraph">Admin:管理用户、权限等。</p>
</li>
</ul>
<h3>3. 验证连接</h3>
<p class="ds-markdown-paragraph">你可以使用一个简单的命令来检查RabbitMQ服务是否正常运行:</p>
<div class="md-code-block md-code-block-light">
<div class="md-code-block-banner-wrap">
<div class="md-code-block-banner md-code-block-banner-lite">
<div class="_121d384">
<div class="d2a24f03">
<div class="cnblogs_code">
<pre>docker logs my-rabbitmq</pre>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="ds-markdown-paragraph">如果看到类似 <code>Server startup complete; ...</code> 的日志,说明服务已成功启动。</p>
<h2>总结</h2>
<p class="ds-markdown-paragraph">在这一章中,我们:</p>
<ol start="1">
<li>
<p class="ds-markdown-paragraph">理解了为什么需要消息队列——解耦、削峰、异步。</p>
</li>
<li>
<p class="ds-markdown-paragraph">认识了RabbitMQ及其在消息队列领域的地位。</p>
</li>
<li>
<p class="ds-markdown-paragraph">使用Docker在本地搭建了一个带管理界面的RabbitMQ服务器。</p>
</li>
<li>
<p class="ds-markdown-paragraph">登录了管理控制台,对其有了初步的印象。</p>
</li>
</ol><br><br>
来源:https://www.cnblogs.com/jixingsuiyuan/p/19089393
頁:
[1]