【消息队列设计总结】RabbitMQ、Kafka、RocketMQ对比之运行架构

news2024/11/26 20:36:21

目录

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/760064.html

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

相关文章

润本股份提交注册:拟募资约9亿元,赵贵钦、鲍松娟夫妇为实控人

撰稿|汤汤 来源|贝多财经 近日,润本生物技术股份有限公司(下称“润本股份”)在上海证券交易所递交招股书(注册稿)。据贝多财经了解,润本股份于2023年3月递交上市申请材料,准备在上海证券交易所…

MySQL-DDL-表的结构-查询修改删除

DDL(表操作) 查询 查询当前数据库所有表:show tables 查询表结构:desc 表名 查询建表语句:show create table 表名 修改(主要还是通过图形化界面进行操作) 添加字段:alter table …

王道考研数据结构第六章知识点总结

6.1.1图的基本概念 顶点集一定是非空集,边集可以是空集 非连通图:让任意n-1个顶点之间两两相连,另一个顶点与任意一个都不存在路径,则为非连通图的最大边数。 注意长三角地区铁路网不属于连通分量,因为它没有包含尽可能…

简单认识MySQL数据库索引

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、索引的概念1、简介2、作用3、索引的副作用:4、创建索引的原则依据5、索引的分类 二、索引的增删改查1.创建索引(1)创建普通索…

ios 通过xib自定义控件

通过xib自定义控件 xib和stroyboayd对比 共同点: 都是用来描述软件界面 都是用interface Builder工具来编辑 本质都是转换成代码去创建控件 不同点: xib是轻量级的,用来描述局部ui界面 创建模型文件 XMGCar 自定义控件 xib 图形设计 …

zookeeper和kafka与EFLFK集群

zookeeper和kafka 一:Zookeeper 概述1.Zookeeper 定义2.Zookeeper 工作机制3.Zookeeper 特点4.Zookeeper 数据结构5.Zookeeper 应用场景6.Zookeeper 选举机制6.1.第一次启动选举机制6.2.非第一次启动选举机制(1)当ZooKeeper 集群中的一台服务…

支持向量机(SVM)的超参数调整 C 和 Gamma 参数

作者:CSDN @ _养乐多_ 支持向量机(Support Vector Machine,SVM)是一种广泛应用的监督式机器学习算法。它主要用于分类任务,但也适用于回归任务。在本文中,我们将深入探讨支持向量机的两个重要参数:C和gamma。在阅读本文前,我假设您对该算法有基本的了解,并专注于这些…

【MySQL】MySQL在Centos7环境下安装

目录 一、卸载不要的环境 1.1、查看是否有安装mysql 1.2、关闭运行的程序 1.3、卸载安装 二、配置yum 源 2.1、下载yum 源 2.2 安装yum源 2.3 查看是否已经生效 三、安装mysql服务 四、启动服务 五、登录方法 方法一(不行就下一个) 方法二(不…

前端必看的书籍

十本学习前端必看书籍 第一本,入门 《Head first HTML&CSS》 最好的入门书。看两遍就对HTML & CSS 有个大概印象了。 此时把w3cschool作为备查手册收藏起来 第二本《CSS权威指南(第三版)》 最权威的CSS书籍,除了阅读W3C的文档外的不二选择(就是翻…

HDFS体系结构及基本概念

1、hdfs体系结构及基本概念 1.1 namenode是什么,作用是什么 Namenode维护了很多得信息,那么这么多信息存放在哪里呢?在hadoop中有个core-site.xml的文件 路径是 [root@cdp3 hadoop]# pwd /home/hadoop/hadoop-2.2.0/etc/hadoop 1.2 datanode是什么,作用是什么 data…

Kubernetes对象深入学习之三:对象属性

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是《Kubernetes对象深入学习》系列的第三篇,主要内容是关于对象属性的知识点,关于对象属性,先通过一个具体…

vue3-03筛选任务

前置知识:生命周期函数在vue3不再是配置式的,而是一个普通函数。 步骤: 确认筛选条件是通过hash值声明filter函数:通过hash改变的筛选得到对应的任务列表userFilter.js文件:用于任务的筛选。 使用一个响应式变量visib…

copy和xcopy实现复制文件和文件目录

copy命令复制文件 语法 copy [/d] [/v] [/n] [/y | /-y] [/z] [/a | /b] <source> [/a | /b] [<source> [/a | /b] [ ...]] [<destination> [/a | /b]]参数说明 参数说明/d允许加密的源文件保存为解密的目标文件/v验证目标文件是否正确写入/n如果需要&…

kubesphere的CICD

安装 SonarQube 服务器 请先安装 Helm&#xff0c;以便后续使用该工具安装 SonarQube。例如&#xff0c;运行以下命令安装 Helm 3&#xff1a; curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash查看 Helm 版本 helm versionversion.Buil…

3D渲染速度慢,花重金买显卡还是用云渲染更划算

3D渲染对建筑师和设计师来说并不陌生&#xff0c;3D渲染的过程中出现渲染卡顿、特殊材质难以渲染&#xff0c;或者本地配置不足、本地渲染资源不够时&#xff0c;常常会影响工作效率。本文比较了3D渲染时&#xff0c;为提高工作效率&#xff0c;买显卡还是用云渲染更划算&#…

SystemVerilog 教程第二章数据类型:队列

SystemVerilog 队列 SystemVerilog queue&#xff08;队列&#xff09;是一种 First In First Out&#xff08;先入先出&#xff09;方案&#xff0c;您可为其设置变量大小&#xff0c;用于存储相同数据类型的各种元素。 它与一维解包阵列类似&#xff0c;同样可以自动伸缩调整…

zabbix 6.0 监控LNPM环境

这里的LNPM是指Linux&#xff0c;Nginx,php-fpm和Mysql.具体版本如下。 Linux : centos7.9Nginx: 1.22.1php-fpm:7.4Mysql: 8.0 一、centos7.9 编译安装Nginx 为了弄清楚Nginx各种配置&#xff0c;我们采用编译安装的形式部署Nginx。 1.下载安装包 首先下载Nginx软件包&am…

unity 调用C++ dll 有类和指针操作

这个在之前unity 调用C dll 操作升级套娃函数调用_天人合一peng的博客-CSDN博客的基础上&#xff0c;但实事时类相互嵌套&#xff0c;非常不好处理。 1 测试直接将main()生成dll程序能运行不。 发现是可以的。 2 那就是想方法把对象或指针的操作的下一级函数直接写到main里面&…

简单认识数据库用户管理

文章目录 一、数据库用户管理1、新建用户&#xff08;1&#xff09;创建用户使用明文设置密码&#xff08;2&#xff09;获取密文再给新用户设置密码&#xff08;3&#xff09;查看数据库用户和其他信息&#xff08;4&#xff09;查看当前登录用户信息 2.修改数据库用户相关信息…

漏洞复现-CVE-2023-33246 Apache RocketMQ RCE漏洞原理与复现

目录 漏洞原理漏洞描述影响范围 Apache RocketMQ学习文档学习代码审计 漏洞复现docker环境搭建exp代码 总结参考 漏洞原理 漏洞描述 For RocketMQ versions 5.1.0 and below, under certain conditions, there is a risk of remote command execution. Several components of…