当前位置: 首页 > news >正文

【RocketMQ 源码分析(一)】设计理念与源码阅读技巧

RocketMQ 的设计理念与源码阅读技巧

  • 一、设计理念
  • 二、源码设计
  • 三、源码阅读技巧

一直想仔细仔细看看这个 RocketMQ 的源码,学学它的设计思想和编码风格,没准在以后自己在设计和编码的时候有思考的方向。这是专栏的第一篇 —— 介绍下 RocketMQ 的一些设计,懂其设计和原理,才能更好地阅读源码.

RocketMQ 是阿里巴巴开发的,开发之前他们也使用过当时流行的 Kafka 作为自己的解决方案,但是是说它没法满足低延迟、高可靠的要求(Kafka 若分区多了,对磁盘写来说会出现大量随机写的情况,写入性能会下降很多,这里说的低延迟与实际使用方式和数据存储实现有关系),当然还有其它原因,所以它们决定开发一款新的消息传递引擎来满足自己的业务需求。
上面内容来自:RocketMQ 官方文档

一、设计理念

咱先聊聊设计一款消息中间件需要具备的要素,设计一款消息队列中间件,首先它需要对外提供通信路口,提供生产、消费消息的路口,即需要具备网络通信能力;其次就是它得具备数据存储的能力,这数据包含消息本身与元数据存储。
了解完设计消息队列的必要元素,咱来看看 RocketMQ 的技术架构:
在这里插入图片描述
主要由四部分组成:

  • NameServer
    • 被用来当做信息管理的"注册中心",主要是用来管理元数据(路由信息)。Kafka 元数据管理是用的 Zookeeper,而 RocketMQ 是自己写了一个服务实现这个元数据注册中心,写的这个服务被称为 NameServer,NameServer 被设计出来是一种无状态的,即 NameServer 集群之间是不通信的,这样做一方面可以满足实际需求的前提下(路由信息无需保障集群之间强一致性,可以容忍分钟级别的不一致),相比 Zookeeper 性能也有极大的提升。
  • Broker
    • 主要用来做消息存储的服务
  • Producer、Consumer
    • 消息队列的客户端,除了实现消息的发送消费外,RocketMQ 很多功能交给了客户端进行实现,减轻消息中间件的实现复杂度,像消息生产的高可用、消息顺序消费、消费幂等等等,这些功能都是交由客户端实现的。

二、源码设计

看源码第一步就是下载源码:https://github.com/apache/rocketmq
随后了解一下源码的目录结构:
在这里插入图片描述
RocketMQ核心目录说明如下:

  • acl:权限控制模块
  • broker:broker模块(broker启动进程)
  • client:消息客户端,包含消息生产者和消息消费者相关类
  • common:公共包
  • dev:开发者信息(非源码)
  • distribution:打包分发目录(非源码)
  • example:RocketMQ示例代码
  • filter:消息过滤相关基础类
  • logappender:日志实现相关类
  • logging:自主实现日志相关类
  • namesrv:NameServer实现相关类(NameServer启动进程)
  • openmessaging:消息开放标准,已发布
  • remoting:远程通信模块,基于Netty
  • srvutil:服务器工具类
  • store:消息存储实现相关类
  • style:checkstyle相关实现
  • test:测试相关类
  • tools:工具类,监控命令相关实现类

RocketMQ 的网络通信是基于 Netty 实现的,这里需要提一下它是如何设计接收网络消息去执行任务的,如何进行的编码设计使得它更具拓展,更灵活。
其实在服务端(NameServer、Broker)/客户端(Producer、Consumer)中都维护了一个 processorTable,是一个 k-v 集合,key 是服务码 requestCode,value 是对应的执行单元 Pair<NettryRequestProcessor, ExecutorService> 类型,包含了处理 Processor 和执行线程的线程池。里面对应内容在对应业务系统启动的时候会自行注册。
客户端发送网络包的时候会携带 RequestCode,服务端接收网络包后进行解码得到 RequestCode,然后通过 ProcessorTable 找对应 Processor 任务拿对应线程池进行执行,从而实现了异步任务执行。这种服务注册机制,简洁且灵活。
类似这种使用 Netty 实现通信然后与业务结合的编码设计,我在 IM 系统、货柜系统也看见过。
在这里插入图片描述

