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

RabbitMQ架构详解

文章目录

    • 概述
    • 架构详解
    • 核心组件
      • 虚拟主机(Virtual Host)
      • RabbitMQ 有几种广播类型

概述

RabbitMQ是⼀个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合
官网https://www.rabbitmq.com/getstarted.html

架构详解

在这里插入图片描述
在这里插入图片描述

RabbitMQ 是一个流行的开源消息队列系统,它实现了高级消息排队协议(AMQP)标准,提供了可靠的消息传递机制。下面是 RabbitMQ 的架构概述:

  1. 生产者(Producer):负责产生消息并发送到 RabbitMQ 服务器。消息可以包含任何类型的数据,例如 JSON、XML 等。
  2. 交换机(Exchange):接收来自生产者的消息,并将消息路由到一个或多个队列中。交换机有不同的类型,包括直连交换机(direct exchange)、主题交换机(topic exchange)、扇出交换机(fanout exchange)和头部交换机(headers exchange),每种类型的交换机都有不同的路由规则。
  3. 队列(Queue):消息最终存储在队列中,等待消费者处理。消费者可以订阅一个或多个队列,从队列中接收消息。
  4. 绑定(Binding):用于将交换机和队列连接起来,定义了消息的路由规则。
  5. 消费者(Consumer):订阅队列,并从中接收消息进行处理。
    RabbitMQ 的架构支持高度的灵活性和可扩展性,可以根据需求配置多个交换机、队列和消费者,以满足复杂的消息处理需求。通过合理设计交换机和绑定,可以实现灵活的消息路由和过滤功能。
    除了上述基本组件外,RabbitMQ 还包括虚拟主机(Virtual Host)、连接(Connection)、通道(Channel)等概念,用于提供更加复杂的消息处理和管理能力。
    总的来说,RabbitMQ 提供了一个强大且灵活的消息传递平台,适用于各种异步通信和消息处理场景。

核心组件

它们分别是Product、Cunsumer、Broker、Connection、Channel、Queue、Exchange、Binding、VHost。
Broker:接收和分发消息的应用,RabbitMQ Server就是 Message Broker
Virtual host:出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出多个vhost,每个用户在自己的 vhost 创建 exchange/queue 等
Connection:publisher/consumer 和 broker 之间的 TCP 连接
Channel:如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程序支持多线程,通常每个thread创建单独的 channel 进行通讯,AMQP method 包含了channel id 帮助客户端和message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销
Exchange:message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发消息到queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast)
Queue:消息最终被送到这里等待 consumer 取走
Binding:exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key。Binding 信息被保存到 exchange 中的查询表中,用于 message 的分发依据
ConnectionFactory(连接管理器):应用程序与 Rabbit 之间建立连接的管理器,程序代码中使用。
Channel(信道):消息推送使用的通道。
Exchange(交换器):用于接受、分配消息。
Queue(队列):用于存储生产者的消息。
RoutingKey(路由键):用于把生成者的数据分配到交换器上。
BindingKey(绑定键):用于把交换器的消息绑定到队列上。

虚拟主机(Virtual Host)

虚拟主机(Virtual Host)是 RabbitMQ 中用于实现逻辑隔离的机制,类似于操作系统中的虚拟化技术。每个虚拟主机都是一个独立的、隔离的消息代理,拥有自己的交换机、队列、绑定和权限规则。虚拟主机可以让不同的应用程序或团队在同一个 RabbitMQ 服务器上共享相同的基础设施,同时保持彼此之间的隔离。
有虚拟主机的区别:

  1. 隔离性:每个虚拟主机之间是完全隔离的,它们拥有独立的命名空间,因此一个虚拟主机中的队列、交换机等元素不会影响到其他虚拟主机。
  2. 权限控制:你可以为每个虚拟主机设置独立的权限规则,从而实现对不同应用程序或团队的精细化权限控制。
  3. 灵活性:不同的应用程序可以在不同的虚拟主机中进行消息传递,而不会相互干扰。
    没有虚拟主机的区别: 如果没有虚拟主机的概念,那么所有的交换机、队列和连接都将在全局范围内进行管理,这样会导致以下问题:
  4. 命名冲突:不同应用程序中可能会出现交换机、队列名称冲突,从而引起混乱。
  5. 权限管理困难:无法对不同的应用程序或团队进行灵活的权限控制。
    综上所述,虚拟主机提供了一种有效的逻辑隔离机制,使得不同的应用程序或团队可以在同一台 RabbitMQ 服务器上共存而不相互干扰。如果没有虚拟主机的话,管理和维护起来将会变得更加困难并且容易产生混乱。

