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

RabbitMQ 入门到精通指南

RabbitMQ 是一种开源消息代理软件,基于 AMQP(高级消息队列协议)构建,用于异步传输数据,帮助我们解耦系统、削峰流量、处理高并发。本指南将详细介绍 RabbitMQ 的架构设计、使用场景、安装步骤以及一些高级应用,帮助你快速从入门到精通。

### 一、消息中间件的概念

消息中间件是一种基于队列模型的数据传输工具,支持 **异步/同步** 传输数据,用于高并发环境下实现异步解耦、削峰降负。

#### 1.1 消息中间件的作用


- **支撑高并发**:在大流量场景下,将请求存放于队列中,逐步处理。
- **异步解耦**:将任务拆分为独立的处理环节,解耦不同业务逻辑。
- **削峰降负**:应对短时间内的流量高峰,避免系统崩溃。
- **降低耦合度**:松耦合架构,增强系统可扩展性。

#### 1.2 传统 HTTP 请求的局限


- **高并发压力**:当客户端大量请求时,服务器可能因资源不足而崩溃。
- **阻塞等待**:耗时业务逻辑会导致客户端长时间等待,降低用户体验。
- **幂等性问题**:客户端超时重试可能引发多次重复操作,影响数据一致性。

### 二、RabbitMQ 的应用场景

RabbitMQ 适用于以下几类场景:
1. **异步发送短信**:例如用户注册成功后,发送异步通知短信。
2. **异步发送优惠券**:用户注册时,异步发放优惠券。
3. **耗时任务处理**:复杂的业务逻辑可以交由 RabbitMQ 处理,减少主线程压力。

### 三、RabbitMQ 的工作模式

RabbitMQ 提供了多种工作模式,满足不同场景下的消息传输需求。

#### 3.1 简单队列模式(点对点)


生产者将消息发送至队列,消费者从队列中取出消息并处理,每条消息只能被一个消费者消费。

#### 3.2 工作队列模式(公平分配)


多个消费者从同一个队列中取消息,但每个消费者分配的消息数量可根据处理能力调整,避免“平均分配”造成的效率问题。

#### 3.3 发布/订阅模式


消息从交换机(Exchange)广播至多个队列,适用于多个消费者同时处理相同消息的场景。

#### 3.4 路由模式(Routing)


基于路由键(Routing Key)将消息投递到不同的队列,实现精准消息传递。

#### 3.5 通配符模式(Topic)


基于通配符(# 或 *)的路由规则,将消息投递到符合条件的队列,支持复杂的消息过滤和分发策略。

### 四、RabbitMQ 安装与配置

#### 4.1 安装步骤


1. **安装 Erlang**:RabbitMQ 依赖 Erlang 语言,先下载安装 Erlang 并配置环境变量。
2. **安装 RabbitMQ**:从官方网站下载并安装 RabbitMQ。
3. **启动 RabbitMQ**:通过 `net start RabbitMQ` 命令启动 RabbitMQ 服务。
4. **管理平台启用**:使用以下命令启用管理插件,并通过 http://127.0.0.1:15672 访问管理控制台:
 

rabbitmq-plugins enable rabbitmq_management

#### 4.2 Virtual Hosts 配置


RabbitMQ 提供类似 MySQL 数据库的权限管理机制。通过 Virtual Hosts 来实现不同业务的隔离,每个 Virtual Host 都独立管理其队列、交换机和消息。

### 五、RabbitMQ Java 实战

在 Java 项目中使用 RabbitMQ 非常简单。以下是生产者和消费者的基本实现示例。

#### 5.1 Maven 依赖


在你的 `pom.xml` 中添加 RabbitMQ 的依赖:
 

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

#### 5.2 生产者代码


生产者负责将消息发送至 RabbitMQ 队列:

 

public class Producer {private static final String QUEUE_NAME = "example_queue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);String message = "Hello RabbitMQ!";channel.basicPublish("", QUEUE_NAME, null, message.getBytes());System.out.println(" [x] Sent '" + message + "'");}}
}

#### 5.3 消费者代码


消费者负责从队列中接收消息并处理:
 

public class Consumer {private static final String QUEUE_NAME = "example_queue";public static void main(String[] args) throws Exception {ConnectionFactory factory = new ConnectionFactory();factory.setHost("localhost");try (Connection connection = factory.newConnection();Channel channel = connection.createChannel()) {channel.queueDeclare(QUEUE_NAME, false, false, false, null);System.out.println(" [*] Waiting for messages.");DeliverCallback deliverCallback = (consumerTag, delivery) -> {String message = new String(delivery.getBody(), "UTF-8");System.out.println(" [x] Received '" + message + "'");};channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });}}
}

