掌握RocketMQ——基本概念和系统架构

news2024/11/25 6:28:46

简述RcoketMQ

概念:RocketMQ是一个开源的分布式消息中间件,由阿里巴巴开发并贡献给Apache软件基金会。它用于处理高吞吐量、低延迟的消息传递,并广泛应用于现代分布式系统中。

1 基本概念

1.1 消息 (Message)

       概念:消息是信息传递的物理载体,生产和消费数据的最小单位,每条消息必须属于一个主题。

模型图:

1.2 主题 (Topic)

       概念: 

       1.主题是消息的分类标识,用于区分不同类型的消息。
       2.每条消息只能属于一个主题,一个生产者可以同时发送多种主题的消息,而一个消费者只对某种特定的主题感兴趣,即只可以订阅和消费一种主题的消息。

模型图:

1.3 标签 (Tag)

        概念:为消息设置的标签。通过使用标签,消费者可以选择只接收特定类型的消息。

        标签通常用于在同一主题内区分消息的不同子类型或处理方式。消费者可以根据标签是实现对不同子主题的不同消费逻辑,实现更好的扩展性。

1.4 队列 (Queue)

        概念:队列是存储消息的物理结构,通常与主题相关联。每个主题可以对应多个队列,消息在队列中有序存储。

        补充:消费者从队列中拉取消息进行处理。队列的使用有助于实现负载均衡和消息的顺序消费。多个分区可以有多个消费者,一个分区只能有一个消费者。

