RabbitMQ详解,RabbitMQ是什么?架构是怎样的?

目录

一,RabbitMQ是什么?

二,RabbitMQ架构

2.1 首先我们来看下RabbitMQ里面的心概念Queue是什么?

2.2 交换器Exchange

2.3 RabbitMQ是什么?

2.4 重点看下优先级队列是什么?

三,RabbitMQ集群

3.1 普通集群模式

3.2 镜像队列集群


一,RabbitMQ是什么?

假设我们程序员维护了2个服务,A服务负责转发用户请求到B服务,B服务是个算法服务,GPU资源有限,当请求量达到B服务处理不过来的时候,希望能有限处理我们的VIP服务(充钱的作用来了,哈哈......),那么问题来了,当普通用户和会员用户同时发起请求,怎样才能做到会员优先?

这个问题好办,没有什么是加一层中间层解决不了的,加一层不够,那就再加一层,哈哈

这次我们要加的中间层就是消息队列RabbitMQ

二,RabbitMQ架构

2.1 首先我们来看下RabbitMQ里面的心概念Queue是什么?

消息队列本质上就是类似链表的独立进程,链表里的每一个节点是一个消息,它介于生产者和消费者之间,在流量高峰时先慢慢暂存数据,然后再慢慢消费数据,可以很好的保护消费者,也就是削峰填谷,这个类似链表的进程就是队列

但消息也分很多种类,比如订单消息,用户消息,商品消息,为了更好的管理不同种类的数据,可以提供多个队列,生产者可以自定义队列的名字,并且根据需要将消息投递到不同的队列中,每个queue都是独立的进程,某个进程挂了,不会影响其他进程工作

2.2 交换器Exchange

有些生产者想将消息发到一个Queue中,有些则是发给多个Queue中,甚至广播给所有Queue,于是我们还需要一个可以定制消息路由分发的策略的组件,交换器Exchange,将它与Queue绑定在一起,通过一个类似正则表达式的字符串,声明绑定的关系,让用户根据需要,选择要投递的序列,

这些维护在Exchange里面的路由方式和绑定关系我们称为元数据

2.3 RabbitMQ是什么?

像这种包含多个Queue进程和Exchange组件的消息队列,就是所谓的 RabbitMQ

每一台服务上的RabbitMQ的实例,就代表一个broker,大佬们在这个架构的基础上为RabbitMQ实现了各种丰富的特性,比如延时队列,死信队列,优先级队列

2.4 重点看下优先级队列是什么?

RabbitMQ支持在生产者发送消息时,为消息标上优先级,消费者总是消费优先级高的消息,所以我们前文中提到的VIP问题,就可以通过优先级队列来实现

我们可以在A服务中,根据用户的等级,为消息打上对应的优先级,在投递到RabbitMQ中,B服务永远消费高优消息,当高优消息处理完后,再处理普通消息(这就是氪金的用处)

三,RabbitMQ集群

虽然RabbitMQ功能很丰富,但是它的架构就是个单实例节点,有些过于简单了,像什么高可用,高可扩展是一个都不沾,我们来看下RabbitMQ是怎么扩展这部分能力的?那就是RabbitMQ集群

既然单节点存在诸多问题,那就让多个节点构成集群,我们可以在多个服务器上各部署一个RabbitMQ实例,并通过RabbitMQ提供的命令将这些实例组成一个集群,RabbitMQ支持多种集群模式,普通集群,镜像队列集群,Quorum队列集群

3.1 普通集群模式

在普通集群模式中,每个broker都是一个完整功能的RabbitMQ实例,都能进行读写,他们之间会互相同步Exchange里面的元数据,但不会同步Queue的数据

假设Queue1,Queue2,Queue3分别部署在broker1,broker2,broker3中

对于写操作来说:

生产者将消息写入到broker1的Queue1中,Queue里的数据并不会同步给其他的broker,但如果此时Exchang中的元数据有变化,则会将Exchange的元数据同步到其他的broker上

对于读操作来说:

消费者想要读取Queue1中的数据时,如果访问的是broker1,则直接返回Queue1的数据,如果访问的是broker2,broker2则会根据Exchange里的元数据,从broker1里面读取数据,再返回给消费者,这样就可以通过增加broker,提升RabbitMQ集群整体的吞吐量,保证了扩展性

