当前位置: 首页 > 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…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙

Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...

2025.6.9总结(利与弊)

凡事都有两面性。在大厂上班也不例外。今天找开发定位问题&#xff0c;从一个接口人不断溯源到另一个 接口人。有时候&#xff0c;不知道是谁的责任填。将工作内容分的很细&#xff0c;每个人负责其中的一小块。我清楚的意识到&#xff0c;自己就是个可以随时替换的螺丝钉&…...