消息队列与RabbitMQ初探

本章学习目标

  • 理解什么是消息队列以及它解决了什么核心问题。

  • 了解RabbitMQ是什么及其在技术生态中的位置。

  • 另一种方式在本地使用Docker快速搭建一个RabbitMQ服务。

  • 熟悉RabbitMQ的管理控制台。

一、理论部分

1. 同步调用 vs. 异步消息

在传统的应用开发中,组件之间通常通过同步调用(如HTTP API、gRPC)进行通信。

  • 优点:简单、直接,能立即得到结果。

  • 缺点:

    • 耦合性强:服务A必须知道服务B的地址,并且服务B必须在线才能成功调用。

    • 性能瓶颈:如果服务B处理缓慢,服务A也必须跟着等待,整个链路的响应时间会变长。

    • 容错性差:服务B宕机会导致服务A的功能不可用。

异步消息模式引入了消息代理(Message Broker) 作为中间人。

  • 工作流程:服务A(生产者)将消息发送到消息队列(Message Queue)中,然后就可以立即返回,无需等待。服务B(消费者)在合适的时候从队列中取出消息并进行处理。

  • 优点:

    • 解耦:生产者和消费者彼此不知晓对方的存在,只与消息队列交互。

    • 削峰填谷:在面对突发流量时,消息队列可以作为一个缓冲区,避免后端服务被瞬间冲垮。

    • 异步处理:生产者无需等待消费者处理完成,提高了系统的响应速度。

    • 弹性扩展:可以很容易地启动多个消费者来并行处理队列中的消息。

2. 消息队列能解决什么问题?

  • 应用解耦:微服务之间不再直接调用,而是通过消息队列通信,系统架构变得更灵活。

  • 流量削峰:秒杀、抢购等场景下,将大量请求先存入队列,后端服务再根据自己的处理能力匀速消费。

  • 异步通信:将非核心业务异步化,如注册成功后发送邮件/短信通知,提高主流程的响应速度。

  • 最终一致性:在分布式系统中,通过消息队列实现事务的最终一致性。

3. 常见消息队列产品对比

特性 RabbitMQ Apache Kafka Azure Service Bus ActiveMQ
协议 AMQP 自定义协议 AMQP, HTTP JMS, AMQP
设计理念 消息代理,通用 分布式流平台,高吞吐 企业级消息服务 JMS实现,通用
吞吐量 极高
延迟 低-中
主要优势 灵活的路由、可靠性、管理界面 高吞吐、持久化日志、流处理 云托管、与Azure生态集成 Java生态友好、支持多种协议
适用场景 业务解耦、异步任务、RPC 日志收集、流处理、事件溯源 Azure云上的企业应用 Java项目,需要支持多种议

为什么本系列选择RabbitMQ?
因为它成熟、稳定、功能丰富,提供了强大的消息路由功能和完善的管理界面,是学习消息队列和应对大多数业务场景的绝佳选择。

4. RabbitMQ简介

RabbitMQ是一个开源的消息代理和队列服务器,使用Erlang语言编写,实现了AMQP 0-9-1协议。它轻量级、易于部署,同时支持多种消息传递协议,并能在分布式系统中可靠地传输消息。

二、实操部分:搭建环境

上一章记录了Erlang和RabbitMQ的安装配置,这里再学习另一种环境搭建方式,使用Docker来运行RabbitMQ,这是最简单、最干净的方式,无需在本地安装Erlang和RabbitMQ服务。

1. 使用Docker部署RabbitMQ

确保你的机器上已经安装了Docker Desktop

打开你的终端(PowerShell, CMD, 或 Bash),执行以下命令:

docker run -d \
--name my-rabbitmq \
-p 5672:5672 \ # AMQP协议端口,应用程序使用这个端口连接
-p 15672:15672 \ # HTTP管理界面端口
-e RABBITMQ_DEFAULT_USER=myuser \ # 设置默认用户名
-e RABBITMQ_DEFAULT_PASS=mypassword \ # 设置默认密码
rabbitmq:3-management

命令解释:

  • -d: 在后台运行容器。

  • --name: 给容器起一个名字,方便后续管理。

  • -p: 端口映射,将容器内的端口映射到宿主机。

  • -e: 设置环境变量。这里我们设置了默认的用户名和密码,强烈建议替换掉默认的guest/guest,因为新版RabbitMQ默认禁止通过远程连接使用guest账户。

  • rabbitmq:3-management: 这是镜像名。-management 后缀表示这个镜像自带Web管理插件。如果使用不带此后缀的镜像,将没有管理界面。

2. 访问管理控制台

容器启动后,打开你的浏览器,访问:http://localhost:15672

使用刚才设置的用户名(myuser)和密码(mypassword)登录。

你会看到一个功能丰富的管理后台,这是我们日后观察和调试RabbitMQ的利器。主要功能区域包括:

  • Overview:总览,显示整个集群的信息、数据统计等。

  • Connections:当前所有活跃的连接。

  • Channels:通道(Channel),基于连接创建的轻量级链接,大部分操作都在通道上进行。

  • Exchanges:交换机,消息的入口,根据规则将消息路由到队列。

  • Queues:队列,存储消息的地方。

  • Admin:管理用户、权限等。

