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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu22.01安装及配置

前言 本次安装基于VMware Pro 16进行安装。 ubuntu版本:ubuntu-22.04.3-live-server-amd64.iso 1、下载 1.1官网下载 https://ubuntu.com/download 1.2、清华大学镜像网站下载 https://mirrors.tuna.tsinghua.edu.cn/ 进入网站后搜索ubuntu,选择ubu…

谷粒商城【成神路】-【10】——缓存

目录 🧂1.引入缓存的优势 🥓2.哪些数据适合放入缓存 🌭3.使用redis作为缓存组件 🍿4.redis存在的问题 🧈5.添加本地锁 🥞6.添加分布式锁 🥚7.整合redisson作为分布式锁 &#x1f697…

uniapp封装文字提示气泡框toolTip组件

uniapp封装文字提示气泡框toolTip组件 文字提示气泡框:toolTip 因为uniapp 中小程序中没有window对象,需手动调用 关闭 第一种办法关闭:this.$refs.tooltip.close() 第二种办法关闭:visible.sync false 移动端没有现成的toolTip组…

pytorch项目代码记录

目录 1.超过二维的张量写进csv 2.翻转矩阵与绘制热力图 3.切片 4.np按块复制 1.超过二维的张量写进csv #(20,204,273) -> (4080,273) ycsv []for i in range(20):ycsv.append(y[i, 8, :, :].reshape(204,273))with open(y.csv,w,encodingutf-8) as y_obj:writer csv.…

SpringCloud 服务的注册与发现

一、前言 接下来是开展一系列的 SpringCloud 的学习之旅,从传统的模块之间调用,一步步的升级为 SpringCloud 模块之间的调用,此篇文章为第二篇,即使用服务注册和发现的组件,此篇文章会介绍 Eureka、Zookeeper 和 Consu…

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中,不同类型的数据集合体是结构体。为了方便管理结构体,我…

CVHub | 万字长文带你全面解读视觉大模型(建议收藏!)

本文来源公众号“CVHub”,仅用于学术分享,侵权删,干货满满。 原文链接:万字长文带你全面解读视觉大模型 0 导读 众所周知,视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域的挑战在于对象之间的复杂关系…

centos7 python3.12.1 报错 No module named _ssl

https://blog.csdn.net/Amio_/article/details/126716818 安装python cd /usr/local/src wget https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz tar -zxvf Python-3.12.1.tgz cd Python-3.12.1/ ./configure -C --enable-shared --with-openssl/usr/local/opens…

Docker镜像及Dockerfile详解

1 Docker镜像用途 统一应用发布的标准格式支撑一个Docker容器的运行 2 Docker镜像的创建方法 基于已有镜像创建基于本地模板创建基于Dockerfile创建 (实际环境中用的最多) 2.1 基于已有镜像的创建 将容器里面运行的程序及运行环境打包生成新的镜像 …

网络工程师笔记10 ( RIP / OSPF协议 )

RIP 学习路由信息的时候需要配认证 RIP规定超过15跳认定网络不可达 链路状态路由协议-OSPF 1. 产生lsa 2. 生成LSDB数据库 3. 进行spf算法,生成最有最短路径 4. 得出路由表

IOS开发0基础入门UIkit-1cocoapod安装、更新和使用 , 安装中出现的错误及解决方案 M1或者M2安装cocoapods

cocoapod是ios开发时常用的包管理工具 1.M1或者是M2系统安装cocoapods先操作一下两个设置 1、打开访达->应用->实用工具->终端->右键点击终端->显示简介->勾选使用 Rosetta 打开,关闭终端,重新打开。 2、打开访达->应用->Xcod…

如何制作一个分销商城小程序_揭秘分销商城小程序的制作秘籍

打造赚钱神器!揭秘分销商城小程序的制作秘籍 在这个数字化高速发展的时代,拥有一个属于自己的分销商城小程序,已成为众多商家和创业者的必备利器。它不仅能够快速搭建起自己的在线销售渠道,还能够利用分销模式,迅速裂…

处理error: remote origin already exists.及其Gitee文件上传保姆级教程

解决error: remote origin already exists.: 删除远程 Git 仓库 git remote rm origin 再添加远程 Git 仓库 git remote add origin (HTTPS) 比如这样: 然后再push过去就ok了 好多人可能还是不熟悉怎么将文件上传 Gitee:我…

spm用于颅骨去除和配准

1. 颅骨去除 出现这个界面就一直等待即可: segment的结果文件中会出现四个文件夹label、mri、report、surf 在mri文件中,mwp1是分割出来的灰质图像,mwp2是分割出来的白质图像,这两图像均是bias correction和空间配准后的。p0**…

log4j2 远程代码执行漏洞复现(CVE-2021-44228)

写在前面 log4j 对应的是 CVE-2017-5645,即 Apache Log4j Server 反序列化命令执行漏洞; log4j2 对应的是 CVE-2021-44228,即 log4j2 远程代码执行漏洞,通过 JNDI 注入实现; CVE-2017-5645 比较久远因此我们这里不做…

mysql的语法学习总结3(一些常见的问题)

执行后,MySQL 会重新加载授权表并更新权限。 FLUSH PRIVILEGES; 怎么检查自己的电脑端口3306有没有被占用? ESTABLISHED表示被占用,LISTENING表示端口正在被监听,22696是占用该端口的进程的PID(进程标识符&#xff0…

羊大师揭秘,女性喝羊奶有什么好处

羊大师揭秘,女性喝羊奶有什么好处 女性喝羊奶有多种好处。首先,羊奶富含钙元素,有助于预防女性体内缺钙和老年女性骨质疏松,从而增强骨骼密度。其次,羊奶中的色氨酸和烟酸等成分有助于促进睡眠,改善睡眠质…

BUUCTF-MISC-[HDCTF2019]信号分析1

题目链接:BUUCTF在线评测 (buuoj.cn) 下载附件是一个WAV的文件,题目又叫做信号分析,用Adobe Audition 打开分析了 发现有很多长短不一样的信号,只需要分析一段 猜测长的是一短的为0 最后得到0101010101010101000000110 百度得知…

TMS智慧园区物流车辆管理系统:精确监控与高效运营的完美结合

在当今高速发展的物流行业中,效率和精确性是成功的关键。随着科技的不断进步,智慧园区物流车辆管理系统应运而生,为物流行业带来了革命性的变革。这些系统不仅提高了物流运作的效率,还为企业提供了更精确的监控和管理手段。接下来…

【OpenGL实现 03】纹理贴图原理和实现

目录 一、说明二、纹理贴图原理2.1 纹理融合原理2.2 UV坐标原理 三、生成纹理对象3.1 需要在VAO上绑定纹理坐标3.2 纹理传递3.3 纹理buffer生成 四、代码实现:五、着色器4.1 片段4.2 顶点 五、后记 一、说明 本篇叙述在画出图元的时候,如何贴图纹理图片…