当前位置: 首页 > 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私信我😍

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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【PostgreSQL教程】PostgreSQL UPDATE 语句
  • 数据库的基础的exists
  • java中字面量和golang中字面量区别
  • 掌握Java并发编程基础
  • 计算机网络(网络层)
  • 基于RFID技术的智能压缩机装配线优化方案
  • 2024年有哪些好用的文件加密软件?十款常用加密软件推荐
  • Docker 环境下使用 Traefik v3 和 MinIO 快速搭建私有化对象存储服务
  • Ubuntu 22.04 Docker安装笔记
  • python3 pyside6图形库学习笔记及实践(四)
  • 社交巨头与去中心化:解析Facebook在区块链的角色
  • 记录|LabVIEW从0开始【09~10】
  • 操作系统(信号处理)
  • 新160个crackme - 023-TraceMe
  • Rabbitmq中的死信队列
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 《Java编程思想》读书笔记-对象导论
  • Babel配置的不完全指南
  • CSS实用技巧
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • js数组之filter
  • SegmentFault 2015 Top Rank
  • supervisor 永不挂掉的进程 安装以及使用
  • TCP拥塞控制
  • Unix命令
  • Vue小说阅读器(仿追书神器)
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 关于Java中分层中遇到的一些问题
  • 简单易用的leetcode开发测试工具(npm)
  • 聊聊flink的BlobWriter
  • 区块链将重新定义世界
  • 新手搭建网站的主要流程
  • Mac 上flink的安装与启动
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 容器镜像
  • 说说我为什么看好Spring Cloud Alibaba
  • 昨天1024程序员节,我故意写了个死循环~
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​ArcGIS Pro 如何批量删除字段
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #HarmonyOS:Web组件的使用
  • #WEB前端(HTML属性)
  • #微信小程序:微信小程序常见的配置传旨
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (k8s)Kubernetes本地存储接入
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (poj1.2.1)1970(筛选法模拟)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)十分简易快速 自己训练样本 opencv级联haar分类器 车牌识别