在 RabbitMQ 中,虚拟主机(Virtual Host)是用于实现逻辑隔离的机制,类似于操作系统中的虚拟化技术。每个虚拟主机都是一个独立的、隔离的消息代理,拥有自己的交换机、队列、绑定和权限规则。
在 RabbitMQ 中,虚拟主机名称可以使用斜杠(/)来分隔成多层路径,例如 “/myapp” 或者 “/team1/app1” 等。如果虚拟主机名称中包含了斜杠,则表示该虚拟主机名称是一个带有层级结构的路径。
带斜杠和不带斜杠的区别:

  1. 带斜杠的虚拟主机名称: 如果虚拟主机名称带有斜杠,那么这个虚拟主机名称就是一个路径,它可以表示多级目录结构。例如,“/myapp” 就可以表示一个名为 “myapp” 的虚拟主机,而 “/team1/app1” 则可以表示 “team1” 目录下的 “app1” 虚拟主机。带斜杠的虚拟主机名称可以让你更好地组织和管理虚拟主机,使得不同的团队或应用程序之间更加隔离。
  2. 不带斜杠的虚拟主机名称: 如果虚拟主机名称不带斜杠,那么这个虚拟主机名称就是一个简单的字符串。例如,“myapp” 就可以表示一个名为 “myapp” 的虚拟主机,但是它不能区分不同团队或应用程序之间的隔离。如果你只需要一个简单的、不带层级结构的虚拟主机,那么可以使用不带斜杠的虚拟主机名称。
    综上所述,带斜杠和不带斜杠的虚拟主机名称都是有效的,但它们表示的含义不同。你可以根据实际情况选择合适的虚拟主机名称来组织你的应用程序或团队。
    containerFactory连接管理器
    在Spring AMQP中,containerFactory是用于配置消息监听器容器的工厂。通过指定containerFactory属性,你可以选择不同的容器工厂来创建和配置消息监听器容器。
    使用containerFactory的目的如下:
  3. 自定义配置:可以根据需求自定义配置不同的消息监听器容器。每个容器工厂可以具有不同的配置,包括线程数、并发消费者数量、消息确认模式等,以便根据不同的业务需求进行调整。
  4. 多个队列监听:可以为不同的队列使用不同的容器工厂,以便对它们进行独立的配置,如并发消费者数量、线程池大小等。这样可以根据队列的特性和负载进行优化,以提高消息处理的性能和效率。
  5. 容器级别的设置:通过容器工厂,可以对容器本身进行一些全局级别的设置,例如错误处理器、消息转换器等。
  6. 集成其他组件:使用自定义的容器工厂,可以更轻松地集成其他组件或框架。例如,你可能需要与Spring Boot Actuator一起使用,以便在管理端点上暴露一些指标和统计信息。
    总之,通过指定containerFactory属性并配置相应的容器工厂,你可以更加灵活地管理消息监听器容器,并根据需求进行个性化的配置和优化。

RabbitMQ 有几种广播类型

direct(默认方式):最基础最简单的模式,发送方把消息发送给订阅方,如果有多个订阅者,默认采取轮询的方式进行消息发送。
headers:与 direct 类似,只是性能很差,此类型几乎用不到。
fanout:分发模式,把消费分发给所有订阅者。
topic:匹配订阅模式,使用正则匹配到消息队列,能匹配到的都能接收到。

