基于RocketMQ-4.9.0的RocketMQ-4.9.0分析
实际上,处理请求作为名称服务器的过程是相同的。在上一篇经纪人启动文章中,我们知道,当经纪人开始时,Netty服务最终将启动读写请求。并处理请求。
在分析经纪人开始的过程中,我们通过源代码看到Netty Server启动类将绑定很多,有些人负责处理手,有些人负责处理心跳,有些负责处理连接,也负责处理连接,也负责处理。负责阅读和写作。在其中,负责阅读和写作。
我们可以简单地查看代码:
经纪人打开端口10911与生产者和消费者进行通信。因此,NettyServerHandler类是我们分析的入口:这是类的内部类别
}
总结一下,做两件事,获取处理器,然后调用处理器的处理方法。
处理产品发送消息的处理器是。
}
然后,我们继续点击内部实现:
因此,我们继续查看第2点,它如何端口消息:
然后,我们继续查看该方法以查看其如何存储消息:
此方法也有许多内容,我们仍然简单地总结:
将消息写入Commitlog后,此消息的处理过程已经结束。然后,下一个是消息分发(构建消息索引)
关于消息存储,让我们在官方网站上阅读文章说明:
消息存储整体体系结构
消息存储架构图主要包含以下与消息存储有关的三个文件。
(1)commitlog:消息主题和元数据的存储主题,产品编写的消息的主要内容,消息的内容未固定。单个文件的大小为1G默认值,文件名称长度为20位,左侧补充了零。第一个文件已满。第二个文件是00000000001073741824,初始偏移量为1073741824,依此类推。该消息主要是在文件已满时按顺序写入日志文件,写下下一个文件;
(2)消耗:消息消耗队列,引言的目的是提高消息消耗的性能。因为RockEtMQ基于主题订阅模式,所以消息消耗用于主题。Ineffiticed.Consumer可以根据Clubemequeue.homm,Cublemequeue(逻辑消费者队列)作为消费者消息的索引来找到要消费的消息,它保留了它,它保留提示书,消息大小和消息标签的哈希码值的最初物理偏移偏见。可以将其视为主题 - 基于主题的commitlog索引文件。}/{filename}。文件采用固定长度设计。每个条目总共有20个字节,其中8个字节是提交物理偏移量的8个字节,4个字节消息长度,8个字节标签哈希码。单个文件由30W条目组成。您可以像数组一样随机访问每个条目,每个替代文件大小约为572万;
(3)indexfile:indexfile(索引文件)提供了一种可以通过密钥或时间间隔查询消息的方法。索引文件的存储位置为:$ home/store/store/index $ {filename}。文件名文件名以创建时间戳命名。固定的单个索引文件大小约为400m。索引文件可以保存2000W索引,基础存储设计的索引毛利是为了在文件系统中实现hashmap结构,因此将RocketMQ索引文件的底层实现为哈希索引。
可以在上述RocketMQ中的RocketMQ中的RocketMQ中使用混合存储结构的整体体系结构图中看到它.RocketMQ的混合存储结构(多个主题消息实体内容存储在Commitlog中),分别由数据和索引分开。磁盘文件的提交列表,生产者发送的消息不会丢失。因为这样做,消费者必须有机会花费新闻。当无法删除消息时,您可以等待下一条消息捡起。同时,服务器还支持长期查询模式。如果绘制了消息,请求未收到消息,经纪人允许时间等待30。新闻到达并将直接返回消费方。经纪人侧-ReputmessAgesEvice到非停机分发请求并构建替代品(逻辑消费者队列)和indexfile(索引文件)数据。
页缓存和内存映射
PageCache是OS的缓存,可以加速文件的读写。从总的来说,程序读取和写入文件的速度几乎与内存的读写速度接近。主要原因是操作系统使用PageCache机制来优化读取和写入访问操作,并将部分内存用作PageCache。对于数据的编写,OS将首先写入缓存,然后使用PDFlush内核要使用pdflush内核来刷数据中的数据到物理磁盘。对于数据读数,如果一次读取文件时存在不受欢迎的pagecache,则OS将从物理磁盘中访问读取文件,而另一个相邻的文件将访问读取文件数据文件将按顺序预先阅读。
在RockEtMQ中,存储在Clumequeue逻辑消费者队列中的数据较少,并且按顺序读取。在页面缓存机制的预读取效果下,消耗队列文件的读取性能几乎接近阅读内存,即使存在新闻累积,也不会影响性能。对于Commitlog存储的日志数据文件消息,它将在阅读消息内容时会产生更多的随机访问阅读,这会严重影响性能。如果选择正确的系统IO调度算法,例如将调度算法设置为“截止日期”(此时使用块存储SSD),随机阅读的性能也将得到改善。
此外,RocketMQ主要读取并通过mappedbytebuffer读取文件。在它们中,Nio中的Filechannel模型直接将磁盘上的物理文件直接映射到基于用户的内存的内存地址(此MMAP方法减少了缓冲区和用户的用户,将传统IO应用于操作系统的操作系统内核地址空间在操作系统内核地址的空间执行空间的空间空间的空间),将文件的操作转换为内存地址的直接操作,从而极大地改善了读取并写入文件的效率(这正是因为内存映射机制SueckureRocketMQ的文件存储使用固定的长度结构来存储它,这很方便地将整个文件映射到内存)。
信息
(1)同步刷磁盘:如上图所示,消息确实耐用到磁盘后,RocketMQ的经纪人一侧真的会返回到成功的ACK对生产者的响应。同步刷子是一个很好的刷牙。保证MQ消息的可靠性,但它将对性能产生更大的影响。通常,它适用于金融业务应用程序。
(2)异步刷:可以充分利用OS PageCache的优势。只要将消息写入PageCache,您就可以将成功的ACK返回到生产者端。消息刷由背景异步线程提交执行,从而减少了读取和写作延迟,并改善了MQ的性能和吞吐量。
本文讲述了经纪人如何收到制作人来处理和存储它的消息。一般摘要如下:
好吧,我们暂时将在这里写信。消息成功编写后,我们将启动消息分布(新闻的消费索引)。接下来,我们将看到如何分配消费。
仅限于作者的个人层面,文章中有不可避免的事情,欢迎纠正!不要喷洒,谢谢
原始:https://juejin.cn/post/709823457865918501