关于rocketmq:RocketMQ-刷盘机制

11次阅读

共计 770 个字符,预计需要花费 2 分钟才能阅读完成。

下面讲了音讯到内存的过程,为了音讯不失落,是须要长久化到磁盘上的,这里又分为同步刷屏和异步刷屏。

在内存里解决后,就开始开释锁,解决完的后果叫 result。所以到了刷屏的阶段,可能会有一个或者多个的 result 须要解决。

同步刷盘

同步刷盘的服务,也是一个线程,专门用来解决这些 result。他保护着 requestsWrite 和 requestsRead 的链表。requestsWrite 是放须要解决的 result,requestsRead 是放筹备解决的 result。

每个 result 须要同步刷盘服务解决的时候,都会放入 requestsWrite,因为 requestsWrite 并不是线程平安的,所以这里也须要加锁和开释锁的操作。

下面提过,这个服务也是一个线程,这个线程就是用来解决 requestsRead 的。

这个线程每解决完 requestsRead 就会期待最多 10ms 的工夫,直至被从新唤醒。

所以 requestsWrite 有数据的时候,就会唤醒这个线程,这个线程就会把 requestsWrite 和 requestsRead 里的数据进行替换。

因为写入 requestsWrite 是并发的,所以替换的时候,可能会有多个 result 到 requestsRead 里。

替换完后,就开始把 requestsRead 里的数据进行落盘,这个线程并不影响 requestsWrite 的写入。

异步刷盘

异步刷盘,简略的说,就是不等落盘就间接返回。

同样的,异步刷盘也有一个线程的服务,每隔一段时间就开始进行刷盘。然而这里也有一个小区别,就是是否开启堆外内存机制。

如果没有开启,那音讯是追加到与物理文件映射的内存中,而后写入到磁盘。

如果开启了,那会创立一个一个 commitlog 一样大小的堆外内存,所以音讯会追加到这个堆外内存中,而后是提交到与物理文件映射的内存中,最初写入到磁盘。

正文完
 0