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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ShardingSphere-SQL 解析 Issue 处理流程

ShardingSphere-SQL 解析 Issue 处理流程 这是之前给社区写的 SQL 解析 Issue 的处理流程,可以帮助社区用户快速参与到 ShardingSphere-SQL 解析任务当中。 ShardingSphere SQL 解析 issue 列表 Issue 背景说明 当前 Issue 使用自定义的爬虫脚本从对应的数据库官…

数据中台驱动:高效交付之道

如何保证数据中台高效交付? 在数据行业中,项目交付难题尤为突出,尤其在数据中台领域。数据中台项目交付面临诸多挑战,若不妥善解决,将会降低服务质量,影响企业数字化建设的顺利开展,甚至影响项目…

智能合约语言(eDSL)—— proc_macro实现合约init函数

我们通过属性宏来实现合约的init函数,call函数其实和init是类似的; GitHub - XuHugo/xwasm 构建属性宏,要在cargo.toml里面设置一些参数,这是必须的。一般来说,过程宏必须是一个库,或者作为工程的子库&…

桑晋秋:个性化头相关传递函数的研究动态及展望 | 演讲嘉宾公布

一、3D 音频专题论坛 3D 音频专题论坛将于3月27日同期举办! 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验,跨越时空的限制,探索未知的世界。同时,提供更加丰富、立体的情感表达和交流方式,让人类能够更加深入地…

前端javascript的DOM对象操作技巧,全场景解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改,清空节点…

第九篇 – 过程发现(Process Discovery)是如何赋能数字化市场营销全过程?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台,使命和功能 IAB成立于1996年,总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司,互动广告局(IAB- the Interactive Advertising Bureau)自1996年成立以来,先后为700多家媒体…

Kubesphere前端项目分析

1 KubeSphere console功能导图 模块: 命令行工具 (kubectl) 日志(Logging) 平台设置(Platform Settings) 服务组件(Service Components) 监控和警报(Monitoring & Alerting&…

iOS-系统弹窗调用

代码: UIAlertController *alertViewController [UIAlertController alertControllerWithTitle:"请选择方式" message:nil preferredStyle:UIAlertControllerStyleActionSheet];// style 为 sheet UIAlertAction *cancle [UIAlertAction actionWithTit…

纳斯达克大屏:NASDAQ广告大屏多少钱?

大舍传媒 近期,美国纽约纳斯达克大屏广告(NASDAQ广告大屏)备受瞩目,众多企业纷纷关注其广告投放效果以及费用。纳斯达克大屏广告的价格究竟是多少呢?下面我们从事件的经过、相关背景信息以及对其影响和意义的分析等方…

革命性创新!AI大模型开发崭新风貌

在当今科技日新月异的时代,人工智能(AI)作为一项颠覆性的技术,正以革命性的创新改变着我们的生活方式和工作方式。而在AI领域中,大模型的开发更是成为了展示技术实力和提升智能化水平的重要标志。 随着数据量的不断增…

STM32 NAND FLASH知识点

1.NAND FLASH的简介 NAND FLASH 的概念是由东芝公司在 1989 年率先提出,它内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大,改写速度快等优点,适用于大量数据的存储&…

windows关闭copilot预览版

如果用户不想在windows系统当中启用Copilot,可以通过以下三种方式禁用。 第一种:隐藏Copilot 按钮 右键点击任务栏,取消勾选“显示 Copilot(预览版)按钮”,任务栏则不再显示,用户可以通过快捷键…

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落,我,一个普通的大专生,开始了我的软件测试之旅。四年的外包生涯,让我在舒适区里逐渐失去了锐气,技术停滞不前,仿佛被时间遗忘。然而,生活的转机总是在不经意间降临。 与女…

Java后端核心——Servlet

目录 一.概述 二.基础实现 1.导入坐标 2.定义实现类 3.注解 4.访问Servlet 三.执行流程 四.生命周期 1.加载和实例化 2.初始化 3.请求处理 4.服务终止 五.方法 1.init 2.service 3.destroy 4.getServletInfo 5.getServletConfig 六.体系结构 七.urlPatter…

Kafka MQ 主题和分区

Kafka MQ 主题和分区 Kafka 的消息通过 主题 进行分类。主题就好比数据库的表,或者文件系统里的文件夹。主题可以被分为若干个 分区 ,一个分区就是一个提交日志。消息以追加的方式写入分区,然 后以先入先出的顺序读取。要注意,由…

uniapp 手写 简易 时间轴 组件

一、案例如图 该案例设计条件: 左侧时间 和竖线、点、内容都是居中对其的,上下时间点中间要有一段距离 二、编写逻辑 1. 布局结构:一共三个元素,左侧是时间和黑点,中间是线条,右侧是内容 2. 样式难点&#…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器,细分 方法思路:用通用定时器TIM2,1ms产生一次中断;在中断里做IO反转; 发送10个脉冲信号

iOS——【自动引用计数】ARC规则及实现

1.3.3所有权修饰符 所有权修饰符一共有四种: __strong 修饰符__weak 修饰符__undafe_unretained 修饰符__autoreleasing 修饰符 __strong修饰符 _strong修饰符表示对对象的强引用,持有强引用的变量在超出其作用域的时候会被废弃,随着强引…

数据结构之栈详解(C语言手撕)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生 🙈个人主页🎉:GOTXX 🐼个人WeChat:ILXOXVJE 🐼本文由GOTXX原创,首发CSDN&…

二维码门楼牌管理系统技术服务:构建智慧城市新标准

文章目录 前言一、二维码门楼牌管理系统的诞生背景二、标准地址编码的定义与作用三、二维码门楼牌管理系统的核心技术四、二维码门楼牌管理系统的应用优势五、二维码门楼牌管理系统在智慧城市建设中的作用六、结论与展望 前言 随着城市化的快速发展,传统的门楼牌管…