但问题也很明显,虽然支持读写Queue的数量是增加了,但对于单个Queue本身的读写能力并没有提升,而且更重要的是每个Broker依然有单点问题,Broker之间并没有同步Queue里面的数据,某个Queue所在的Broker要是挂了,就没办法读写这个Queue了,这和高可用毫不沾边,有更好的方案么?答案是有,请看3,2 

3.2 镜像队列集群

我们可以在普通集群的基础上上,给Queue增加几个副本到其它的broker上,他们有主从关系,主Queue负责读写数据,从Queue负责同步复制主Queue数据,所以从Queue也叫镜像队列,一旦主Queue所在的Broker挂了,从Queue就可以顶上成为新的主Queue,实现高可用,这就是所谓的镜像队列集群

对于写操作:

数据写入主Queue后,会将Exchange和Queue数据同步给其他的Broker

对于读操作:

消费者读取数据时,如果访问的是主Queue所在的broker,则直接返回数据,否则当前broker会从主Queue所在的broker上读区数据,之后返回给消费者

但是这个方案的缺点也很明显,broker之间同步的数据量会变大,集群节点越多,带宽压力越大,本质上镜像队列集群是牺牲吞吐量换取的高可用,反观前面的普通集群,虽然吞吐高,但是却牺牲了高可用

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

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

相关文章

【一步步开发AI运动APP】六、运动计时计数能调用

之前我们为您分享了【一步步开发AI运动小程序】开发系列博文,通过该系列博文,很多开发者开发出了很多精美的AI健身、线上运动赛事、AI学生体测、美体、康复锻炼等应用场景的AI运动小程序;为了帮助开发者继续深耕AI运动领域市场,今…

MySQL——DQL的多表查询

一、交叉连接 标准语法:select * from 表1 cross join 表2 where 表1.公共列 表2.公共列; 简单语法:select * from 表1 , 表2 where 表1.公共列 表2.公共列; 公共列:两张表具有相同含义的列,不是列名一样。 …

【Linux内核】如何更加优雅阅读Linux内核源码(vscode)

1. 前言 因为已经习惯在Ubuntu下进行嵌入式工作开发,但Linux源码在Source Insight下进行阅读,一直很苦恼Linux/Windows来回切换的开发方式,当前发现可以通过 vscode clangd(扩展组件) 方式进行更好的内核源码阅读。 2. 环境 操作系统&…

21.OpenCV获取图像轮廓信息

OpenCV获取图像轮廓信息 在计算机视觉领域,识别和分析图像中的对象形状是一项基本任务。OpenCV 库提供了一个强大的工具——轮廓检测(Contour Detection),它能够帮助我们精确地定位对象的边界。这篇博文将带你入门 OpenCV 的轮廓…

LETTERS(DFS)

【题目描述】 给出一个rowcolrowcol的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。 【输入】 第一行,输入字母矩阵行数RR和列数SS,1≤R,S≤…

Day2-2:前端项目uniapp壁纸实战

再在wallpaper新建一个目录components 在components下新建组件common-title 记得点击创建同名目录 在index加 <view class"select"><common-title></common-title></view> 图片换了下&#xff0c;原来的有点丑&#xff0c;图片可按自己喜欢…

其他 vector 操作详解(四十)

介绍 除去向 vector 添加元素&#xff08;如 push_back&#xff09;之外&#xff0c;vector 还提供了许多其他操作&#xff0c;这些操作大多与 string 的操作类似。通过掌握这些操作&#xff0c;我们可以方便地查询、修改和比较 vector 中的元素&#xff0c;从而构建灵活、高效…

【Leetcode 每日一题】368. 最大整除子集

问题背景 给你一个由 无重复 正整数组成的集合 n u m s nums nums&#xff0c;请你找出并返回其中最大的整除子集 a n s w e r answer answer&#xff0c;子集中每一元素对 ( a n s w e r [ i ] , a n s w e r [ j ] ) (answer[i], answer[j]) (answer[i],answer[j]) 都应当…

python基础-13-处理excel电子表格

文章目录 【README】【13】处理Excel电子表格【13.1】Excel文档【13.2】安装openpyxl模块【13.3】读取Excel文档【13.3.1】使用openpyxl模块打开excel文档【13.3.2】从工作簿取得工作表【13.3.3】从工作表sheet获取单元格cell【13.3.5】从表中获取行和列【13.3.6】工作簿、工作…