1topic模式,按照设置的路由信息(routing key)将消息路由到一个或者多个消费端,而消息只能由一个消费者消费一次。一个消费者可以设置多个路由信息,可以同时获取多个消费者发送的消息;
2fanout模式,与topic模式唯一的区别是同一消息会发送到订阅(binding)的多个消费者;
3direct模式,一对一模式,实际中比较少用;
4RPC模式,结合topic和direct模式,发送消息的同时指定要接受的消息。
i. 直连交换机,Direct exchange:带路由功能的交换机,根据routing_key(消息发送的时候需要指定)直接绑定到队列,⼀个交换机也可以通过过个routing_key绑定多个队列。
ii. 扇形交换机,Fanout exchange:⼴播消息。
iii. 主题交换机,Topic exchange:发送到主题交换机上的消息需要携带指定规则的routing_key,主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
iv. ⾸部交换机,Headers exchange:⾸部交换机是忽略routing_key的⼀种路由⽅式。路由器和交换机路由的规则是通过Headers信息来交换的,这个有点像HTTP的Headers。将⼀个交换机声明成⾸部交换机,绑定⼀个队列的时候,定义⼀个Hash的数据结构,消息发送的时候,会携带⼀组hash数据结构的信息,当Hash的内容匹配上的时候,消息就会被写⼊队列 。

Direct :交换机会将消息中的Routing key与该Exchange所有Binding中的Routing key进行匹配,如果相等,就发送到该Binding对应的Queue中。
Fanout :交换机会将接收到的消息发送给所有与之绑定的队列。
Topic :将消息中的Routing key与该Exchange所有Binding中的Routing key进行匹配,匹配成功发送到该Binding对应的Queue中。routingKey必须是由点隔开的一系列的标识符组成(根据消息的特性以.隔开)。

  • *匹配一个标识符
  • #匹配0个或多个标识符
    Headers :分发消息不依赖路由键,使用发送消息basicProperties对象中的headers来匹配的,将消息中的headers与该交换机中所有Binding中的参数进行匹配。

Exchange 属性说明:
Virtual host:属于哪个Virtual host。(如果有多个Virtual host的有此属性,一般默认的Virtual host是"/",Virtual host可以做最小粒度的权限控制。)
Name:名字,同一个Virtual host里面的Name不能重复。
Durability: 是否持久化 (Durable:持久化,Transient:不持久化)。
Auto delete:当最后一个绑定(队列或者exchange)被unbind之后,该exchange自动被删除。
Internal: 是否是内部专用exchange,是的话,就意味着我们不能往该exchange里面发消息。
Arguments: 参数,是AMQP协议留给AMQP实现做扩展使用的。alternate_exchange配置的时候,exchange根据路由路由不到对应的队列的时候,这时候消息被路由到指定的alternate_exchange的value值配置的exchange上。

扇出(fanout)交换机是将接收到到消息广播给它知道的所有队列,从而实现生产者发送一条消息,可以供多个消费者消费。
案例:一个生产者发送一条消息,通过扇出交换机,广播给两个消费者消费,如下图:

相关文章:

RabbitMQ架构详解

文章目录 概述架构详解核心组件虚拟主机(Virtual Host)RabbitMQ 有几种广播类型 概述 RabbitMQ是⼀个高可用的消息中间件,支持多种协议和集群扩展。并且支持消息持久化和镜像队列,适用于对消息可靠性较高的场合 官网https://www.…...

