rabbitMQ 架构详解

news2024/12/16 2:00:30

RabbitMQ是一款使用Erlang语言开发的、实现了高级消息队列协议(AMQP)的开源消息中间件。以下是对其架构的详细解析:

核心组件

  1. Producer(生产者)

    • 负责生成消息,并将其发送到RabbitMQ。
    • 生产者通过AMQP协议与RabbitMQ通信,将消息发送到指定的Exchange。
  2. Consumer(消费者)

    • 负责从RabbitMQ接收消息并进行处理。
    • 消费者通过AMQP协议与RabbitMQ通信,从指定的Queue中接收消息。
  3. Exchange(交换机)

    • 负责将消息路由到不同的Queue。
    • RabbitMQ中有多种不同类型的交换机来支持不同的路由策略,包括Direct、Fanout、Topic和Headers等。
  4. Queue(队列)

    • 用于存储消息,直到消费者处理它们。
    • 队列是RabbitMQ的核心组件之一,它提供了持久化、排他性、自动删除等特性。
  5. Binding(绑定)

    • 定义了Exchange和Queue之间的关系,用于消息路由。
    • 通过Binding,Exchange可以知道如何将Producer发送过来的消息分发到哪些Queue上。
  6. Broker(消息代理/服务器)

    • 可以看作是一台RabbitMQ服务器,负责接收和分发消息。
    • 它包含了AMQP的全套基础组件,如Virtual Host(虚拟主机)等。
  7. Virtual Host(虚拟主机)

    • 出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中。
    • 类似于网络中的namespace概念,每个虚拟主机都有AMQP的全套基础组件,并且可以针对每个虚拟主机进行权限以及数据分配。
  8. Connection和Channel

    • 客户端与RabbitMQ进行交互时,首先需要建立一个TCP连接(Connection)。
    • 为了减少性能开销,RabbitMQ允许在一个Connection中建立多个Channel,这些Channel复用同一个Connection的TCP通道,提高性能。

工作原理

  1. 生产者发送消息

    • Producer将消息发送到指定的Exchange。
  2. Exchange路由消息

    • Exchange根据消息的属性和Binding规则,将消息路由到相应的Queue。
  3. Queue存储消息

    • Queue存储消息,直到消费者处理它们。消息会一直留在队列里,直到被消费者消费。
  4. 消费者接收消息

    • Consumer从Queue中接收消息并处理。多个消费者可以订阅同一个Queue,队列中的消息会被平均分摊给多个消费者进行处理。

工作流程

  1. 生产者发送消息:生产者通过网络连接将消息发送给 RabbitMQ 中的某个交换机。
  2. 交换机分发消息:交换机根据预设的路由键和绑定规则决定将消息发送到哪些队列。
  3. 队列存储消息:被选中的队列会接收到消息并将其保存起来,等待消费者来领取。
  4. 消费者获取消息:消费者通过订阅特定队列来获取其中的消息进行处理。一旦消息被成功处理,它就会从队列中删除。

组件详解

Broker(服务器节点)
  • 角色:作为消息中间件的核心部分,负责管理所有资源(如交换机、队列等),并处理客户端请求。
  • 特性
    • 支持集群部署,以提高可用性和扩展性。
    • 提供多种插件支持不同的功能需求,例如监控、认证授权等。
Exchange(交换机)
  • 类型
    • Direct Exchange:基于精确匹配的路由键进行消息路由。
    • Fanout Exchange:广播式地将消息发送给所有绑定的队列,忽略路由键。
    • Topic Exchange:使用模式匹配的方式选择性地将消息发送给符合条件的队列。
    • Headers Exchange:根据消息头属性而不是路由键来进行匹配。
Queue(队列)
  • 特点
    • 可以配置为持久化或非持久化,确保在服务重启后消息不会丢失。
    • 支持公平调度算法(Fair Dispatch),即优先分配较少任务的消费者。
    • 允许设置最大长度限制,超出时可以选择丢弃旧消息或拒绝新消息。
Binding(绑定)
  • 作用:建立交换机与队列之间的联系,同时指定路由规则。
  • 格式:由源(通常是交换机)、目标(通常是队列)及可选的路由键组成。
Virtual Hosts(虚拟主机)
  • 概念:类似于操作系统中的命名空间,用于隔离不同用户的资源,每个 vhost 可以拥有独立的一组交换机、队列和权限设置。
  • 用途:便于多租户环境下的资源管理和安全控制。

高级特性

持久化
  • 消息持久化:保证即使 RabbitMQ 宕机也能保留未被消费的消息。
  • 队列持久化:使队列本身在服务器重启后仍然存在。
镜像队列(Mirrored Queues)
  • 描述:为了实现高可用性,在集群环境中复制队列内容到其他节点上,当主节点故障时可以从备节点继续提供服务。