ABS函数c++

简介&#xff1a; abs 函数用于计算一个数的绝对值&#xff0c;在 C 中它继承自 C 语言的标准库&#xff0c;其历史可以追溯到早期的 C 语言发展历程&#xff0c;以下是详细介绍&#xff1a; 早期编程语言的需求 在计算机编程的早期阶段&#xff0c;处理数学运算就是一项基本…

闭环SOTA!北航DiffAD:基于扩散模型实现端到端自动驾驶「多任务闭环统一」

端到端自动驾驶目前是有望实现完全自动驾驶的一条有前景的途径。然而&#xff0c;现有的端到端自动驾驶系统通常采用主干网络与多任务头结合的方式&#xff0c;但是它们存在任务协调和系统复杂度高的问题。为此&#xff0c;本文提出了DiffAD&#xff0c;它统一了各种驾驶目标并…

整车CAN网络和CANoe

车载网络中主要包含有Can网络,Lin网络,FlexRay,Most,以太网。 500kbps:500波特率,表示的数据传输的速度。表示的是最大的网速传输速度。也就是每秒 500kb BodyCan车身Can InfoCan娱乐信息Can 车身CAN主要连接的是ESB电动安全带 ADB自适应远光灯等 PTCan动力Can 底盘Can

实战设计模式之迭代器模式

概述 与上一篇介绍的解释器模式一样&#xff0c;迭代器模式也是一种行为设计模式。它提供了一种方法来顺序访问一个聚合对象中的各个元素&#xff0c;而无需暴露该对象的内部表示。简而言之&#xff0c;迭代器模式允许我们遍历集合数据结构中的元素&#xff0c;而不必了解这些集…

JVM 垃圾回收器是如何判断一个对象是否要回收?

JVM 垃圾回收器&#xff08;Garbage Collector&#xff09;需要判断哪些对象是“垃圾”&#xff0c;即不再被程序使用的对象&#xff0c;以便回收它们占用的内存。JVM 主要使用以下两种方法来判断对象是否是垃圾&#xff1a; 1. 引用计数算法 (Reference Counting): 原理&…

kali——httrack

目录 前言 使用教程 前言 HTTrack 是一款运行于 Kali Linux 系统中的开源网站镜像工具&#xff0c;它能将网站的页面、图片、链接等资源完整地下载到本地&#xff0c;构建出一个和原网站结构相似的离线副本。 使用教程 apt install httrack //安装httrack工具 httrac…

kotlin函数类型

一 函数类型定义 1 定义 函数类型就是 (Int, Int) -> Int 函数类型其实就是将函数的 “参数类型” 和 “返回值类型” 抽象出来 2 示例 &#xff1a; (Int, Int) -> Int 表示接收两个 Int 参数并返回 Int 的函数类型&#xff1b; (String) -> Unit 表示接收 Strin…

C# Winform 入门(9)之如何封装并调用dll

封装dll 首先创建 .Net平台 类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace _09.Encapsulation_dll {public class Program{/// <summary>/// 求两个double类型的数值的和/// &l…

前后端分离下,Spring Boot 请求从发起到响应的完整执行流程

以下是前后端分离架构下&#xff0c;Spring Boot 请求从发起到响应的完整执行流程&#xff0c;结合你提出的所有问题&#xff0c;按真实执行顺序和职责链条重新整理所有核心概念、结构、关键类、数据转换点和典型代码示例&#xff1a; 一、前端发起请求&#xff08;步骤1-2&…

基于sklearn实现文本摘要思考

和各位小伙伴分享一下使用sklearn进行文本摘要的思考。 第一版本 原理 提取式文本摘要的基本原理是&#xff1a; 将文本分割成句子 计算每个句子的重要性(权重) 选择权重最高的几个句子组成摘要 常用的句子权重计算方法&#xff1a; TF-IDF&#xff1a;基于词频-逆文档频…

OpenHarmony子系统开发 - DFX(三)

OpenHarmony子系统开发 - DFX&#xff08;三&#xff09; 五、HiTraceMeter开发指导 HiTraceMeter概述 简介 HiTraceMeter在OpenHarmony中&#xff0c;为开发者提供业务流程调用链跟踪的维测接口。通过使用该接口所提供的功能&#xff0c;可以帮助开发者迅速获取指定业务流…