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

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等异常,实现重试或告警逻辑。
http://www.xdnf.cn/news/1978.html

相关文章:

  • 【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
  • Matplotlib高阶技术全景解析(续):动态交互、三维可视化与性能优化
  • 大模型助力嘉兴妇幼:数据分类分级的智能化飞跃
  • 7.11 Python CLI开发实战:API集成与异步处理核心技术解析
  • flume整合kafka
  • electron-builder 打包安装与启动手动安装,最终解决方案,之前的文章与其他的人都不用看了。
  • 驱动开发硬核特训 · Day 20:深入理解电源管理机制与实战演练
  • ValidatorUtils工具
  • uni-app云开发总结
  • SQL进阶知识:九、高级数据类型
  • Dify依赖管理poetry切换为uv
  • Kafka和Spark-Streaming
  • 解释两个 Django 命令 makemigrations和migrate
  • 【器件专题1——IGBT第2讲】IGBT 基本工作原理:从结构到特性,一文解析 “电力电子心脏” 的核心机制
  • 5.6 Microsoft Semantic Kernel:专注于将LLM集成到现有应用中的框架
  • Pycharm(十六)面向对象进阶
  • 深度解析 Java 泛型通配符 `<? super T>` 和 `<? extends T>`
  • 使用功能包组织C++节点的具体教程
  • 天能资管(SkyAi):精准投资匹配,定制资产配置新体验
  • 202531读书笔记|《天上大风:良宽俳句·短歌·汉诗400》——我别无他物款待君,除了山中冬日寂寥,陶然共一醉,不知是与非,一饱百情足,一酣万事休
  • AI重塑职场:人机协同时代的组织变革与管理创新
  • AWS Glue ETL设计与调度最佳实践
  • 【HTTP/2:信息高速公路的革命】
  • 6.Three.js 中的 OrthographicCamera 详解(含示例)
  • 微信小程序文章管理系统开发实现
  • 5种隐蔽的外挂获取执行时机方法介绍
  • Ubuntu 上手动安装 Go 环境并解决“可执行文件格式错误”
  • 反射、枚举以及lambda表达式
  • 某些网站不允许复制怎么办
  • 蓝桥杯 4. 卡片换位