消息队列总结(2)- RabbitMQ Kafka RocketMQ运行架构

news2024/11/25 0:36:46

目录

1 RabbitMQ

1.1 工作原理

1.2 名词解释

1.3 交换机的几种类型

2 Kafka

2.1 工作原理

2.2 基本概念

3 RocketMQ

3.1 工作原理

3.2 基本概念

4 RabbitMQ & Kafka & RocketMQ的差异

5 参考文档


1 RabbitMQ

1.1 工作原理

1.【消息生产】生产者(Producer)可以通过AMQP协议与Broker建立连接,并创建Channel通道。每个Channel通道可以独立地进行消息的生产和消费,可以提高系统的并发性和可靠性。

2.【消息存储】生产者将消息Push到交换机(Exchange)后,消息首先被存储到内存中的Exchange中。此时如果消息无法被路由到任何一个队列,消息将被丢弃。如果消息被成功路由到一个/多个队列中,消息将被存储到队列(Queue)中,待消费者进行消费。(当消息数量超过一定的值,或者Broker发生故障,消息将被持久化到磁盘)。

3.【消息消费】消息到达队列(Queue)后,消费者需要显式的向Rabbitmq发送请求,从而获取到消息。(这种模式可以灵活地控制消息的消费速度和顺序,同时还可以避免消息的重复消费和丢失。)

1.2 名词解释

Broker(RabbitMQ服务器)

简单理解Broker就是RabbitMQ服务器,他是接收和分发消息的应用。

VHost(虚拟主机)

每一个Broker可以开设多个虚拟主机,其中每一个vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的Exchange(交换机)、Binding(绑定)、Queue(队列),也有自己的权限机制。

Exchange(交换机 )

交换机的核心作用是接受消息,并把消息路由到对应的队列上。

Routing key(路由键)

路由键是供交换机查看,并根据其值能够能够决定如何分发消息的健,用来指定消息的路由规则。

Queue(队列)

用于存储生产者生产的消息。

Binding(绑定)

绑定时一个动词,他是指通过路由规则(Binding Key)把交换机和队列关联起来。

Binding Key(绑定键)

在生产者和消费者Binding时,一般会指定一个Binding Key。当生产者发送Message给Exchange时,消息头上会携带Routing Key,当Routing Key与Binding Key匹配时,消息会被路由到对应的Queue中去

1.3 交换机的几种类型

Fanout

在Fanout模式下,生产者会把消息发送到Exchange,Exchange把消息路由到所有的队列中,一个消息可以被多个消费者消费。

Direct

在Direct模式下,生产者会把消息发送到Exchange,Exchange只会把消息路由到名字完全匹配的队列。(这里也支持两个队列使用同样的Binding Key与Exchange进行绑定)

Topic

在Topic模式下,生产者会把消息发送到Exchange,Exchange会通过通配符模糊路由到不同的队列中。

交换机和队列的Binding key用通配符来表示,有两种语法:

  • 可以替代一个单词;

  • 可以替代 0 或多个单词;

例如:lazy.orange.rabbit可以匹配到lazy.#,也可以匹配到*.orange.*。

2 Kafka

2.1 工作原理

1. 【消息生产】Producer从集群获取分区Leader,然后Producer将以Push的模式把消息写入Leader副本。Leader副本将消息写入本地,同时Follower主动从Leader副本Pull消息。Follower副本Pull消息完成后会给Leader副本一个ACK,最后Leader副本会向Producer进行ACK。

2.【消息存储】Partition就是以文件的形式存储,每个Partition下面会有多组segment文件,每组segment文件包括:.index文件、.log文件、.timeindex文件,其中.log文件就实际是存储message的地方,而.index和.timeindex文件为索引文件,用于检索消息。文件的命名是以该segment最小offset来命名的,kafka就是以这种分段+索引的方式来解决查询效率问题。

3.【消息消费】消息存储到.log文件后,消费者会主动去kafka拉消息,这里消费者也是从Leader副本拉取消息(消费者数可以小于分区数,这样可能存在一个消费者消费多个分区的情况)。

