RabbitMq架构原理剖析及应用
文章目录
- RabbitMQ 架构组件
- 1. **Broker** (Broker Server)
- 2. **Exchange**
- 3. **Queue**
- 4. **Producer** (消息生产者)
- 5. **Consumer** (消息消费者)
- 6. **Virtual Hosts** (虚拟主机)
- 工作流程
- 内部原理
- 1. **队列管理**
- 2. **集群**
- 3. **持久化与内存**
- 4. **性能优化**
- 高级特性
- 1. **消息确认**
- 2. **消息过期**
- 3. **镜像队列**
- 总结
- 案例应用
RabbitMQ 是一个广泛使用的开源消息代理和队列服务器,它基于 AMQP(Advanced Message Queuing Protocol)标准,使用 Erlang 语言编写。RabbitMQ 提供了高可用性、灵活性和可扩展性,使其成为企业级应用程序中消息传递的首选解决方案之一。
RabbitMQ 架构组件
1. Broker (Broker Server)
这是 RabbitMQ 服务器实体,负责接收来自生产者的消息并将它们路由到队列。
2. Exchange
交换机定义了消息应该怎样路由到队列。有几种不同类型的交换机,比如 direct, fanout, topic 等。每种类型决定了消息如何被分发。
- Direct: 消息只发送到与特定routing key绑定的队列。
- Fanout: 消息广播到所有绑定到该交换机的队列。
- Topic: 允许使用通配符来绑定队列,可以根据模式匹配来发送消息。
3. Queue
队列是消息的容器,消息被存储在这里直到被消费者消费。每个消息会被送到一个或多个队列。
4. Producer (消息生产者)
生产者是向 RabbitMQ 发送消息的应用程序。
5. Consumer (消息消费者)
消费者是从 RabbitMQ 接收消息的应用程序。通常,消费者会订阅一个队列,并且一旦队列中有消息就会接收到消息。
6. Virtual Hosts (虚拟主机)
虚拟主机是 RabbitMQ 中的命名空间,用于隔离不同的应用环境或租户。每个虚拟主机都有自己的交换机、队列和绑定。
工作流程
- 消息发布: 生产者将消息发送到交换机。
- 消息路由: 交换机会根据定义的规则将消息路由到一个或多个队列。
- 消息存储: 消息存储在队列中,等待被消费者消费。
- 消息消费: 消费者从队列中获取消息并处理。
内部原理
1. 队列管理
- 队列中的消息在被消费者消费前,一直保留在队列中。
- 每个队列只能存在于一个节点上,但其元数据会在所有集群节点间共享。
2. 集群
- RabbitMQ 支持集群模式,允许水平扩展。
- 集群中的所有节点共享相同的元数据(队列、交换机、绑定等),但实际的消息数据只存储在一个节点上。
3. 持久化与内存
- RabbitMQ 可以将消息存储在内存或磁盘上。
- 持久化消息确保即使服务重启也能保证消息不丢失。
4. 性能优化
- RabbitMQ 使用 Erlang 实现,Erlang 以其轻量级进程和高并发能力而闻名。
- 使用预取机制来减少网络往返延迟,提高消息处理速度。
高级特性
1. 消息确认
- 消费者可以确认已正确处理的消息,以避免消息丢失。
- 如果消费者崩溃,未确认的消息将重新发布。
2. 消息过期
- 可以为消息设置TTL(Time To Live)属性,超过该时间的消息将自动被删除。
3. 镜像队列
- 在集群环境中,可以配置镜像队列,使得队列的数据在多个节点上都有副本,提高可用性。
总结
RabbitMQ 的架构设计考虑到了可伸缩性、可靠性和灵活性。通过使用不同的交换机类型、队列管理和集群技术,RabbitMQ 能够满足复杂的应用场景需求,包括但不限于消息的发布/订阅、任务队列、事件驱动架构等。
案例应用
为了提供一个具体的代码示例,我们可以考虑一个简单的场景:一个系统需要发送电子邮件通知,使用RabbitMQ来异步处理这些邮件通知。
在这个例子中,我们将使用 Java 和 Spring Boot 框架来创建一个简单的服务,它包括以下几个部分:
- RabbitMQ 配置 - 设置RabbitMQ连接和队列。
- 生产者 - 当用户下单时,发送一条消息到RabbitMQ队列。
- 消费者 - 监听RabbitMQ队列,并处理邮件发送。
首先,我们需要添加Spring Boot依赖项。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖项:
<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><!-- 其他依赖项 -->
</dependencies>
接下来是RabbitMQ的配置类:
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {public static final String QUEUE_NAME = "emailQueue";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME);}
}
这里定义了一个名为emailQueue的队列,用于存放邮件发送任务。
接着是生产者端的代码:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class EmailProducerService {private static final String QUEUE_NAME = "emailQueue";@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendEmail(String email, String subject, String body) {System.out.println("Sending message = " + body);// 创建一个包含邮件信息的对象Email emailMessage = new Email(email, subject, body);// 发送到队列this.rabbitTemplate.convertAndSend(QUEUE_NAME, emailMessage);}static class Email {private String to;private String subject;private String body;public Email(String to, String subject, String body) {this.to = to;this.subject = subject;this.body = body;}public String getTo() {return to;}public String getSubject() {return subject;}public String getBody() {return body;}}
}
这里定义了一个EmailProducerService类,它负责发送邮件消息到队列。
最后,我们编写消费者端的代码:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class EmailConsumerService {@RabbitListener(queues = "emailQueue")public void processEmail(Email email) {System.out.println("Received email: " + email.getBody());// 实现发送邮件的逻辑sendEmail(email.getTo(), email.getSubject(), email.getBody());}private void sendEmail(String to, String subject, String body) {// 这里可以使用JavaMailSender或其他邮件发送服务// 例如:// JavaMailSender mailSender = ...;// SimpleMailMessage message = new SimpleMailMessage();// message.setTo(to);// message.setSubject(subject);// message.setText(body);// mailSender.send(message);System.out.println("Email sent to: " + to + ", Subject: " + subject + ", Body: " + body);}
}
在上面的代码中,我们使用了@RabbitListener注解来监听emailQueue队列中的消息。当队列中有新消息时,processEmail方法会被调用,并发送邮件。
这个例子非常简单,但在实际应用中,你可能还需要处理错误、重试机制、日志记录等更复杂的情况。此外,你还需要配置RabbitMQ的连接参数,这可以通过application.properties或application.yml文件来完成。
这个例子展示了如何使用RabbitMQ进行异步消息处理的基本原理。你可以在此基础上扩展功能和改进代码结构。
————————————————
最后我们放松一下眼睛

相关文章:
RabbitMq架构原理剖析及应用
文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…...
c# 对接第三方接口实现签名
官网文档要求如下: Sign算法说明 举例:假设请求参数键值对如下 appkey : test2-xx page_no : 0 end_time : 2016-08-01 13:00:00 start_time : 2016-08-01 12:00:00 page_size : 40 sid : test2 timestamp : 1470042310 第一步 对数所有请求参数按照…...
数学建模评价类模型—层次分析法(无数据情况下)
目录 前言 一、评价类问题概述 二、AHP建模流程 1、过程描述 2、层次分析法—Matlab代码 三、权重计算 1、算术平均法 2、几何平均法 3、特征值法 目录 文章目录 前言 一、评价类问题概述 二、AHP建模流程 1、过程描述 2、层次分析法—Matlab代码 三、权重计算 算术平均法 前言…...
模拟实现strcat(字符串追加)
1.我们要知道stcat的作用是什么,字符串追加。 2.我们进行模仿,我们先将arr1不断,直到“\0”,我们加在后面。 //模拟实现strcat(字符串追加) char* my_strcat(char* arr1, const char* arr2) {assert(arr1 && arr2);char ret arr1;…...
HTTP简单概述
一. HTTP HTTP(HyperText Transfer Protocol)是用于在客户端和服务器之间传输超文本数据(如HTML)的应用层协议。它是万维网的基础协议,定义了浏览器和服务器之间如何请求和传输文档。HTTP有多个版本,每个版…...
掌握PyCharm代码片段管理器:提升编码效率的秘诀
掌握PyCharm代码片段管理器:提升编码效率的秘诀 PyCharm作为业界领先的集成开发环境(IDE),提供了许多便利的功能来提升开发者的编码效率,其中之一就是代码片段管理器。代码片段管理器允许开发者保存、管理和重用代码模…...
MyBatis动态代理和映射器
目录 1、映射器简介 (1)什么是mapper动态代理? (2)动态代理的规范 (3)如何使用动态代理 (4)为什么学映射器 (5)映射器与接口 (…...
ShardingSphere中的ShardingJDBC常见分片算法的实现
文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库,并…...
SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志
SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志 一、前言二、技术介绍(Flink CDC)1、Flink CDC2、Postgres CDC 三、准备工作四、代码示例五、总结 一、前言 在工作中经常会遇到要实时获取数据库(postgresql、m…...
ThinkPHP事件的使用
技术说明 1.ThinkPHP版本:支持6.0、8.0 2.使用场景:用户登陆后日志记录、通知消息发送等主流程、次流程分离等场景 3.说明:网上很多帖子说的不明不白的,建议大家自己手动尝试总结一下 4.事件手动绑定的时候,一定要…...
【Nuxt】服务端渲染 SSR
SSR 概述 服务器端渲染全称是:Server Side Render,在服务器端渲染页面,并将渲染好HTML返回给浏览器呈现。 SSR应用的页面是在服务端渲染的,用户每请求一个SSR页面都会先在服务端进行渲染,然后将渲染好的页面…...
Spring Boot整合WebSocket
说明:本文介绍如何在Spirng Boot中整合WebSocket,WebSocket介绍,参考下面这篇文章: WebSocket 原始方式 原始方式,指的是使用Spring Boot自己整合的方式,导入的是下面这个依赖 <dependency><g…...
《LeetCode热题100》---<5.③普通数组篇五道>
本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道:缺失的第一个正数(困难) 第五道:缺失的第一个正数(困难) 方法一:将数组视为哈希表 class Solution {public int firstMissingPosi…...
Cocos Creator文档学习记录
Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接:Hello World | Cocos Creator 百度百科:Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程,可多次的迭…...
插入数据优化 ---大批量数据插入建议使用load
一.insert优化 1.批量插入 2.手动提交事务 3.主键顺序插入 二.大批量插入数据 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下 1.客户端连接服务端时,加入参数 --local-infine mysql --local-infine…...
【Linux】一篇总结!什么是重定向?输出重定向的作用是什么?什么又是追加重定向?
欢迎来到 CILMY23 的博客 🏆本篇主题为:一篇总结!什么是重定向?输出重定向的作用是什么?什么又是追加重定向? 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Py…...
svn软件总成全内容
SVN软件总成 概述:本文为经验型文档 目录 D:\安装包\svn软件总成 的目录D:\安装包\svn软件总成\svn-base添加 的目录D:\安装包\svn软件总成\tools 的目录D:\安装包\svn软件总成\tools\sqlite-tools-win32-x86-3360000 的目录D:\安装包\svn软件总成\安装包-----bt lo…...
[激光原理与应用-118]:电源系统的接地详解:小信号的噪声干扰优化,从良好外壳接地开始
目录 一、电路的基本原理:电流回路 1、电流回路的基本概念 2、电流回路的特性 3、电流回路的类型 4、电流回路的应用 五、电流回路的注意事项 二、交流设备的接地 1.1 概述 1、交流工作接地的定义 2、交流工作接地的作用 3、交流工作接地的规范要求 4、…...
回测本身就是一种过度拟合?
这也许是一个絮絮叨叨的专题,跟大伙儿唠一唠量化相关的小问题,有感而发写到哪算哪,这是第一期,先唠个10块钱的~ 前段时间在某乎上看到这样一个问题『您怎么理解回测本身就是一种过度拟合?』 个人看来,回测本…...
什么是Arduino?
Arduino是一款便捷灵活、方便上手的开源电子原型平台,由欧洲的一个开发团队于2005年冬季开发。以下是关于Arduino的详细介绍: 一、基本概述 定义:Arduino是一个基于开放源代码的软硬件平台,它让电子设计更加简单快捷。通过Arduin…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》
🧠 LangChain 中 TextSplitter 的使用详解:从基础到进阶(附代码) 一、前言 在处理大规模文本数据时,特别是在构建知识库或进行大模型训练与推理时,文本切分(Text Splitting) 是一个…...
用 FFmpeg 实现 RTMP 推流直播
RTMP(Real-Time Messaging Protocol) 是直播行业中常用的传输协议。 一般来说,直播服务商会给你: ✅ 一个 RTMP 推流地址(你推视频上去) ✅ 一个 HLS 或 FLV 拉流地址(观众观看用)…...
WinUI3开发_使用mica效果
简介 Mica(云母)是Windows10/11上的一种现代化效果,是Windows10/11上所使用的Fluent Design(设计语言)里的一个效果,Windows10/11上所使用的Fluent Design皆旨在于打造一个人类、通用和真正感觉与 Windows 一样的设计。 WinUI3就是Windows10/11上的一个…...