### 六、RabbitMQ 高级特性

#### 6.1 消息确认机制


RabbitMQ 提供了消息确认机制,确保消息成功被消费,避免消息丢失。生产者可以使用 **Confirm 机制** 来确保消息成功投递:
 

channel.confirmSelect();
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
boolean confirmed = channel.waitForConfirms();

#### 6.2 持久化消息


为了防止 RabbitMQ 崩溃导致消息丢失,我们可以将消息持久化到硬盘:

channel.queueDeclare(QUEUE_NAME, true, false, false, null);


这样即使 RabbitMQ 重启,消息也不会丢失。

#### 6.3 幂等性与重复消费问题


RabbitMQ 在默认重试机制下,可能会导致消息被重复消费。为了解决这个问题,我们可以通过 **全局唯一 ID** 来实现幂等性。例如,生产者在每个消息中加入唯一的消息 ID,消费者在处理时先检查消息是否已处理,避免重复操作。

### 七、RabbitMQ 的消息模式

#### 7.1 工作队列模式(公平分发)


使用 `basicQos(1)` 可以设置 RabbitMQ 每次只向消费者发送一条消息,只有在消费者确认消费完成后,才会继续发送下一条消息,实现能者多劳:
 

channel.basicQos(1);

#### 7.2 发布/订阅模式(Fanout Exchange)


Fanout Exchange 会将消息广播至绑定它的所有队列,实现消息的广播分发。

生产者代码:
 

channel.exchangeDeclare("logs", "fanout");
channel.basicPublish("logs", "", null, message.getBytes());

消费者代码:
 

channel.queueBind(queueName, "logs", "");
channel.basicConsume(queueName, true, deliverCallback, consumerTag -> { });

### 八、RabbitMQ 的可靠性保障

#### 8.1 消息不丢失的保障


RabbitMQ 提供了多种机制来保障消息的可靠性:
- **消息持久化**:消息写入硬盘,确保系统宕机后依然存在。
- **消息确认机制**:确保消息从生产者到消费者的全链路可靠传递。
- **死信队列**:未成功消费的消息可以转入死信队列,以备后续处理。

### 九、总结

RabbitMQ 是一款功能强大、性能卓越的消息中间件,广泛应用于异步通信和高并发处理场景。通过使用 RabbitMQ,开发者可以构建更加灵活、可靠的分布式系统。本篇博客详细介绍了 RabbitMQ 的基础概念、安装配置、Java 实战以及高级功能,希望能够帮助你快速掌握这款强大的工具。

---

希望这篇博客能帮助你更加全面、深入地理解 RabbitMQ,顺利应用于你的项目中!

相关文章:

RabbitMQ 入门到精通指南

RabbitMQ 是一种开源消息代理软件&#xff0c;基于 AMQP&#xff08;高级消息队列协议&#xff09;构建&#xff0c;用于异步传输数据&#xff0c;帮助我们解耦系统、削峰流量、处理高并发。本指南将详细介绍 RabbitMQ 的架构设计、使用场景、安装步骤以及一些高级应用&#xf…...

ARM base instruction -- movz

Move wide with zero moves an optionally-shifted 16-bit immediate value to a register. 用零移动宽值将可选移位的16位即时值移动到寄存器。即把立即数移动寄存器前先把寄存器清零。 32-bit variant MOVZ <Wd>, #<imm>{, LSL #<shift>} 64-bit var…...

安装jdk安装开发环境与maven

1.下载maven 链接: https://pan.baidu.com/s/1gTmIWBFBdIQob0cqGG3E_Q 提取码: 42ck&#xff0c;apache-maven-3.8.4-bin.zip 2.安装java jdk yum install -y java-1.8.0-openjdk-devel 3.在/opt目录下新建目录 mkdir /opt/maven 4.将apache-maven-3.8.4-bin.zip上传到/opt/ma…...

openpnp - 图像传送方向要在高级校正之前设置好

文章目录 openpnp - 图像传送方向要在高级校正之前设置好笔记图像传送方向的确定END openpnp - 图像传送方向要在高级校正之前设置好 笔记 图像传送方向和JOG面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致&#xff0c;这样才能和贴板子时的实际操作方向对应起来。 …...

