当前位置: 首页 > news >正文

RabbitMQ 复习总结

多年未用,温故。。。。。

一、使用场景

  1. 异步通信解耦

    • 场景示例:用户注册后需发送邮件/短信,通过消息队列异步通知邮件/短信服务,提升主流程响应速度。
    • 优势:避免同步等待,提升系统吞吐量。
  2. 流量削峰填谷

    • 场景示例:电商秒杀场景中,订单请求通过队列缓存,下游系统按处理能力消费消息,避免系统压垮。
    • 核心机制:消息堆积能力(默认保留3天),支持亿级消息缓存。
  3. 服务解耦与容错

    • 场景示例:订单系统与库存系统解耦,订单消息写入队列后直接返回成功,库存系统异步处理。
    • 容错能力:镜像队列(主从模式)保障节点故障时服务可用性。
  4. 分布式事务补偿

    • 场景示例:通过发布确认机制(Publisher Confirms)确保消息可靠投递,结合消费端幂等处理实现最终一致性。

二、竞品对标分析

竞品名称核心优势适用场景劣势吞吐量(TPS)响应速度(延迟)可靠性
Apache Kafka高吞吐量、分布式架构、持久化存储大数据实时处理、日志聚合复杂度较高,需维护ZooKeeper百万级低至2ms
RocketMQ顺序消息、事务消息、高吞吐量电商订单、金融级场景社区活跃度低于Kafka百万级毫秒级
ActiveMQJMS规范兼容、轻量级Java生态内传统应用集成性能弱于RabbitMQ万级ms级
ZeroMQ轻量级、无中心化代理嵌入式系统、高性能网络通信缺乏消息持久化机制--
RabbitMQ灵活路由、多种消息模式、跨平台任务队列、发布-订阅、事件驱动吞吐量相对较低万级微秒级(低吞吐量时)

关键对比点

  • 吞吐量:Kafka和RocketMQ在吞吐量上表现优异,适合大规模数据处理;RabbitMQ吞吐量较低,但可通过集群优化提升。
  • 响应速度:RabbitMQ在低吞吐量时延迟最低,适合对实时性要求高的场景;Kafka在高吞吐量时仍能保持低延迟。
  • 可靠性:所有消息队列均支持持久化存储和消息确认机制,确保消息不丢失;RabbitMQ通过镜像队列模式提供高可用性。
  • 场景适用性:RabbitMQ适用于需要灵活路由和多种消息模式的场景;Kafka适用于大数据实时处理和日志聚合;RocketMQ适用于电商和金融级场景。

三、常用Exchange类型

类型路由规则性能排序典型场景
Fanout广播模式,所有绑定队列均接收消息(忽略Routing Key)最高群发通知、日志广播
Direct精确匹配Routing Key与Binding Key次之订单状态更新、定向推送
Topic通配符匹配(*匹配单个单词,#匹配多级单词)较低主题订阅(如日志按级别分类)
Headers匹配消息头中的键值对(不依赖Routing Key)最低复杂条件路由(如多属性组合筛选)

四、Docker安装部署方法

1. 环境要求

  • 依赖:Docker已安装并运行
  • 系统支持:Linux/Windows/macOS(推荐Linux生产环境)

2. 安装步骤

# 1. 拉取RabbitMQ镜像(带管理界面)
docker pull rabbitmq:3.12.0-management# 2. 启动容器(开放端口+数据持久化)
docker run -d \--name rabbitmq \-p 5672:5672 \        # AMQP协议端口-p 15672:15672 \      # 管理界面端口-v /opt/rabbitmq/data:/var/lib/rabbitmq \  # 数据持久化目录rabbitmq:3.12.0-management# 3. 安装延迟队列插件(可选)
# 3.1 下载插件文件
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.12.0/rabbitmq_delayed_message_exchange-3.12.0.ez# 3.2 复制插件到容器
docker cp rabbitmq_delayed_message_exchange-3.12.0.ez rabbitmq:/opt/rabbitmq/plugins# 3.3 启用插件并重启容器
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_delayed_message_exchange
docker restart rabbitmq

3. 访问管理界面

地址:http://{服务器IP}:15672
默认账号:guest/guest(仅限本地登录,生产环境需创建新用户)

4. 生产环境建议

  • 数据持久化:通过-v参数挂载本地目录,避免容器重启后数据丢失。
  • 安全配置:
# 创建新用户并赋予权限
docker exec rabbitmq rabbitmqctl add_user admin admin123
docker exec rabbitmq rabbitmqctl set_user_tags admin administrator
docker exec rabbitmq rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
  • 集群部署:通过Docker Compose实现多节点集群,需额外配置镜像队列和负载均衡。

五、Java集成方法

1. 添加Maven依赖

<dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.16.0</version>
</dependency>

2. 消息生产者示例

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;public class Producer {private final static String QUEUE_NAME = "order_queue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin123");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {// 声明持久化队列channel.queueDeclare(QUEUE_NAME, true, false, false, null);// 发送消息String message = "Order ID: 12345";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}}
}

3. 消息消费者示例

import com.rabbitmq.client.*;public class Consumer {private final static String QUEUE_NAME = "order_queue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");factory.setUsername("admin");factory.setPassword("admin123");Connection connection = factory.newConnection();Channel channel = connection.createChannel();channel.queueDeclare(QUEUE_NAME, true, false, false, null);System.out.println(" [*] Waiting for messages. To exit press CTRL+C");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};// 手动ACK确认消息处理完成channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});}
}

4. 关键配置说明

  • 连接池:生产环境建议使用连接池(如com.rabbitmq.http.client.Client)复用连接。
  • 消息确认:
    - 生产者:启用Publisher Confirms确保消息到达Broker。
    - 消费者:设置autoAck=false,手动发送basicAck避免消息丢失。
  • 异常处理:捕获ShutdownSignalException等异常,实现重试或告警逻辑。

相关文章:

  • Android 使用支付接口,需要进行的加密逻辑:MD5、HMAC-SHA256以及RSA
  • 实时数据驱动未来:谷云科技CDC实时数据集成平台新版本发布
  • Kubernetes 节点 Not Ready 时 Pod 驱逐机制深度解析(上)
  • Flutter 环境搭建 (Android)
  • C++23中if consteval / if not consteval (P1938R3) 详解
  • Java 类加载过程中的ClassLoaderValue 类详解
  • BGE-M3模型深度技术分析
  • arcpy列表函数的应用(2)
  • linux基础操作1------(文件命令)
  • vue滑块组件设计与实现
  • 【信息系统项目管理师】高分论文:论人力资源管理与成本管理(医院信息系统)
  • 【EDA】Placement(布局)
  • Windows 安全设置不允许下载文件
  • 文档编辑:reStructuredText全面使用指南 — 第二部分 基础语法
  • 第四章第四节 Spark-Streaming核心编程(三)
  • 浅谈AI Agent 演进之路
  • netcore8.0项目部署到windows服务器中(或个人windows电脑),利用nginx反向代理
  • 解决 EasyExcel 填充图片占满单元格问题
  • javascript全栈开发之旅01
  • Spring-Framework源码环境搭建
  • 伤者升至80人,伊朗港口爆炸源头或为“危险品和化学品仓库”
  • 体育公益之约跨越山海,雪域高原果洛孕育足球梦
  • 农贸美学、业态再构、智能管理,今天的菜市场不止有菜
  • 限制再放宽!新版市场准入负面清单缩减到106项
  • 对话地铁读书人|媒体人Echo:读书使人远离“班味”
  • 外卖江湖战火重燃,骑手、商家、消费者在“摇摆”什么?