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 是一种开源消息代理软件,基于 AMQP(高级消息队列协议)构建,用于异步传输数据,帮助我们解耦系统、削峰流量、处理高并发。本指南将详细介绍 RabbitMQ 的架构设计、使用场景、安装步骤以及一些高级应用…...
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,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面板的移动控制和实际设备的顶部摄像头/底部摄像头要一致,这样才能和贴板子时的实际操作方向对应起来。 …...
数据库建表规范【记录】
建表规约 【强制】创建表时必须显式指定表存储引擎类型,如无特殊需求,一律为InnoDB。 【强制】必须有行数据的创建时间字段create_date和最后更新时间字段edit_date。 【强制】自增主键命名必须是id,关联表外键命名xxyyzz_id;业务…...
css的动画属性
CSS动画属性是CSS3的一个重要特性,它允许你创建平滑的过渡效果,增强用户的交互体验。CSS动画可以通过keyframes规则和animation属性来创建。 animation属性 animation属性是一个简写属性,用于设置动画的多个属性,包括动画名称、…...
【Ubuntu】PlantUML工具 | 安装 | 语法 | 使用工具画序列图
🌱 PlantUML是一个通用性很强的工具,可以快速、直接地创建各种图表。 目录 1 安装 2 使用PlantUML画序列图 ① 语法 ②示例和效果 利用简单直观的语言,用户可以毫不费力地绘制各种类型的图表。PlantUML 是一个开源项目,支持快速绘制:• 时序图• 用例图• 类图• 对...
微信步数C++
题目: 样例解释: 【样例 #1 解释】 从 (1,1) 出发将走 2 步,从 (1,2) 出发将走 4 步,从 (1,3) 出发将走 4 步。 从 (2,1) 出发将走 2 步,从 (2,2) 出发将走 3 步,从 (2,3) 出发将走 3 步。 从 (3,1) 出发将…...
AI写作工具大比拼:揭秘Claude的神秘魅力以及如何订阅Claude
AI写作困境与Claude的惊喜表现 最近有很多朋友在吐槽AI写的文章不太行,我一看他的要求写的很清楚,已经把提示词都用到位了,例如:写作背景、写作要求等,都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有遇到…...
秋招内推2025-招联金融
【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...
GOM引擎启动后M2提示Invalid filename报错的解决办法
在架设一个GOM引擎版本的时候,启动M2就提示Invalid filename,之后的网关就没有办法再启动了,研究了半天也终于是弄好了,其实也简单,就是路径设置的不对,所以无法完成启动,很多人以为在控制台设置…...
CPU 多级缓存
在多线程并发场景下,普通的累加很可能错的 CPU 多级缓存 Main Memory : 主存Cache : 高速缓存,数据的读取存储都经过此高速缓存CPU Core : CPU 核心Bus : 系统总线 CPU Core 和 Cache 通过快速通道连接,Main menory 和 Cache 都挂载到 Bus 上…...
Chrome浏览器调用ActiveX控件--allWebOffice控件功能介绍
allWebOffice控件概述 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用(阅读、编辑、保存等),支持编辑文档时保留修改痕迹,支持书签位置内容动态填充,支持公文套红,支持文档保护控制等诸多办公功…...
JavaScript-下篇
上篇我们学习了,一些基础语法和函数,现在我们学习下篇,主要包括,对象和事件。而对象又包括,数组Arrays,String字符串,BOM,DOM等 JS对象 Arrays数组 数组是一种特殊的对象,用于存储…...
STM32-HAL库驱动DHT11温湿度传感器 --2024.9.28
目录 一、教程简介 二、驱动原理讲解 (一)通信4步骤 (二)传感器数据解析 三、CubeMX生成底层代码 (一)基础配置 (二)配置DHT11的驱动引脚 (三)配置串口 四…...
使用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,需要先安装git工具。 工具网站地址:https://git-scm.com/downloads 安装完成后,在terminal命令行输入git --version可以查看到git的版本。 二、登录gitee 我们先在 gitee上注册账号并登录。gitee官网&#x…...
融媒体服务中PBO进行多重采样抗锯齿(MSAA)
如果不理解pbo 那先去了解概念,在此不再解释,这是我为了做融合服务器viewpointserver做的一部分工作,融合服务器的功能是将三维和流媒体,AI融合在一起,viewpointserver会直接读取三维工程的文件,同时融合rt…...
说说BPMN概念及应用
BPMN(Business Process Modeling and Notation)即业务流程建模与标注,是一种由OMG(Object Management Group,对象管理组织)制定的业务流程建模语言。以下是对BPMN标准的详细解释: 一、BPMN的起…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
Python网页自动化Selenium中文文档
1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
React核心概念:State是什么?如何用useState管理组件自己的数据?
系列回顾: 在上一篇《React入门第一步》中,我们已经成功创建并运行了第一个React项目。我们学会了用Vite初始化项目,并修改了App.jsx组件,让页面显示出我们想要的文字。但是,那个页面是“死”的,它只是静态…...