2.2 基本概念

Broker(Kafka集群实例)

Kafka集群的每一个服务器节点都是一个实例,用于存储和处理消息。

Topic(主题)

Topic是一个逻辑概念,是对消息的分类和归档。一个Topic可以被认为是一个消息的容器,所有的消息都被发布到一个Topic中,并且消费者可以订阅一个或多个Topic来接收消息。

Partition(分区)

分区是一个独立的有序队列,每个Topic可以被划分为多个分区。他的主要作用是提升Kafka的并发度,实现Kafka的高性能。

Replication(副本)

副本是指一个Partition的备份,每个Partition可以有多个副本。当主分区(Leader)故障的时候会选择一个副本(Follower)上位,成为Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,Follower和Leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。

Consumer Group(消费组)

消费组(Consumer Group)是一组消费者的集合,它们共同消费一个或多个Topic中的消息。消费组中的每个消费者都会独立地从Kafka中读取消息,并进行处理。消费组的作用是实现消息的负载均衡和高可用性。

Offset(偏移量)

Offset是Kafka中的消息偏移量,用于标识消息在Partition中的位置。

3 RocketMQ

3.1 工作原理

1.【消息生产】Producer发送消息,启动时先跟NameServer集群中的其中一台建立长连接,并从NameServer中获取路由信息,即当前发送的Topic消息的Queue与Broker的地址(IP + Port)的映射关系。然后根据算法策略从队选择一个Queue,与队列所在的Broker建立长连接从而向Broker发消息。在获取到路由信息后,Producer会首先将路由信息缓存到本地,再每30秒从NameServer更新一次路由信息。

2.【消息存储】Broker将消息存储到磁盘中,并维护Consumer的消费状态。Broker持久化的方案包括同步刷盘、异步刷盘。同步刷盘是指在消息发送时,将消息先写入操作系统的页缓存中,然后等待操作系统将页缓存中的数据刷入磁盘中,再返回ACK确认消息给Producer。异步刷盘是指在消息发送时,将消息先写入操作系统的页缓存中,然后立即返回ACK确认消息给Producer,同时将数据异步刷入磁盘中。

3.【消息消费】Consumer跟Producer类似,跟其中一台NameServer建立长连接,获取其所订阅Topic的路由信息,然后根据算法策略从路由信息中获取到其所要消息的Queue,然后直接跟Broker建立长连接,开始消费其中的消息。Consumer在获取到路由信息后,同样也会每30秒从NameServer更新一次路由信息。不同于Producer的是:Consumer还会向Broker发送心跳,以确保Broker的存活状态。

3.2 基本概念

Broker(RocketMQ集群实例)

主要负责消息的存储、查询消费,支持主从部署,一个 Master 可以对应多个 Slave,Master 支持读写,Slave 只支持读。Broker 会向集群中的每一台 NameServer 注册自己的路由信息。

Tag(标签)

标签(Tag)可以看作子主题,它是消息的第二级类型,用于为用户提供额外的灵活性。使用标签,同一业务模块不同目的的消息就可以用相同 Topic 而不同的 Tag 来标识。

NameServer(命名服务)

Name Server是RocketMQ的命名服务,它维护Topic和Broker的关系,当生产者发送消息时,它需要向Name Server查询Topic所在的Broker,然后将消息发送到对应的Broker中。

CommitLog(日志文件)

消息主体以及元数据的存储主体。Producer 发送的消息就存放在 commitlog 里面。

ConsumeQueue(消息消费队列)

消息消费队列,引入的目的主要是提高消息消费的性能,由于 RocketMQ 是基于主题 topic 的订阅模式,消息消费是针对主题进行的,如果要遍历 commitlog 文件中根据 topic 检索消息是非常低效的。

IndexFile(索引文件)

IndexFile(索引文件)提供了一种可以通过key或时间区间来查询消息的方法。

4 RabbitMQ & Kafka & RocketMQ的差异