1.5 消息标识 (Messageid/Key)

        概念:RocketMQ中每个消息拥有唯一的MessageId, 且可以携带具有业务标识的Key,以方便对消息的查询。

        注意:MessageId有两个:在生产者send(消息时会自动生成一个MessageId (msgId), 当消息到达Broker后,Broker也会自动生成一 个Messageld(offsetMsgId)。 msgId、 offsetMsgId与key都称为消息。
补充:
1.msgId: 由producer端生成, 其生成规则为:
producerIp +进程pid + MessageClientIDSetter类的ClassLoader的hashcode +当前时间+ Automi CInteger自增计数器
2.offsetMsgId: 由broker端生成, 其生成规则为: brokerIp +物理分区的offset
3.key:由用户指定的业务相关的唯一标识

2 系统架构

模型图:

2.1 生产者(Producer)

       消息生产者,负责生产消息。Producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递,投递的过程支持快速失败且低延迟。

模型图:

       在RocketMQ中消息生产者都是以生产者组的形式出现的。生产者组都是同一类生产者的集合,这类Producer发送相同主题类型的消息。

2.2 消费者和消费者组(Consumer和ConsumerGroup

       消息消费者,负责消费消息,一个消息消费者会从Broker服务器中取得消息,并对消息进行相关业务处理。

       同理,在RocketMQ中消息消费者都是以消费者组的形式出现,消费者组是同一类消费者的集合,这类Consumer消费的是同一个主题类型的消息。消费者组使得在消息消费方面,实现负载均衡和容错的目标变得非常容易。

来源于网络(下同)

       消费者组中Consumer的数量应该小于等于订阅Topic的Queue的数量,如果超出Queue数量,则多出的Consumer将不能消费消息。

一个Topic类型的消息可以被多个Consumer Group同时消费。

注意:

1.消费者组只能消费一个Topic的消息,不能同时消费多个Topic消息。

2.一个消费者组中的消费者必须订阅完全相同的Topic

2.3 消费点位(offset)

        由于不同消费者组之间的消息消费互不影响,当一个消费者组读取消息后,无法立即将其从MQ中移除。若移除,其他消费者组将无法读取;若不移除,则无法确定当前消费者组的消费进度。
        因此,通过Offset来标识一个消费者组的当前消费位置,每成功消费一条记录:Offset + 1。(MQ ≈ 数组,Offset ≈ 数组下标)

2.4 Name Server

       概念:其为一个Broker和Topic路由的注册中心,支持Broker动态注册和发现。

2.4.1 路由注册

       NameServer以集群方式部署,集群中的各个节点间无差异,互相不通讯。数据同步依靠Broker节点与每一个NameServer节点进行长连接,发起注册请求。(Broker节点为证明自己存活,会将最新信息以心跳包的方式上报NameServer,每30s一次。)

       优缺点:1.NameServer集群搭建简单。2.对于Broker要明确指出所有NameServer的地址,否则未指出地址的不会注册,故NameServer不可随意扩容,因为不重新配置Broker,新增的NameServer对于Broker不可见。

2.4.2 路由剔除

       由于Broker关机、宕机或网络抖动,NameServer没有收到Broker的心跳,则NameServer会将其从Broker列表中删除。NameServer中的定时任务会每隔10s扫描一次Broker列表并查看其最新心跳时间戳,距离当前时间超过120s,则判定Broker失效,将其从Broker列表中剔除。

2.4.3 路由发现

       RocketMQ的路由发现采用的是Pull模型。当Topic路由信息出现变化时,NameServer不会主动推动给客户端,而是由客户端定时拉取主题最新的路由,默认每30s拉取一次,所以存在实时性较差的问题。

       补充:1.Push模型:推送,实时性较好,需要维护一个长连接。2.Long Polling模型:长轮询模型,为Push和Pull模型的整合。

2.4.4 客户端(Producer和Consumer)NameServer选择策略

首先采用随机策略进行选择,失败后采用的是轮询策略

2.5 Broker

       概念:消息中转角色,负责存储消息、转发消息。在RocketMQ系统中负责接收并存储生产者发送来的消息,同时为消费者的拉取请求做准备。同时也存储消息的元数据。

2.5.1 模块构成

解释:

Remoting Module:整个Broker的实体,负责处理client端的请求。
Client Manager:客户端管理器,负责接收、解析客户端的请求,管理客户端。
Store Service:存储服务,提供方便简单的API接口,处理消息存储到物理硬盘和消息查询功能
HA Service:高可用服务,Master和Slave间的数据同步。
Index Service:索引服务,根据特定的Message Key,对投递到Broker的消息进行索引,也提供快速查询功能。

2.5.2 详解

Broker以集群形式出现。各集群中可能存放相同Topic的不用Queue。

       可能出现问题以及解决方法:如果某个Broker宕机,为了数据不丢失,会将每个Broker集群节点进行横向扩展,将Broker节点在建一个HA集群,解决单点问题。

       Broker是一个主从集群,集群中有Master和Slave。Master:负责读写操作。Slave:Master中国的数据的备份,Master挂了,Slave自动切换为Master。一个Master有多个Slave,一个Slave有一个Master。通过指定相同的BrokerName、不同的Brokerid来确定Master和Slave的对应关系,0为Master,非0为Slave。

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

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

相关文章

自定义协议以及序列化和反序列化

我们知道TCP是全双工的,可以同时进行发收,因为他有一个发送缓冲区和一个接收缓冲区 我们使用write其实是把数据拷贝到发送缓冲区,使用read接收缓冲区的数据,其实是把数据拷贝到文件缓冲区里,发送的过程中,我…

脸书(Facebook)高效开发国外客户的6个技巧

Facebook作为全球使用人数最多的社媒平台,全球三分之一的人都在用。做外贸的话基本上是必须要去掌握的一个平台,因为通过Facebook是可以开发到很多其他渠道平时开发不到的优质客户的。 Facebook跟LinkedIn不同,LinkedIn比较偏向于大B的客户&…

传热学一些“数”和意义

物体单位面积上的导热热阻/单位表面积上的对流换热热阻 无量纲时间 Nu与Bi的表达式相同,但是意义是无量纲的h。它们表达式里的长度取值不同,比如同样一个平板,Bi的L是厚度,Nu是长度,因为Bi面向固体,λ为固…

八种基本服务器类型,看这篇完全够了

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 上午好,我的网工朋友。 服务器作为网络基础设施的核心组件,其重要性不言而喻。 无论是个人空间还是大型企业的数据中心&…

激波是什么?

你肯定能听懂。激波,激烈的波,代表特征:激波扫过你时,重则五脏震动,支离破碎。轻则耳膜震动,隆隆作响,当然也有相对你而言尺度很小的激波,没啥伤害。 所以激波,和相对于…

【VScode】VScode如何离线安装扩展

VScode如何离线安装扩展 一,简介二,操作步骤2.1 扩展下载2.2 扩展安装 三,总结 一,简介 本文以“C/C Extension Pack”扩展为例,介绍如何在没有网络的环境下给VScode安装扩展,供参考。 二,操作…

gradle.properties的注释乱码的解决方案

问题描述: gradle项目的配置脚本的注解出现乱码:(#?????) gradle.properties #??? PRODSERVER2193.168.0.22 解决方案:(3步) 增…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3568移植案例(上)

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 本文章是基于瑞芯微RK3568芯片的DAYU200开发板,进行标准…

解决AWS Organizatiion邀请多个Linker账号数量限额问题

文章目录 情景再现什么是 AWS Organizations?操作步骤完整支持工单截图参考链接 情景再现 冷知识:默认情况下,一个组织中允许的原定设置最大账户数为10个。新创建的账户和组织的限额可能会低于默认的 10 个账户。 现在需要用一个AWS账号&…

小红书推广的7个数字营销策略分享-华媒舍

数字营销在如今的商业环境中变得越来越重要。在众多数字营销策略中,小红书已经成为了一种受欢迎的推广平台。本文将介绍小红书推广的七个数字营销策略,重点聚焦于第四个策略,该策略能够帮助你超额完成销售目标。 数字营销策略一:明…

JAVA:Fastjson 序列化和反序列化的技术指南

请关注微信公众号:拾荒的小海螺 博客地址:http://lsk-ww.cn/ 1、简述 在 Java 领域,JSON 作为轻量级数据交换格式广泛使用。对于高性能、高并发场景,选择一个高效的 JSON 序列化和反序列化库非常重要。Fastjson 是由阿里巴巴开发…

成长之路:我的技术布道之路回顾

成长之路:从零开始的技术布道之路回顾-哔哩哔哩 大家好,我是许泽宇,今天想跟大家分享一下我在过去一年的成长和收获。这一年对我来说是满满的一年,我在技术布道的道路上取得了一些小小的成绩,也收获了很多宝贵的经验。…

精选四款免费电脑录屏软件,轻松搞定屏幕录制

大家好,我是一个喜欢找各种办公软件的人,今天我要来聊聊咱们日常工作中一个超实用的小工具——电脑录屏软件。作为一个天天和电脑打交道的办公室文员,我算是尝遍了市面上几款热门的录屏神器,它们各有各的绝活,让我在工…

unix系统中的system函数

一、前言 本文将介绍unix系统中的system函数,包括system函数的作用以及使用方法。 二、system函数 简单来说,system函数用于创建一个子进程并让子进程运行新的程序。其原理是依次执行如下操作: fork() --> execl() --> waitpid() 函…

在QT中将Widget提升为自定义的Widget后,无法设置Widget的背景颜色问题解决方法

一、问题 在Qt中将QWidget组件提升为自定义的QWidget后,Widget设置的样式失效,例如设置背景颜色为白色失效。 二、解决方法 将已经提升的QWidget实例对象,脱离父窗体的样式,然后再重新设置自己的样式。

AP8505固定5V输出5V0.2A,SOP7/DIP7非隔离开关电源IC

AP8505基于高压同步整流架构,集成PFM控制器以及500V高可靠性MOSFET,用于外部元器件极精简的小功率非隔离开关电源。AP8505无线门铃芯片内置500V高压启动,实现系统快速启动、超低待机功能。5V非隔离无线门铃芯片AP8505提供了完整的智能化保护功…

基于Python的爬虫设计与数据分析—计算机毕业设计源码37836

目 录 摘要 1 绪论 1.1课题背景 1.2研究目的及意义 1.3爬虫技术 1.4django框架介绍 2 1.5论文结构与章节安排 3 2 基于Python的爬虫设计与数据分析分析 4 2.1 可行性分析 4 2.2 系统流程分析 4 2.2.1数据流程 5 2.2.2业务流程 5 2.3 系统功能分析 5 2.3.1 功能性分析 6 2…

线性代数入门:打开数学的另一扇门

线性代数入门:打开数学的另一扇门 线性代数,作为数学的一个重要分支,它不仅是许多科学和工程领域的核心工具,也是理解现代科技的关键。这篇文章将带你走进线性代数的世界,为你揭开这门学科的神秘面纱。 什么是线性代…

【RAG论文精读1】RAG原始论文-针对知识密集型NLP任务的检索增强生成

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构(用一个例子来阐明)场景例子:核心点: 五、方法 (架构各部分详解)5.1 模型1. RAG-Sequence Model2. RAG-Toke…

【面试官】谈谈你对顺序栈和链式栈的认识

思维导图 栈(Stack)是一种数据结构,遵循后进先出(LIFO)原则。在java中Stack在java.util.Stack中。 一.常用方法的使用 1. push(E item):把元素压入栈顶。 代码示例: import java.util.Stack;…