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

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. 消息路由: 交换机会根据定义的规则将消息路由到一个或多个队列。
  3. 消息存储: 消息存储在队列中,等待被消费者消费。
  4. 消息消费: 消费者从队列中获取消息并处理。

内部原理

1. 队列管理
  • 队列中的消息在被消费者消费前,一直保留在队列中。
  • 每个队列只能存在于一个节点上,但其元数据会在所有集群节点间共享。
2. 集群
  • RabbitMQ 支持集群模式,允许水平扩展。
  • 集群中的所有节点共享相同的元数据(队列、交换机、绑定等),但实际的消息数据只存储在一个节点上。
3. 持久化与内存
  • RabbitMQ 可以将消息存储在内存或磁盘上。
  • 持久化消息确保即使服务重启也能保证消息不丢失。
4. 性能优化
  • RabbitMQ 使用 Erlang 实现,Erlang 以其轻量级进程和高并发能力而闻名。
  • 使用预取机制来减少网络往返延迟,提高消息处理速度。

高级特性

1. 消息确认
  • 消费者可以确认已正确处理的消息,以避免消息丢失。
  • 如果消费者崩溃,未确认的消息将重新发布。
2. 消息过期
  • 可以为消息设置TTL(Time To Live)属性,超过该时间的消息将自动被删除。
3. 镜像队列
  • 在集群环境中,可以配置镜像队列,使得队列的数据在多个节点上都有副本,提高可用性。

总结

RabbitMQ 的架构设计考虑到了可伸缩性、可靠性和灵活性。通过使用不同的交换机类型、队列管理和集群技术,RabbitMQ 能够满足复杂的应用场景需求,包括但不限于消息的发布/订阅、任务队列、事件驱动架构等。

案例应用

为了提供一个具体的代码示例,我们可以考虑一个简单的场景:一个系统需要发送电子邮件通知,使用RabbitMQ来异步处理这些邮件通知。

在这个例子中,我们将使用 Java 和 Spring Boot 框架来创建一个简单的服务,它包括以下几个部分:

  1. RabbitMQ 配置 - 设置RabbitMQ连接和队列。
  2. 生产者 - 当用户下单时,发送一条消息到RabbitMQ队列。
  3. 消费者 - 监听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.propertiesapplication.yml文件来完成。

这个例子展示了如何使用RabbitMQ进行异步消息处理的基本原理。你可以在此基础上扩展功能和改进代码结构。

😍😍 海量H5小游戏、微信小游戏、Web casualgame源码😍😍
😍😍试玩地址: https://www.bojiogame.sg😍😍
😍看上哪一款,需要源码的csdn私信我😍

————————————————

​最后我们放松一下眼睛
在这里插入图片描述

相关文章:

RabbitMq架构原理剖析及应用

文章目录 RabbitMQ 架构组件1. **Broker** (Broker Server)2. **Exchange**3. **Queue**4. **Producer** (消息生产者)5. **Consumer** (消息消费者)6. **Virtual Hosts** (虚拟主机) 工作流程内部原理1. **队列管理**2. **集群**3. **持久化与内存**4. **性能优化** 高级特性1…...

c# 对接第三方接口实现签名

官网文档要求如下&#xff1a; Sign算法说明 举例&#xff1a;假设请求参数键值对如下 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的作用是什么&#xff0c;字符串追加。 2.我们进行模仿&#xff0c;我们先将arr1不断&#xff0c;直到“\0”,我们加在后面。 //模拟实现strcat(字符串追加) char* my_strcat(char* arr1, const char* arr2) {assert(arr1 && arr2);char ret arr1;…...

HTTP简单概述

一. HTTP HTTP&#xff08;HyperText Transfer Protocol&#xff09;是用于在客户端和服务器之间传输超文本数据&#xff08;如HTML&#xff09;的应用层协议。它是万维网的基础协议&#xff0c;定义了浏览器和服务器之间如何请求和传输文档。HTTP有多个版本&#xff0c;每个版…...

掌握PyCharm代码片段管理器:提升编码效率的秘诀

掌握PyCharm代码片段管理器&#xff1a;提升编码效率的秘诀 PyCharm作为业界领先的集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了许多便利的功能来提升开发者的编码效率&#xff0c;其中之一就是代码片段管理器。代码片段管理器允许开发者保存、管理和重用代码模…...

MyBatis动态代理和映射器

目录 1、映射器简介 &#xff08;1&#xff09;什么是mapper动态代理&#xff1f; &#xff08;2&#xff09;动态代理的规范 &#xff08;3&#xff09;如何使用动态代理 &#xff08;4&#xff09;为什么学映射器 &#xff08;5&#xff09;映射器与接口 &#xff08;…...

ShardingSphere中的ShardingJDBC常见分片算法的实现

文章目录 ShardingJDBC快速入门修改雪花算法和分表策略核心概念分片算法简单INLINE分片算法STANDARD标准分片算法COMPLEX_INLINE复杂分片算法CLASS_BASED自定义分片算法HINT_INLINE强制分片算法 注意事项 ShardingJDBC Git地址 快速入门 现在我存在两个数据库&#xff0c;并…...