消息确认机制(Acknowledgments)
  • 意义:确保消息已被正确接收和处理。消费者可以向 RabbitMQ 发送 ACK 确认信号,只有收到 ACK 后才会认为该消息已经被成功处理。
死信队列(Dead Letter Exchanges/Queues, DLX/DLQ)
  • 目的:处理无法正常投递的消息,比如因为 TTL(Time-To-Live)过期或者达到最大重试次数而未能成功交付的消息会被转发到指定的 DLX/DLQ 中等待进一步处理。
延迟队列(Delayed Message Plugin)
  • 实现方式:利用插件形式添加对延迟消息的支持,允许设定消息的延迟时间,在这段时间内消息不会被立即发送给消费者。

架构特性

  1. 可靠性

    • RabbitMQ使用多种机制来保证可靠性,如持久化、传输确认及发布确认等。
    • 消息可以被存储在磁盘上,这样即使在RabbitMQ服务重启或遇到故障时,消息也不会丢失。
  2. 灵活的路由

    • 在消息进入Queue之前,通过Exchange来路由消息。不同的Exchange类型支持不同的路由策略,可以满足各种消息分发需求。
  3. 扩展性

    • 多个RabbitMQ节点可以组成一个集群,实现消息队列的高可用性和负载均衡。
    • 集群模式下,多个RabbitMQ节点共同工作,消息可以在节点之间进行复制和同步。
  4. 高可用性

    • 队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队列仍然可用。
  5. 多种协议支持

    • 除了原生支持AMQP协议外,RabbitMQ还支持STOMP、MQTT等多种消息中间件协议。
  6. 多语言客户端支持

    • RabbitMQ几乎支持所有常用语言,如Java、Python、Ruby、PHP、C#、JavaScript等。

应用场景

  1. 异步处理任务

    • 将耗时的任务放入消息队列中,由消费者异步处理。这种方式可以提高系统的响应速度和吞吐量。
  2. 系统解耦

    • 通过消息传递机制,不同的组件可以独立开发和部署,提高系统的可维护性和可扩展性。
  3. 消息驱动的架构

    • 通过消息传递机制,系统可以响应外部事件,实现复杂的业务逻辑。
  4. 分布式系统

    • 在分布式系统中,通过消息传递机制,不同的节点可以协同工作,实现分布式计算和数据处理。

综上所述,RabbitMQ是一个功能强大、灵活可靠的消息中间件,其架构设计和组件功能都充分满足了现代分布式系统的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2260241.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTFHub 技能树 Web RCE eval执行(学习记录)

eval执行 源代码 <?php if (isset($_REQUEST[cmd])) {eval($_REQUEST["cmd"]); } else {highlight_file(__FILE__); } ?> PHP代码显示&#xff0c;要求将命令赋值给cmd然后执行 先查看一下根目录文件 /?cmdsystem("ls"); 查看上一级目录找flag文…

人员离岗监测摄像机智能人员睡岗、逃岗监测 Python 语言结合 OpenCV

在安全生产领域&#xff0c;人员的在岗状态直接关系到生产流程的顺利进行和工作环境的安全稳定。人员离岗监测摄像机的出现&#xff0c;为智能人员睡岗、逃岗监测提供了高效精准的解决方案&#xff0c;而其中的核心技术如AI识别睡岗脱岗以及相关的算法盒子和常见的安全生产AI算…

Web day11 SpringBoot原理

目录 1.配置优先级&#xff1a; 2.Bean的管理&#xff1a; bean的作用域&#xff1a; 第三方bean&#xff1a; 方案一&#xff1a; 方案二&#xff1a; SpringBoot原理&#xff1a; 扫描第三方包&#xff1a; 方案1&#xff1a;ComponentScan 组件扫描 方案2&#xff1…

ECharts柱状图-柱图2,附视频讲解与代码下载

引言&#xff1a; 在数据可视化的世界里&#xff0c;ECharts凭借其丰富的图表类型和强大的配置能力&#xff0c;成为了众多开发者的首选。今天&#xff0c;我将带大家一起实现一个柱状图图表&#xff0c;通过该图表我们可以直观地展示和分析数据。此外&#xff0c;我还将提供…

VMware安装ubuntu22教程

文章目录 软件环境1、打开vmware&#xff0c;选择创建新的虚拟机2、选典型安装&#xff0c;然后点击下一步3、选择稍后安装操作系统&#xff0c;点击下一步4、版本选择Ubuntu 64位&#xff0c;点击下一步5、输入虚拟机名称和规划的安装盘符路径6、最大磁盘大小选择20G&#xff…

利用usb-cam包标定RealSense D435相机(未解决版)

一、 安装usb-cam包和标定数据包 usb_cam 包的主要作用是将 USB 摄像头的视频流转换为 ROS 可用的消息格式。 sudo apt-get install ros-melodic-usb-cam camera_calibration 包是 ROS 中用于相机标定的工具包&#xff0c;主要用于校准相机的内参和外参。 sudo apt-get ins…