编译内核错误 multiple definition of `yylloc‘

编译内核错误 # make ARCHarm CROSS_COMPILEarm-mix410-linux- uImageHOSTLD scripts/dtc/dtc /usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss0x10): multiple definition of yylloc; scripts/dtc/dtc-lexer.lex.o:(.bss0x0): first defined here collect2: error: ld ret…...

深度学习模型部署(四)常用模型及推理平台评估指标

判断选择什么模型,什么量化方案,什么推理框架,最基础的知识就是如何评估自己的模型以及推理平台。 模型衡量标准 衡量一个模型的最直接标准就是运算速度,但是运算速度是无法计算的,所以定义了一些间接标准来推测模型的…...

【控制台警告】npm WARN EBADENGINE Unsupported engine

今天用webpack下载几个loader依赖,爆出了三个警告,大概的意思就是本地安装的node和npm的版本不是很匹配? 我的解决思路是: 先检查node和npm版本 然后去官网查找版本的对应 靠,官网404 Node.js (nodejs.org) 就找到…...

ArmSoM Rockchip系列产品 通用教程 之 GPIO 使用

1. GPIO简介​ GPIO,全称 General-Purpose Input/Output(通用输入输出),是一种在计算机和嵌入式系统中常见的数字输入输出接口。它允许软件控制硬件的数字输入和输出,例如开关、传感器、LED灯等。GPIO通常由一个芯片或…...

npm镜像源地址

镜像源地址替换问题(重要) 2024 年 1 月 22 日 ,registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告: (大家应该没有太多关注哦,也包括我,哈哈) &am…...

Java的Writer类详解

咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好…...

R语言基础的代码语法解译笔记

1、双冒号,即:“::” 要使用某个包里的函数,通常做法是先加载(library)包,再调用函数。最新加载的包的namespace会成为最新的enviroment,某些情况下可能影响函数的结果。而package name::funct…...

【蓝桥杯】蓝桥杯算法复习(一)

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…...

移动端精准测试简介

在测试领域每隔一段时间,就会有一些主流的测试技术,比如说:接口自动化,WebUI, AppUI自动化,然后就是测试平台的开发,各类专项测试(性能,安全),再到前几年的手机集群云测平…...

CCProxy代理服务器地址的设置步骤

目录 前言 一、下载和安装CCProxy 二、启动CCProxy并设置代理服务器地址 三、验证代理服务器设置是否生效 四、使用CCProxy进行代理设置的代码示例 总结 前言 CCProxy是一款常用的代理服务器软件,可以帮助用户实现网络共享和上网代理。本文将详细介绍CCProxy…...

探秘分布式神器RMI:原理、应用与前景分析(二)

本系列文章简介: 本系列文章将深入探究RMI远程调用的原理、应用及未来的发展趋势。首先,我们会详细介绍RMI的工作原理和基本流程,解析其在分布式系统中的核心技术。随后,我们将探讨RMI在各个领域的应用,包括分布式计算…...

[项目设计] 从零实现的高并发内存池(三)

🌈 博客个人主页:Chris在Coding 🎥 本文所属专栏:[高并发内存池] ❤️ 前置学习专栏:[Linux学习] ⏰ 我们仍在旅途 ​ 目录 4.CentralCache实现 4.1 CentralCache整体架构 4.2 围绕Span的相关设计…...

将Q算法和D算法结合应用到llm解码上之人在回路

将Q算法和D算法结合应用到llm解码上之人在回路 参考地址代码解释 参考地址 https://dongfangyou.blog.csdn.net/article/details/136466609 代码 import numpy as np from tqdm import tqdmfrom sample import net, char2id_dict, get_real_p# 假设的词汇表 VOCABULARY lis…...

el-table-column嵌套el-form-item不能进行校验问题解决

项目为vue3elementPlus开发的项目 业务要求:table表格展示数据,其中有一行是ip地址可展示可修改,此处要求增加自定义校验规则 先看一下效果: 此处先描述一下,问题出在了哪里,我将el-table的data,使用一个…...

leetcode200. 岛屿数量

leetcode200. 岛屿数量 题目 思路 遍历每一个网格,若网格为1,岛屿数量1,利用一个深度优先搜索函数将岛屿置零,注意判断数组边界 代码 class Solution:def numIslands(self, grid: List[List[str]]) -> int:self.grid grid…...

MySQL--索引类型详解

索引的类型 主键索引: PRIMARY KEY,当一张表的某个列是主键的时候,该列就是主键索引,一张表只允许有一个主键索引,主键所在的列不能为空。 创建主键索引的SQL语法: # 给user表中的id字段创建名为id_ind…...

R语言中ggplot2图例位置、颜色、背景、标题

目录 1、不显示图例 2、自定义图例位置 3、修改图例背景颜色、外框颜色、大小 4、修改图例大小 5、图例设置背景、线框为空 6、自定义设置多个图例的标题 7、设置多个图例的之间的间隔 8、取消不需要的图例显示 1、不显示图例 theme(legend.position "none"…...

波卡 Alpha 计划启动,呼唤先锋创新者重新定义 Web3 开发

原文:https://polkadot.network/blog/the-polkadot-alpha-program-a-new-era-for-decentralized-building-collaboration/ 编译:OneBlock 区块链领域不断发展,随之而来的是发展和创新机会的增加。而最新里程碑是令人振奋的 Polkadot Alpha …...

公网IP与私有IP及远程互联

1.公网有私有IP及NAT 公网IP是全球唯一的IP,通过公网IP,接入互联网的设备是可以访问你的设备。但是IPV4资源有限,一般ISP(Internet Service Provider)并不会为用户提供公网IP。所以家里的计算机在公司是没法直接使用windows远程桌面直接访问…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...