三、源码阅读技巧

  • 先理解相应底层原理,再去针对性的看源码实现,学习编码,验证原理
  • 源码阅读建议起始点
    • Broker 启动:BrokerStartup#start、NameServer 启动:NamesrvStartup#start、客户端相关的源码阅读可以从 example 目录下的用例直接入手
  • 不太建议 Debug 阅读源码,建议静态看源码,看不懂的地方再尝试调试跟进。一方面是对这种能力的培养,另一方面中间件源码不同于业务系统,中间件源码堆栈太多,容易绕晕,而且很多异步
  • 书籍与博客辅助看源码
    • 书籍推荐:《RocketMQ 技术内幕》
  • 反复看

相关文章:

【RocketMQ 源码分析(一)】设计理念与源码阅读技巧

RocketMQ 的设计理念与源码阅读技巧 一、设计理念二、源码设计三、源码阅读技巧 一直想仔细仔细看看这个 RocketMQ 的源码&#xff0c;学学它的设计思想和编码风格&#xff0c;没准在以后自己在设计和编码的时候有思考的方向。这是专栏的第一篇 —— 介绍下 RocketMQ 的一些设计…...

独立ip服务器有什么优点?

网站的性能和安全性直接影响到用户体验和业务发&#xff0c;独立IP服务器作为一种主流的托管方式&#xff0c;因其独特的优势而受到许多企业和个人站长的青睐。与共享IP相比&#xff0c;独立IP服务器到底有哪些优点呢&#xff1f; 使用独立IP的用户不必担心与其他网站共享同一…...

如何使用Python库连接Redis

