面向面试编程:RocketMQ——消费者拉取消息策略

ConsumeQueue文件

ConsumeQueue会被大量的消费者发送的请求给高并发的读取,所以ConsumeQueue文件的读操作是非常频繁的,而且同时会极大的影响到消费者进行消息拉取的性能和消费吞吐量。

所以实际上broker对ConsumeQueue文件同样也是基于os cache来进行优化的。也就是说,对于Broker机器的磁盘上的大量的ConsumeQueue文件,在写入的时候也都是优先进入os cache中的。而且os自己有一个优化机制,就是读取一个磁盘文件的时候,他会自动把磁盘文件的一些数据缓存到os cache中。

所以实际上在消费者机器拉取消息的时候,第一步大量的频繁读取ConsumeQueue文件,几乎可以说就是跟读内存里的数据的性能是一样的,通过这个就可以保证数据消费的高性能以及高吞吐。

CommitLog是基于os cache+磁盘一起读取的

在进行消息拉取的时候,先读os cache里的少量ConsumeQueue的数据,这个性能是极高的,然后第二步就是要根据你读取到的offset去CommitLog里读取消息的完整数据了。

CommitLog是用来存放消息的完整数据的,内容量是很大的,毕竟他一个文件就要1GB,所以整体完全有可能多达几个TB。这么多的数据,不可能都放在os cache里。也就是说,os cache对于CommitLog而言,主要是提升文件写入性能,当你不停的写入的时候,很多最新写入的数据都会先停留在os cache里。之后os会自动把cache里的比较旧的一些数据刷入磁盘里,腾出来空间给更新写入的数据放在os cache里。

所以最终结论来了,当你拉取消息的时候,可以轻松从os cache里读取少量的ConsumeQueue文件里的offset,这个性能是极高的,但是当你去CommitLog文件里读取完整消息数据的时候,会有两种可能。

第一种可能,如果你读取的是那种刚刚写入CommitLog的数据,那么大概率他们还停留在os cache中,此时你可以顺利的直接从os cache里读取CommitLog中的数据,这个就是内存读取,性能是很高的。

第二种可能,你也许读取的是比较早之前写入CommitLog的数据,那些数据早就被刷入磁盘了,已经不在os cache里了,那么此时你就只能从磁盘上的文件里读取了,这个性能是比较差一些的。

面试官:什么时候会从os cache读?什么时候会从磁盘读?
复制代码

如果你的消费者机器一直快速的在拉取和消费处理,紧紧的跟上了生产者写入broker的消息速率,那么你每次拉取几乎都是在拉取最近人家刚写入CommitLog的数据,那几乎都在os cache里。

但是如果broker的负载很高,导致你拉取消息的速度很慢,或者是你自己的消费者机器拉取到一批消息之后处理的时候性能很低,处理的速度很慢,这都会导致你跟不上生产者写入的速率。相当于你每次都在从磁盘里读取数据了。

从Slave Broker拉取数据

面试官:Master Broker什么时候会让你从Slave Broker拉取数据?
复制代码

broker自己是知道机器上当前的整体物理内存有多大的,而且他也知道自己可用的最大空间占里面的比例,他是知道自己的消息最多可以在内存里放多少的。

比如他心知肚明,他最多也就在内存里放5万条消息而已!因为他知道,他最多只能利用10GB的os cache去放消息,这么多内存最多也就放5万左右的消息。然后这个时候你过来拉取消息,他发现你还有8万条消息没有拉取,这个8万条消息他发现是大于10GB内存最多存放的5万条消息的,那么此时就说明,肯定有3万条消息目前是在磁盘上的,不在os cache内存里。

所以他经过判断,会发现此时你很大概率会从磁盘里加载3万条消息出来。他会认为,出现这种情况,很可能是因为自己作为master broker负载太高了,导致没法及时的把消息给你,所以你落后的进度比较多。这个时候,他就会告诉你,我这次给你从磁盘里读取3万条消息,但是下次你还是从slave broker去拉取吧。

本质是对比你当前没有拉取消息的数量和大小,以及最多可以存放在os cache内存里的消息的大小,如果你没拉取的消息超过了最大能使用的内存的量,那么说明你后续会频繁从磁盘加载数据,此时就让你从slave broker去加载数据了。

作者:我一定有办法

原文链接:https://juejin.cn/post/7157544048650108935

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值