数据库建表规范【记录】

建表规约 【强制】创建表时必须显式指定表存储引擎类型&#xff0c;如无特殊需求&#xff0c;一律为InnoDB。 【强制】必须有行数据的创建时间字段create_date和最后更新时间字段edit_date。 【强制】自增主键命名必须是id&#xff0c;关联表外键命名xxyyzz_id&#xff1b;业务…...

css的动画属性

CSS动画属性是CSS3的一个重要特性&#xff0c;它允许你创建平滑的过渡效果&#xff0c;增强用户的交互体验。CSS动画可以通过keyframes规则和animation属性来创建。 animation属性 animation属性是一个简写属性&#xff0c;用于设置动画的多个属性&#xff0c;包括动画名称、…...

【Ubuntu】PlantUML工具 | 安装 | 语法 | 使用工具画序列图

🌱 PlantUML是一个通用性很强的工具,可以快速、直接地创建各种图表。 目录 1 安装 2 使用PlantUML画序列图 ① 语法 ②示例和效果 利用简单直观的语言,用户可以毫不费力地绘制各种类型的图表。PlantUML 是一个开源项目,支持快速绘制:• 时序图• 用例图• 类图• 对...

微信步数C++

题目&#xff1a; 样例解释&#xff1a; 【样例 #1 解释】 从 (1,1) 出发将走 2 步&#xff0c;从 (1,2) 出发将走 4 步&#xff0c;从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步&#xff0c;从 (2,2) 出发将走 3 步&#xff0c;从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…...

AI写作工具大比拼:揭秘Claude的神秘魅力以及如何订阅Claude

AI写作困境与Claude的惊喜表现 最近有很多朋友在吐槽AI写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有遇到…...

秋招内推2025-招联金融

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递&#xff09; 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...

GOM引擎启动后M2提示Invalid filename报错的解决办法

在架设一个GOM引擎版本的时候&#xff0c;启动M2就提示Invalid filename&#xff0c;之后的网关就没有办法再启动了&#xff0c;研究了半天也终于是弄好了&#xff0c;其实也简单&#xff0c;就是路径设置的不对&#xff0c;所以无法完成启动&#xff0c;很多人以为在控制台设置…...

CPU 多级缓存

在多线程并发场景下&#xff0c;普通的累加很可能错的 CPU 多级缓存 Main Memory : 主存Cache : 高速缓存&#xff0c;数据的读取存储都经过此高速缓存CPU Core : CPU 核心Bus : 系统总线 CPU Core 和 Cache 通过快速通道连接&#xff0c;Main menory 和 Cache 都挂载到 Bus 上…...

Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍

allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功…...

JavaScript-下篇

上篇我们学习了&#xff0c;一些基础语法和函数&#xff0c;现在我们学习下篇&#xff0c;主要包括,对象和事件。而对象又包括&#xff0c;数组Arrays&#xff0c;String字符串&#xff0c;BOM&#xff0c;DOM等 JS对象 Arrays数组 数组是一种特殊的对象&#xff0c;用于存储…...

STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28

目录 一、教程简介 二、驱动原理讲解 &#xff08;一&#xff09;通信4步骤 &#xff08;二&#xff09;传感器数据解析 三、CubeMX生成底层代码 &#xff08;一&#xff09;基础配置 &#xff08;二&#xff09;配置DHT11的驱动引脚 &#xff08;三&#xff09;配置串口 四…...

使用C语言获取iostat中的await值的方法和方案

使用C语言获取iostat中的await值的方法和方案 1. 准备工作2. 调用iostat命令并获取输出3. 解析iostat输出4. 完整实现和错误处理5. 注意事项在Linux系统中,iostat命令是sysstat软件包的一部分,用于监控系统的CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况和负载信息。其…...

阿里云域名解析和备案

文章目录 1、域名解析2、新手引导3、ICP备案 1、域名解析 2、新手引导 3、ICP备案...

gitee公钥设置、创建库及使用

简介 一、如何安装git 使用gitee&#xff0c;需要先安装git工具。 工具网站地址&#xff1a;https://git-scm.com/downloads 安装完成后&#xff0c;在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…...

融媒体服务中PBO进行多重采样抗锯齿(MSAA)

如果不理解pbo 那先去了解概念&#xff0c;在此不再解释&#xff0c;这是我为了做融合服务器viewpointserver做的一部分工作&#xff0c;融合服务器的功能是将三维和流媒体&#xff0c;AI融合在一起&#xff0c;viewpointserver会直接读取三维工程的文件&#xff0c;同时融合rt…...