Kafka系列教程 - Kafka 生产者 -2

1. 生产者简介 不管是把 Kafka 作为消息队列系统、还是数据存储平台&#xff0c;总是需要一个可以向 Kafka 写入数据的生产者和一个可以从 Kafka 读取数据的消费者&#xff0c;或者是一个兼具两种角色的应用程序。 使用 Kafka 的场景很多&#xff0c;诉求也各有不同&#xff…

基于卷积神经网络的图像二分类检测模型训练与推理实现教程 | 幽络源

前言 对于本教程&#xff0c;说白了&#xff0c;就是期望能通过一个程序判断一张图片是否为某个物体&#xff0c;或者说判断一张图片是否为某个缺陷。因为本教程是针对二分类问题&#xff0c;因此主要处理 是 与 不是 的问题&#xff0c;比如我的模型是判断一张图片是否为苹果…

SpringBoot集成JWT和Redis实现鉴权登录功能

目前市面上有许多鉴权框架&#xff0c;鉴权原理大同小异&#xff0c;本文简单介绍下利用JWT和Redis实现鉴权功能&#xff0c;算是抛砖引玉吧。 主要原理就是“令牌主动失效机制”&#xff0c;主要包括以下4个步骤&#xff1a; (1)利用拦截器LoginInterceptor实现所有接口登录拦…

初识Robot Framework测试框架

Robot Framework 是一款用 Python 编写的通用型测试框架&#xff0c;具备良好的可扩展性&#xff0c;支持关键字驱动&#xff0c;可以同时测试多种类型的客户端&#xff08;Web、PC、移动端&#xff09;或者接口&#xff0c;也可以进行分布式测试执行。常用于验收测试和验收测试…

Windows安装elasticsearch、Kibana以及IK分词器

一、下载 1.下载elasticsearch 访问官网Download Elasticsearch | Elastic&#xff0c;下载elasticsearch 2.下载 Kibana 访问Download Kibana Free | Get Started Now | Elastic &#xff0c;下载 Kibana 3. IK分词器下载 访问Gitee 极速下载/elasticsearch-analysis-ik选…

socket编程UDP-实现停等机制(接收确认、超时重传)

在下面博客中&#xff0c;我介绍了利用UDP模拟TCP连接、按数据包发送文件的过程&#xff0c;并附上完整源码。 socket编程UDP-文件传输&模拟TCP建立连接脱离连接&#xff08;进阶篇&#xff09;_udp socket发送-CSDN博客 下面博客实现的是滑动窗口机制&#xff1a; sock…

PHP项目从 php5.3 版本升级到 php8.3 版本时的一些问题和解决方法记录

一个原来的项目&#xff0c;因为业务需要&#xff0c;进行了PHP版本升级&#xff0c;从php5.3直接升级到php8.3。变化挺大的&#xff0c;原程序中有很多不再兼容&#xff0c;在此处进行一下记录。 一、Deprecated: 显式转换问题 报错内容&#xff1a;Deprecated: Implicit con…

在Liunx中安装JDK、Tomcat、mysql、lrzsz、Nginx

一.软件安装方式 在Linux系统中&#xff0c;安装软件的方式主要有四种&#xff0c;这四种安装方式的特点如下&#xff1a; 二.安装JDK 上述我们介绍了Linux系统软件安装的四种形式&#xff0c;接下来我们就通过第一种(二进制发 布包)形式来安装JDK。 在/下创建soft目录&…

LeetCode-hot100-73

https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envTypestudy-plan-v2&envIdtop-100-liked 84. 柱状图中最大的矩形 已解答 困难 相关标签 相关企业 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#x…

leetcode-73.矩阵置零-day5

class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

开源 AI 智能名片 S2B2C 商城小程序对私域流量运营的全方位助力

在当今竞争激烈的商业环境中&#xff0c;私域流量运营已成为企业实现可持续发展和提升竞争力的关键策略之一。开源 AI 智能名片 S2B2C 商城小程序凭借其独特的功能与特性&#xff0c;从多个维度为私域流量运营提供了强有力的支持与推动&#xff0c;以下将详细阐述其在各个方面的…

【razor】echo搭配relay功能分析

echo 要搭配relay 实现作者说relay在linux上跑,可以模拟丢包、延迟目前没看到如何模拟。relay监听9200,有俩作用 echopeer1 发relay,replay 把peer1的包给peer2 ,实现p2p能力。 接收端:采集后发送发给relay的 接收端的地址就是自己,的地址就是本地的9200,因此是让relay接…

Phoenix5.1.3安装

环境说明 准备三台服务器&#xff0c;分别为&#xff1a;bigdata141&#xff08;作为HBase主节点&#xff09;、bigdata142、bigdata143&#xff0c;已经搭建好HBase集群&#xff0c;我这边HBase版本为2.2.7另准备一台服务器&#xff0c;bigdata144&#xff0c;作为Phoenix客户…