RabbitMQ架构详解

news2024/12/22 2:34:43

文章目录

    • 概述
    • 架构详解
    • 核心组件
      • 虚拟主机(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.coloradmin.cn/o/1501435.html

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

相关文章

Thingsboard学习杂记

知识杂记 1.遵循磁盘绑定的内存数据库和遵循磁盘支持的内存数据库 遵循磁盘绑定的内存数据库和遵循磁盘支持的内存数据库有不同的工作方式,它们的优点和缺点也不同。 遵循磁盘绑定的内存数据库的优点: 数据库可以支持更大的数据集合,因为数…

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号记忆承载近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载,我之前写过很多文章: 视频更新版:批量下载公众号文章内容/话题/图片/封面/音频/视频,导出html,pdf,excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

Threejs着色器(GPU)编程——感温管网

管网,作为支撑现代城市运转的重要基础设施,是隐藏在地面之下的庞大工程网络。这些管网如同城市的血脉,负责输送各种必要的资源,如水源、热力、燃气等,同时排除废水和其他废弃物。然而,由于其位于地下,人们往往难以直接感知其存在和运行状态。为了保障这些地下管网的安全…

王道机试C++第 4 章 字符串:字符串内容详解及三个小程序 Day29

第 4 章 字符串 本章介绍一种基础数据类型——字符串,并且介绍一些字符串处理的方法及字符串匹配的方法。虽然字符串的内容非常基础,但是十分重要。希望读者能够好好学习本章的内容,为此后的学习打下良好的基础。 4.1 字符串内容详解 由于 …

3月求职黄金期!如何打造自己的岗位优势?这6大分析维度很重要!

三月份,又到了一年的求职黄金期。在今年这场求职大队中,想要找到一份满意的工作,你不仅要学会打造一份高质量简历,还要懂得完美应对HR的各项提问。 一、岗位能力的6大分析维度 虽说是求职黄金期,但找工作也不是随便找…

一键查看:大厂网站都用了啥技术栈,有图有真相。

本次我们采用Wappalyzer插件来看下国内大厂的网站都采用了什么技术架构,文章最后由Wappalyzer的安装方法。 今日头条网站 淘宝网站 哔哩哔哩 京东商城 花瓣网 CSDN 国务院 网易 58同城 腾讯网 如何安装Wappalyzer 用Edge浏览器即可

c++的STL(2)-- vector容器

目录 1. 默认构造 代码: 相关知识点: 2. 有参构造函数 以及 使用{}初始化对象 代码: 相关知识点: 3. vector容器在尾部添加和删除元素 代码: 使用push_back()和pop_back()进行尾部元素的添加和删除 相关知识点: 代码: 使用emplace_back在尾部添…

Spring Boot中SQL语句报错

报错原因: You have an error in your SQL syntax 你的SQL语句出现错误 报错位置: check the manual that corresponds to your MySQL server version for the right syntax to use near :/sql/schema.sql.t_film at line 1 在:/sql/schema.sql附近使用…

Linux系统——Haproxy高性能负载均衡软件

目录 一、Haproxy介绍 1.Haproxy定义 2.Haproxy主要特性 二、安装Haproxy 1.yum安装 2.第三方rpm包安装 3.编译安装 3.1解决Lua环境 3.2编译安装Haproxy 三、配置文件详解 1.状态页 2.日志管理 2.1定义日志到其他主机站点 3.指定进程线程个数 4.cpu亲缘性 5.多进…

md5绕过

文章目录 \\和\\\md5数组绕过科学计数法绕过双md加密md5碰撞Hash长度攻击 下面会以同一道题给大家演示: (题目来源与nssctf) 和 在php代码中我们会看到和,虽然两个都是表示相等,但是在细节上会有所部区别 :是弱比较,只…

Java基础面试题(day 01)

📑前言 本文主要是【Java】——Java基础面试题的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句&am…

httprunner参数化

1. 示例 引入对应的Parameters 1.1. CSV参数 from httprunner import HttpRunner, Config, Step, RunRequest, Parameters pytest.mark.parametrize("param", Parameters({"mobile_phone-pwd": "${P(csv_data/mobile_phone-pwd.csv)}"}))def …

C#中实现接口的一些小知识(C#用abstract或virtual来实现接口成员)

文章目录 不可用的修饰可用的修饰非抽象类实现接口抽象类实现接口抽象类与接口方法同名时一同实现 不可用的修饰 在C#中实现接口时,我们不能直接使用static或const来实现接口成员,因为接口中的成员默认都是实例成员,并且它们表示一种契约&am…

【SpringMVC】快速体验 SpringMVC接收数据 第一期

文章目录 一、SpringMVC 介绍1.1 主要作用1.2 核心组件和调用流程理解 二、快速体验三、SpringMVC接收数据3.1 访问路径设置3.1.1 精准路径匹配3.1.2 模糊路径匹配3.1.3 类和方法级别区别3.1.4 附带请求方式限制3.1.5 进阶注解 与 常见配置问题 3.2 接收参数(重点&a…

C++ 智能指针深度剖析

文章目录 1. 前言2. 为什么需要智能指针?3. 内存泄漏3.1 内存泄漏的概念及危害3.2 内存泄漏的分类3.3 如何检测内存泄漏3.4 如何避免内存泄漏 4. 智能指针的使用及原理4.1 RAII思想4.2 智能指针的原理4.3 C智能指针发展历史4.4 std::auto_ptr4.5 std::unique_ptr4.6…

计算机组成原理之机器:存储器之辅助存储器

计算机组成原理之机器:存储器之辅助存储器 笔记来源:哈尔滨工业大学计算机组成原理(哈工大刘宏伟) Chapter3:存储器之辅助存储器 3.1 概述 3.2 磁记录原理 通不同方向电流时磁化方向不同,由此区分写入…

vue 使用谷歌地图 @googlemaps/js-api-loader 进行模糊搜索

<template><div class"map"><div class"mapLeftStyle"><el-inputv-model"input"placeholder"请输入内容"class"controls"input"chnageinput"><i slot"prefix" class"e…

2007-2022年上市公司迪博内部控制评价缺陷数量数据

2007-2022年上市公司迪博内部控制评价缺陷数量数据 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、是否存在财报内控重大缺陷、财报内控重大缺陷数量、是否存在财报内控重要缺陷、财报内…

Linux第73步_学习Linux设备树和“OF函数”

掌握设备树是 Linux驱动开发人员必备的技能&#xff01; 1、了解设备树文件 在3.x版本以前的Linux内核源码中&#xff0c;存在大量的“arc/arm/mach-xxx”和“arc/arm/plat-xxx”文件夹&#xff0c;里面很多个“.c”和“.h”文件&#xff0c;它们用来描述设备信息。而现在的A…

使用Portainer让测试环境搭建飞起来

Docker的用处不多加赘述&#xff0c;Docker目前有以下应用场景&#xff1a; 测试&#xff1a;Docker很适合用于测试发布&#xff0c;将 Docker 封装后可以直接提供给测试人员进行运行&#xff0c;不再需要测试人员与运维、开发进行配合&#xff0c;进行环境搭建与部署。 测试…