SpringBoot整合Flink CDC实时同步postgresql变更数据,基于WAL日志

SpringBoot整合Flink CDC实时同步postgresql变更数据&#xff0c;基于WAL日志 一、前言二、技术介绍&#xff08;Flink CDC&#xff09;1、Flink CDC2、Postgres CDC 三、准备工作四、代码示例五、总结 一、前言 在工作中经常会遇到要实时获取数据库&#xff08;postgresql、m…...

ThinkPHP事件的使用

技术说明 1.ThinkPHP版本&#xff1a;支持6.0、8.0 2.使用场景&#xff1a;用户登陆后日志记录、通知消息发送等主流程、次流程分离等场景 3.说明&#xff1a;网上很多帖子说的不明不白的&#xff0c;建议大家自己手动尝试总结一下 4.事件手动绑定的时候&#xff0c;一定要…...

【Nuxt】服务端渲染 SSR

SSR 概述 服务器端渲染全称是&#xff1a;Server Side Render&#xff0c;在服务器端渲染页面&#xff0c;并将渲染好HTML返回给浏览器呈现。 SSR应用的页面是在服务端渲染的&#xff0c;用户每请求一个SSR页面都会先在服务端进行渲染&#xff0c;然后将渲染好的页面&#xf…...

Spring Boot整合WebSocket

说明&#xff1a;本文介绍如何在Spirng Boot中整合WebSocket&#xff0c;WebSocket介绍&#xff0c;参考下面这篇文章&#xff1a; WebSocket 原始方式 原始方式&#xff0c;指的是使用Spring Boot自己整合的方式&#xff0c;导入的是下面这个依赖 <dependency><g…...

《LeetCode热题100》---<5.③普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 方法一&#xff1a;将数组视为哈希表 class Solution {public int firstMissingPosi…...

Cocos Creator文档学习记录

Cocos Creator文档学习记录 一、什么是Cocos Creator 官方文档链接&#xff1a;Hello World | Cocos Creator 百度百科&#xff1a;Cocos Creator_百度百科 Cocos Creator包括开发和调试、商业化 SDK 的集成、多平台发布、测试、上线这一整套工作流程&#xff0c;可多次的迭…...

插入数据优化 ---大批量数据插入建议使用load

一.insert优化 1.批量插入 2.手动提交事务 3.主键顺序插入 二.大批量插入数据 如果一次性需要插入大批量数据,使用insert语句插入性能较低,此时可以使用MySQL数据库提供的load指令进行插入。操作如下 1.客户端连接服务端时,加入参数 --local-infine mysql --local-infine…...

【Linux】一篇总结!什么是重定向?输出重定向的作用是什么?什么又是追加重定向?

欢迎来到 CILMY23 的博客 &#x1f3c6;本篇主题为&#xff1a;一篇总结&#xff01;什么是重定向&#xff1f;输出重定向的作用是什么&#xff1f;什么又是追加重定向&#xff1f; &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Py…...

svn软件总成全内容

SVN软件总成 概述&#xff1a;本文为经验型文档 目录 D:\安装包\svn软件总成 的目录D:\安装包\svn软件总成\svn-base添加 的目录D:\安装包\svn软件总成\tools 的目录D:\安装包\svn软件总成\tools\sqlite-tools-win32-x86-3360000 的目录D:\安装包\svn软件总成\安装包-----bt lo…...

[激光原理与应用-118]:电源系统的接地详解:小信号的噪声干扰优化,从良好外壳接地开始

目录 一、电路的基本原理&#xff1a;电流回路 1、电流回路的基本概念 2、电流回路的特性 3、电流回路的类型 4、电流回路的应用 五、电流回路的注意事项 二、交流设备的接地 1.1 概述 1、交流工作接地的定义 2、交流工作接地的作用 3、交流工作接地的规范要求 4、…...

回测本身就是一种过度拟合?

这也许是一个絮絮叨叨的专题&#xff0c;跟大伙儿唠一唠量化相关的小问题&#xff0c;有感而发写到哪算哪&#xff0c;这是第一期&#xff0c;先唠个10块钱的~ 前段时间在某乎上看到这样一个问题『您怎么理解回测本身就是一种过度拟合&#xff1f;』 个人看来&#xff0c;回测本…...

什么是Arduino?

Arduino是一款便捷灵活、方便上手的开源电子原型平台&#xff0c;由欧洲的一个开发团队于2005年冬季开发。以下是关于Arduino的详细介绍&#xff1a; 一、基本概述 定义&#xff1a;Arduino是一个基于开放源代码的软硬件平台&#xff0c;它让电子设计更加简单快捷。通过Arduin…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

TJCTF 2025

还以为是天津的。这个比较容易&#xff0c;虽然绕了点弯&#xff0c;可还是把CP AK了&#xff0c;不过我会的别人也会&#xff0c;还是没啥名次。记录一下吧。 Crypto bacon-bits with open(flag.txt) as f: flag f.read().strip() with open(text.txt) as t: text t.read…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...