1、redis-py 库封装一个 Redis 工具类可以帮助我们简化 Redis 的操作并提高代码的复用性和可维护性。 安装redis pip install redisimport redis import logginglogging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__)class RedisUtils:def __init__(s…...

Vant UI +Golang(gin) 上传文件

前端基本用法&#xff1a;点击查看 实现代码&#xff1a; const afterRead (file) > {console.log(file);//set content-type to multipart/form-dataconst formData new FormData();formData.append("file", file.file);request.POST("/api/v1/users/up…...

【Unity高级】如何实现粒子系统的间歇式喷射

先看下要最终实现的效果&#xff1a; 代码如下&#xff1a; using UnityEngine; using System.Collections;public class ParticleBurstController : MonoBehaviour {private ParticleSystem _particleSystem; // 获取粒子系统public float burstDuration 2f; // 每次…...

通过linux命令获取自选股票价格及大盘涨跌幅

技术发展与数据获取需求 互联网与金融数据融合:随着互联网的普及和金融市场的数字化发展,金融数据的获取和分析变得更加便捷和重要。投资者希望能够及时、准确地获取股票价格和市场指数等信息,以便做出合理的投资决策。Linux 作为一种强大的操作系统,为数据获取和处理提供…...

透彻理解并解决Mockito模拟框架的单元测试无法运行的问题

本篇的实例基于Maven IDE (VS Code) 运行 在VS Code 运行的时候&#xff0c; 不需要在pom.xml 中添加任何插件就可以在测试类中看到如下的绿色按钮&#xff0c;单击就可以运行使用Mockito 注解 ExtendWith(MockitoExtension.class) 或是 Mockito 代码方式的测试。 不使用注…...

vue3字典数据的显示问题(使用hooks解决)

我们在使用 element-plus的时候&#xff0c;经常会使用一些字典数据&#xff0c; 在搜索框的时候&#xff0c;字典数数要使用 el-select el-option 来显示&#xff0c;当在table表格的时候&#xff0c;我们通常记录的是 字典数据的id , 又要把它改变成 字典数据的 name 属性 因…...

Elasticsearch 单节点安全配置与用户认证

Elasticsearch 单节点安全配置与用户认证 安全扫描时发现了一个高危漏洞&#xff1a;Elasticsearch 未授权访问 。在使用 Elasticsearch 构建搜索引擎或处理大规模数据时&#xff0c;需要启用基本的安全功能来防止未经授权的访问。本文将通过简单的配置步骤&#xff0c;为单节…...

二分查找(带图详解)

优选算法系列 文章目录 优选算法系列前言一、二分查找的思想二、算法使用小总结 三、代码实现四、二分查找拓展4.1、查找第一次出现的target小总结 4.2、target最后出现的位置小总结 五、代码总结 前言 在这篇博客中&#xff0c;我会给大家分享二分查找及其扩展。 这是链接-&…...

【Git】:标签管理

目录 理解标签 创建标签 操作标签 理解标签 标签的作用 标记版本&#xff1a;标签 tag &#xff0c;可以简单的理解为是对某次 commit 的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项目发布某个版本的时候&#xff0c;针对最后⼀次 commit 起⼀个 v1.0 这样…...

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品&#xff0c;比如电脑&#xff0c;鼠标&#xff0c;键盘&#xff0c;杯子&#xff0c;行李箱&#xff0c;双肩包&#xff0c;床&#xff0c;椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…...

单片机软件工程师前景分析

单片机软件工程师的前景在2024年看起来是积极的。随着物联网&#xff08;IoT&#xff09;、自动化、智能设备等领域的快速发展&#xff0c;对于能够开发基于单片机&#xff08;MCU&#xff09;如STM32、ARM、51等嵌入式系统的软件工程师需求持续增长。这些工程师负责设计和实现…...

在Java中几种常用数据压缩算法的实现及其优劣势

在Java中几种常用数据压缩算法的实现及其优劣势 背景&#xff1a;项目需要引入Redis作为缓存组件&#xff0c;需要考虑到Redis的内存占用&#xff08;机器内存越大&#xff0c;成本越高&#xff09;&#xff0c;因此需要引入数据压缩。 1、介绍 数据压缩是计算机领域中一项重要…...

Word——如何打出 符号中的 1、2、3等带圆圈的序号

一、方式1 1.1&#xff1a;点击 插入-符号 1.2&#xff1a;字体 选择 Wingdings 或者 Wingdings 2 二、方式2 带1的圈&#xff1a;输入 2460&#xff0c;然后按 AItX 带2的圈&#xff1a;输入 2461&#xff0c;然后按 AItX 带3的圈&#xff1a;输入 2462&#xff0c;然后按 …...

操作系统之进程与线程

进程 定义&#xff1a; 进程是具有独立功能的程序关于某个数据集合上的一次运行活动&#xff0c;是系统进行资源分配和调度的独立单位。 组成&#xff1a; 包括程序代码、程序处理的数据、程序计数器、一组寄存器的值以及系统资源&#xff08;如打开的文件&#xff09;等。 …...

代码随想录算法训练营打卡第35天:背包问题

前言 zaccheo打卡代码随想录第35天 由于这段时间工作太忙了&#xff08;加上我的懒病犯了&#xff09;导致迟打卡了好几天555555.。。。 今天的主要是动态规划中的背包问题&#xff0c;这个真的是蛮难理解的&#xff0c;我把我自己强行按在椅子上半个小时一点一点的看卡哥文章…...

【MySQL】数据库 Navicat 可视化工具与 MySQL 命令行基本操作

&#x1f4af; 欢迎光临清流君的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落 &#x1f4af; &#x1f525; 个人主页:【清流君】&#x1f525; &#x1f4da; 系列专栏: 运动控制 | 决策规划 | 机器人数值优化 &#x1f4da; &#x1f31f;始终保持好奇心&…...

vscode(一)安装(ubuntu20.04)

1、更新软件包列表 sudo apt update2、安装依赖包 sudo apt install software-properties-common apt-transport-https wget3、导入Microsoft GPG密钥 wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -4、向系统添加VSCode存储库 sudo…...

利用永恒之蓝对win7进行键盘记录

打开kali中的msfconsole 找到永恒之蓝&#xff0c;设置靶机ip&#xff0c;后可以exploit&#xff0c;也可以run 连接成功 查看进程&#xff0c;选择监听靶机win7上的cmd.exe进程 当前进程不是1484&#xff0c;需要迁移到1484 cmd.exe&#xff0c;进程迁移 键盘监听&#xff0c;…...

STM32CubeMX实战:5分钟搞定MAX31865 PT100测温,从SPI配置到温度读取全流程

STM32CubeMX实战&#xff1a;5分钟搞定MAX31865 PT100测温&#xff0c;从SPI配置到温度读取全流程 在工业测温领域&#xff0c;PT100凭借其优异的线性度和稳定性成为温度测量的黄金标准。而MAX31865作为专为RTD传感器设计的信号调理器&#xff0c;极大简化了前端电路设计。本文…...

智能定时任务管理:用自然语言替代Crontab,TickGPTick项目实践

1. 项目概述&#xff1a;一个能“听懂”你需求的定时任务管理器最近在折腾一个自动化脚本项目时&#xff0c;我又一次陷入了“定时任务”的泥潭。相信很多开发者都有同感&#xff1a;写个脚本容易&#xff0c;但想让它定时、可靠、有状态地跑起来&#xff0c;总得和 crontab、s…...

别再死记PRBS7/15了!用Python+NumPy手搓一个可配置的PRBS码生成器(附完整代码)

用Python构建可配置PRBS生成器&#xff1a;从LFSR原理到信号仿真实战 在数字通信和高速电路设计中&#xff0c;工程师们经常需要生成特定的测试信号来验证系统性能。伪随机二进制序列&#xff08;PRBS&#xff09;因其近似真实数据流的特性&#xff0c;成为信号完整性测试的黄金…...

在Windows上安装安卓应用的终极指南:APK安装器完整使用教程

在Windows上安装安卓应用的终极指南&#xff1a;APK安装器完整使用教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 想要在Windows电脑上直接运行安卓应用吗&#x…...

别再硬编码IP了!深入Nacos 2.x源码,看它如何‘智能’又‘犯错’地选择服务端地址

Nacos 2.x服务端IP地址选择机制深度解析与实战调优 在分布式系统架构中&#xff0c;服务注册与发现是微服务架构的核心基础设施。作为阿里巴巴开源的服务发现和配置管理平台&#xff0c;Nacos凭借其简单易用、功能强大等特点&#xff0c;已成为众多企业微服务架构的首选组件。…...

HTML5中针对离线存储数据的自动清理与过期策略

...

基于Gemini API构建多模态视觉应用:从原理到部署实践

1. 项目概述与核心价值最近在AI多模态领域&#xff0c;一个名为“gemini-vision-pro”的项目在开发者社区里引起了不小的讨论。这个项目本质上是一个基于Google Gemini API的视觉识别与图像理解应用&#xff0c;但它并非简单的API调用封装&#xff0c;而是提供了一个开箱即用、…...

基于ESP32-S3与CircuitPython的NASA小行星追踪器项目实践

1. 项目概述&#xff1a;一个会“说话”的太空瞭望台如果你对头顶那片星空既充满好奇又带有一丝敬畏&#xff0c;想知道是否有“天外来客”正悄无声息地接近我们&#xff0c;那么这个项目就是为你准备的。这不是一个简单的数据看板&#xff0c;而是一个亲手搭建的、能实时“对话…...

Zabbix监控扩展实战:zbx-openclaw开源模板深度解析与应用指南

1. 项目概述与核心价值最近在折腾监控告警系统&#xff0c;发现一个挺有意思的开源项目&#xff0c;叫zbx-openclaw。这名字乍一看有点抽象&#xff0c;但拆开来看就明白了——zbx指的是 Zabbix&#xff0c;那个老牌的监控系统&#xff1b;openclaw直译是“开放的爪子”&#x…...

Redis向量搜索实战:基于redis-vl-python构建高性能语义检索系统

1. 项目概述&#xff1a;当Redis遇上向量搜索如果你最近在关注数据库和AI应用开发&#xff0c;大概率会听到“向量数据库”这个词。传统的Redis&#xff0c;那个我们用来做缓存、消息队列、排行榜的“瑞士军刀”&#xff0c;现在也开始拥抱这个新潮流了。redis/redis-vl-python…...