架构模型差异

Kafka采用发布-订阅模型,消息被发布到Topic中,多个Consumer可以订阅同一个Topic中的消息。RabbitMQ和RocketMQ采用消息队列模型,消息被发送到队列中,多个Consumer可以从队列中消费消息。

消息传输方式

Kafka和RocketMQ采用基于TCP协议的自定义二进制协议进行消息传输,而RabbitMQ采用AMQP协议进行消息传输。

消息消费模式

消费模式分为推(push)模式和拉(pull)模式。push模式是broker端推送消息到consumer端,实时性高,但是需要进行流量控制以防止consumer端被压垮;pull模式是broker端去broker拉取消息,实时性较推模式差,但是可以根据自身的处理能力而控制拉取的消息量。其中Kafka是Pull模型,RabbitMQ、RocketMQ都可以支持Pull模式和Push模式。(RocketMQ的Push模式,本质是注册一个消费监听器,当监听器触发后进行Pull消息)

消息持久化

Kafka和RocketMQ采用基于磁盘的消息持久化方式,消息被写入磁盘中,以保证消息的可靠性和持久性。而RabbitMQ采用基于内存的消息持久化方式,消息被写入内存中,当RabbitMQ重启时,消息会丢失。

性能和吞吐量

Kafka和RocketMQ都是高吞吐量、低延迟的消息队列系统,可以支持每秒百万级别的消息处理。而RabbitMQ的性能和吞吐量相对较低,适合处理低延迟、高可靠性的消息传输场景。

5 参考文档

RabbitMQ介绍及部署(超详细讲解)_rabbitmq服务器_char1otte的博客-CSDN博客

rabbitMQ的详细介绍_雨会停rain的博客-CSDN博客

RabbitMQ 内部结构原理介绍_rabbitmq原理和架构_·梅花十三的博客-CSDN博客

干货:RabbitMQ核心概念及工作原理

RabbitMQ详解(7大架构原理图解)

RabbitMQ--架构原理_51CTO博客_rabbitmq原理

消息队列原理和选型:Kafka、RocketMQ 、RabbitMQ 和 ActiveMQ - 知乎

RabbitMQ的工作模式及其原理(一)_rabbitmq broker_班乃的博客-CSDN博客

为什么要使用RabbitMQ? - 知乎

分布式消息队列RocketMQ工作原理_编程小飞侠的博客-CSDN博客

Kafka与Rocketmq的区别_rocketmq和kafka区别_aasoga的博客-CSDN博客

RocketMQ 基本概念与工作原理_rocketmq工作原理(四个组件)_Cimbala的博客-CSDN博客

Kafka史上最详细原理总结(一)_kafka index 和log原理_徐小慧_Blog的博客-CSDN博客

RocketMQ之原理深入讲解 - 简书

RocketMQ 架构简介_rocketmq副本机制_XP-Code的博客-CSDN博客

RocketMQ之 CommitLog_不能放弃治疗的博客-CSDN博客

Kafka、RocketMQ、RabbitMQ的比较总结_kafka rabbitmq rocketmq_【江湖】三津的博客-CSDN博客

RabbitMQ学习(四)——RabbitMQ的运行流程_rabbitmq消费流程_再小的帆也能远航啊的博客-CSDN博客

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

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

相关文章

TMS FNC Core Crack

TMS FNC Core Crack 跨框架核心层,用于创建丰富的可视化和非可视化组件。 特点 JSON读、写和解析功能 Base64和URL编码和解码 组件持久性 撤消/恢复管理器 数字、字母数字字符集的验证 消息、文件打开和保存对话框 轻松访问应用程序和文档文件夹 打开文件和URL 位图…

非对称加密算法关于公钥和私钥

公钥和私钥成对出现 公开的密钥叫公钥,只有自己知道的叫私钥 用公钥加密的数据只有对应的私钥可以解密 用私钥加密的数据只有对应的公钥可以解密 如果可以用公钥解密,则必然是对应的私钥加的密 如果可以用私钥解密,则必然是对应的公钥加的密 …

