RocketMQ存储中如何实现同步刷盘和异步刷盘


这篇文章将为大家详细讲解有关RocketMQ存储中如何实现同步刷盘和异步刷盘,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、问题思考1.同步刷盘是怎么工作的?
2.异步刷盘是怎么工作的?
3.上篇文章的疑问,写入堆外内存的消息如何落盘的?二、Broker启动刷盘有关调用链
1.调用链小结:由调用链可以看出,初始化并启动了以下线程类1.同步刷盘 GroupCommitService2.异步刷盘 FlushRealTimeService3.如果开启堆外内存并且为异步刷盘 CommitRealTimeService
2.线程类关系图
三、线程类工作流程
既然线程类在Broker启动时就启动了,他们在做啥呢?1.堆外内存线程类CommitRealTimeService工作流程

小结:
1.CommitRealTimeService主要工作是将写入堆外内存(writeBuffer)的消息,写入到fileChannel中,fileChannel为commitLog文件通道2.committedPosition用于记录将writeBuffer数据写入到fileChannel中的内存位点(相对偏移量offset)
3.committedWhere用于记录写入fileChannel中的物理偏移量(文件名称+相对偏移量offset)2.同步刷盘线程类GroupCommitService工作流程注1:
1.执行onWaitEnd时交换读写容器,该线程类提供两个容器来装GroupCommitRequest2.requestsWrite和requestsRead,每次执行提交(刷盘)前都会进行容器交换3.好处:读写请求容器分离,避免潜在的锁竞争注2:1.flushedPosition 标记已经刷盘内存的位点。即刷盘相对偏移量,刷盘到什么位置了,下次从此处刷盘即可2.flushedWhere 标记已经刷盘的物理偏移量,根据此位置可精确查找到文件中消息的存储位置。flushedWhere = 当前刷盘文件名称(该日志文件的起始物理偏移量) + flushedPosition注3:流程图中标记红色部分,将刷盘结果通知给等待线程小结:同步刷盘线程类GroupCommitService主要工作
将请求从读容器中取出并通过mappedByteBuff 香港云主机er.force()将数据落盘。3.异步刷盘线程类FlushRealTimeService工作流程小结:FlushRealTimeService主要工作
1.不开启堆外外内存刷盘方式为mappedByteBuffer.force()
2.开启堆外内存刷盘方式为fileChannel.force
疑问:同步刷盘线程类GroupCommitService每执行一次都会交换读写容器,那刷盘请求什么时候放到写容器(requestsWrite)呢?

四、消息追加与线程类的交互分析完线程类后,把镜头切换到消息追加,看看消息进来后是如何跟线程类交互的?
1.调用链2.同步刷盘主要代码同步刷盘时构造刷盘请求,将请求提交给线程类GroupCommitService,service.putRequest(request),并获取刷盘结果。3.异步刷盘主要代码未开启堆外内存唤醒FlushRealTimeServicee,开启堆外内存唤醒CommitRealTimeService。五、刷盘方式示意图
1.同步刷盘示意图
2.异步刷盘未开启堆外缓存示意图
3.异步刷盘开启堆外缓存示意图关于“RocketMQ存储中如何实现同步刷盘和异步刷盘”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

相关推荐: windows打开网页时提示此网站的安全证书有问题怎么办

这篇文章给大家分享的是有关windows打开网页时提示此网站的安全证书有问题怎么办的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。如果你确认此网站是安全的话,可以用下面的三个方法进行解决。方法一、如果你有电子证书的话,就点击网页上的“…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/17 18:11
下一篇 08/17 18:11

相关推荐