说说BPMN概念及应用

BPMN&#xff08;Business Process Modeling and Notation&#xff09;即业务流程建模与标注&#xff0c;是一种由OMG&#xff08;Object Management Group&#xff0c;对象管理组织&#xff09;制定的业务流程建模语言。以下是对BPMN标准的详细解释&#xff1a; 一、BPMN的起…...

【微服务】初识(day1)

基础概念 集群 集群是将一个系统完整的部署到多个服务器&#xff0c;每个服务器提供系统的所有服务&#xff0c;多个服务器可以通过负载均衡完成任务&#xff0c;每个服务器都可以称为集群的节点。 分布式 分布式是将一个系统拆分为多个子系统&#xff0c;多个子系统部署在…...

15分钟学 Python 第40天:Python 爬虫入门(六)第一篇

Day40 &#xff1a;Python 爬取豆瓣网前一百的电影信息 1. 项目背景 在这个项目中&#xff0c;我们将学习如何利用 Python 爬虫技术从豆瓣网抓取前一百部电影的信息。通过这一练习&#xff0c;您将掌握网页抓取的基本流程&#xff0c;包括发送请求、解析HTML、存储数据等核心…...

分层解耦-05.IOCDI-DI详解

一.依赖注入的注解 在我们的项目中&#xff0c;EmpService的实现类有两个&#xff0c;分别是EmpServiceA和EmpServiceB。这两个实现类都加上Service注解。我们运行程序&#xff0c;就会报错。 这是因为我们依赖注入的注解Autowired默认是按照类型来寻找bean对象的进行依赖注入…...

HCIP-HarmonyOS Application Developer 习题(六)

&#xff08;多选&#xff09;1、Harmonyos多窗口交互能力提供了以下哪几种交互方式? A. 平行视界 B.全局消息通知 C.分屏 D.悬浮窗 答案&#xff1a;ACD 分析&#xff1a;系统提供了悬浮窗、分屏、平行视界三种多窗口交互&#xff0c;为用户在大屏幕设备上的多任务并行、便捷…...

【电路基础 · 3】实际电压源 实际电流源;两种电源的等效情况;戴维南模型 诺顿模型(自用)

总览 1.实际电源的两种模型和它们的等效变换 2.两种电源的等效情况 3.戴维南模型 && 诺顿模型 一、实际电源的两种模型和它们的等效变换 1.实际电压源 实际电压源不允许短路。因为它的内阻太小&#xff0c;如果短路&#xff0c;电流很大&#xff0c;可能会烧毁电源…...

案例-猜数字游戏

文章目录 效果展示初始画面演示视频 代码区 效果展示 初始画面 演示视频 猜数字游戏 代码区 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,…...

POI数据的处理与分析

POI概念 POI&#xff08;Point of Interest&#xff0c;兴趣点&#xff09;数据指的是地理空间数据中的一类&#xff0c;表示某一具体地点或位置的信息。通常&#xff0c;这些数据包含位置坐标&#xff08;经纬度&#xff09;、名称、地址、类别和其他相关信息。POI 数据广泛应…...

ansible部分模块学习

ansible模块学习 copy模块 copy模块srcsource 源⽂件destdestination ⽬标backupbackupyes 则会在覆盖前进⾏备份mode修改权限owner修改为指定所有者group修改为指定⽤户组 案例1&#xff1a;传输/root/work/scripts/net-tools-install.sh⽂件到/opt/net-tools-install.sh …...

数据库(MySQL):使用命令从零开始在Navicat创建一个数据库及其数据表(二).设置主键自增等特点

前言 在上一节中&#xff0c;主要介绍了 Navicat Premium 17 的使用以及创建一个基础的表格。当时只设置了给数据表补充字段&#xff0c;没有设置给数据表删除字段。现在补充一下。 ALTER TABLE student ADD test int(4); 给名为 student 的数据表添加 test 列&#xf…...

SQL第13课——创建高级联结

本课讲另外一些联结&#xff08;含义和使用方法&#xff09;&#xff0c;如何使用表别名&#xff0c;如何对被联结的表使用聚集函数。 13.1 使用表别名 第7课中使用别名引用被检索的表列&#xff0c;给列起别名的语法如下&#xff1a; SQL除了可以对列名和计算字段使用别名&a…...