3. 验证连接

你可以使用一个简单的命令来检查RabbitMQ服务是否正常运行:

docker logs my-rabbitmq

如果看到类似 Server startup complete; ... 的日志,说明服务已成功启动。

总结

在这一章中,我们:

  1. 理解了为什么需要消息队列——解耦、削峰、异步。

  2. 认识了RabbitMQ及其在消息队列领域的地位。

  3. 使用Docker在本地搭建了一个带管理界面的RabbitMQ服务器。

  4. 登录了管理控制台,对其有了初步的印象。

【RabbitMQ】消息队列理论部分,另一种环境搭建Docker运行RabbitMQ的更多相关文章

  1. (十一)RabbitMQ消息队列-如何实现高可用

    原文:(十一)RabbitMQ消息队列-如何实现高可用 在前面讲到了RabbitMQ高可用集群的搭建,但是我们知道只是集群的高可用并不能保证应用在使用消息队列时完全没有问题,例如如果应用连接的Rabb ...

  2. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    一.理论: .net环境下,C#代码调用RabbitMQ消息队列,本文用easynetq开源的.net Rabbitmq api来实现. EasyNetQ 是一个易于使用的RabbitMQ的.Net客 ...

  3. RabbitMQ消息队列(一): Detailed Introduction 详细介绍

     http://blog.csdn.net/anzhsoft/article/details/19563091 RabbitMQ消息队列(一): Detailed Introduction 详细介绍 ...

  4. RabbitMQ消息队列1: Detailed Introduction 详细介绍

    1. 历史 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有 ...

  5. (转)RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  6. RabbitMQ消息队列应用

    RabbitMQ消息队列应用 消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景.本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理:二是 ...

  7. RabbitMQ消息队列(九):Publisher的消息确认机制

    在前面的文章中提到了queue和consumer之间的消息确认机制:通过设置ack.那么Publisher能不到知道他post的Message有没有到达queue,甚至更近一步,是否被某个Consum ...

  8. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  9. RabbitMQ消息队列(四)-服务详细配置与日常监控管理

    RabbitMQ服务管理 启动服务:rabbitmq-server -detached[ /usr/local/rabbitmq/sbin/rabbitmq-server -detached ] 查看 ...

  10. RabbitMQ消息队列(二)-RabbitMQ消息队列架构与基本概念

    没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中 ...

随机推荐

  1. java有关正则表达式的工具方法集合1

    1.获取某字符串中汉字的个数 1 ... 2 private int getChineseCount(String text) { 3 String Reg = "^[\u4e00-\u9f ...

  2. git冲突的解决与版本回退遇到的问题

    这里有2个分支,master中的test.txt文件内容是master init,branch01中的test.txt文件内容是branch01 init    1.合并分支遇到冲突 在master上 ...

  3. Excel:使用powerquery进行多表合并

    ​注:本文原创为:https://www.cnblogs.com/fanyu2019/p/11175827.html,本文在原创的基础上添加修改了一点内容 目录 一. 单工作簿多工作表合并 二. 多工 ...

  4. 最新VMware Workstation虚拟机下载并安装

    [2025年]最新VMware Workstation虚拟机下载并安装 1.最新VMware Workstation下载地址 2024年5月5日之后,VMware workstation不能直接在vm ...

  5. Nacos未授权添加用户

    路径 /nacos/v1/auth/users?pageNo=1&pageSize=4 POC: POST /nacos/v1/auth/users HTTP/1.1[]() Host: ip ...

  6. ETL数据集成丨将SQL Server数据同步至Oracle的具体实现

    一.背景 在构建企业级数据架构时,将SQL Server数据库的数据同步至数仓数据库(如Oracle)是一项至关重要的任务.这一过程不仅促进了跨系统数据的一致性与可用性,还为数据分析.商业智能以及决策 ...

  7. SciTech-EECS-Autosar(自动驾驶)-5: MCAL(微处理器抽象层)

    SciTech-EECS-Autosar(自动驾驶) 5: MCAL(微处理器抽象层) 微控制器抽象层位于AUTOSAR分层模型BSW最接近硬件设备的层, 包含内部驱动,可以直接访问微控制器和片内外设 ...

  8. USB.org + USB 3.0 Type-C + PD(Power Delivery)240W

    www.usb.org: USB.org Document Library USB Charger (USB Power Delivery) | USB-IF Type-C USB Type-C Ca ...

  9. tauri学习(3)-前端调用Rust代码

    接上节继续,今天研究tauri中,前端如何调用Rust代码. 一.无返回值&无传参 main.rs中加1个hello方法: 然后在main方法中,参考下图暴露hello1: Rust代码准备好 ...

  10. mysql截取字符串函数 --九五小庞

    一.mysql截取字符串函数 1.left(str,length) 从左边截取length 2.right(str,length)从右边截取length 3.substring(str,index)当 ...