leetcode 17 电话号码的字母组合

题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路: 从示例上来说,输入"…

第十七章:Dual Attention Network for Scene Segmentation ——双重注意力网络用于场景分割

0.摘要 在本文中,我们通过基于自注意机制捕捉丰富的上下文依赖来解决场景分割任务。与以往通过多尺度特征融合来捕捉上下文的方法不同,我们提出了一种双重注意力网络(DANet),以自适应地将局部特征与全局依赖性相结合。…

.net6中WPF的串口通信和USB通信

之前写过串口通信,不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和…

TypeScript基础教程

ts与js区别 TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program. 语言层面:JavaScript和TypeScript都是ECMAScript(ECMA-2…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节:资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论…

<数据结构>并查集

目录 并查集概念 合并 查找集合的数量 并查集类代码实现 并查集概念 并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合 不过并查集是森林的概念,并查集的学习可以帮助我们去更…

(QGIS)在QGIS中加载星图地球数据云的数据

本文以“瓦片数据”为例进行操作示例说明,类似矢量数据、地形数据等,方法步骤一样,将URL换成对应数据的示例网址与本人的token即可。 1、星图地球数据云上注册用户 注册登录星图地球数据云网站:https://datacloud.geovisearth.c…

Python 函数(二)

Python 函数(二) 一、可变参数、不可变参数 ​ 什么是可变类型,什么又是不可变类型? 这里我们首先要了解一个东西,在计算机程序中我们定义一个变量,并对其存储一个数值。这里有两个关键概念:内…

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中,函数的分文件编写是一种让代码结构更加清晰的方法,通常可以分为以下几个步骤: 创建后缀名为 .h 的头文件,在头文件中写函数的声明,以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…

自动化运维工具——Ansible学习(二)

目录 一、handlers和notify结合使用触发条件 1.新建httpd.yml文件 2.复制配置文件到ansible的files目录中 3.卸载被控机已安装的httpd 4.执行httpd.yml脚本 5.更改httpd.conf配置文件 6.使用handlers 7.重新执行httpd.yml脚本 8.检查被控机的端口号是否改变 9.handle…

矩阵乘法的硬件加速

矩阵乘法的硬件加速 这里的硬件加速是指,如果依靠算法,可以通过减少访存次数来加速。可以将数据预取到cache来减少访存次数。 矩阵相乘最简单的实现 寄存器平铺矩阵乘法 将矩阵划分成多个小的矩阵块,小的矩阵块可以存放在寄存器中&#xff0…

QT开发技巧之嵌入式linux QT的QCombobox显示空白的问题

1.问题 开发平台:imx6ull qt版本:5.12.9 在嵌入式linux上运行的qt,QCombobox显示空白,不能显示其中的文本内容 2.解决办法 选中QCombobox,在属性栏中将foucsPolicy由WheelFocus改成NoFocus就好了

用户、角色、权限、菜单--数据库设计

用户角色关联表--user_role id-------------------主键 user_id------------用户ID role_id-------------角色ID create_time------创建时间 is_deleted--------状态(0:未删除 1:删除) 角色权限关联表--role_permission id------…

【PHP面试题50】Redis的主从复制实现原理是怎么样的?如何保证数据一致性?数据延迟又该如何处理?

文章目录 一、前言二、主从复制的基本原理三、数据一致性的保证四、数据延迟的处理四、总结 一、前言 本文已收录于PHP全栈系列专栏:PHP面试专区。 计划将全覆盖PHP开发领域所有的面试题,对标资深工程师/架构师序列,欢迎大家提前关注锁定。 R…

OpenCv算子

目录 一、索贝尔(sobel)算子 二、沙尔(Scharr)算子 三、拉普拉斯算子 一、索贝尔(sobel)算子 边缘的定义: 边缘是像素值发生跃迁的位置,是图像的显著特征之一,在图像特征提取、对象检测、模式识别等方面都有重要的作用。 sobel算子对图像求一阶导数。…