开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):RocketMQ 消息存储和发送性能保证】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12448
RocketMQ 消息存储和发送性能保证
内容介绍:
一、性能对比
二、总结
一、性能对比
通过该图可知当前消息发送到 MQ ,MQ 又将消息存储到文件系统当中,如何保证写的速度?其实磁盘的传输速度完全可以匹配网络上数据的传输速度,像是高性能自发的 ssd 顺序写的速度可以达到每秒600 MB ,远远超过网卡的速度。若想要提高文件写的速度,涉及到的关键点是顺序写,若使用的是随机写而不是顺序写其速度是100MB ,相差6000倍。所以 rocketMQ 在使用文件系统进行存储时是使用的顺序写才能保证消息存储的速度。在分析的过程当中,消息的存储时顺序写的过程才能保证当前写的速度。若要将消息发送到消息的消费方,要将消息查询出,查询的操作也是读的一种。那么对于读磁盘而言,如何去保证其性能?在 linux 系统当中分为用户态和内核态。若要将数据从 MQ 当中发送到消费方即客户端,在此过程中,实际进行了四次数据复制,具体意思:数据在磁盘当中,将数据读到内核态再将其复制到应用程序的独占内存即用户态,用户态向外发送通过网卡发送,首先将其读到网卡驱动的内存当中,然后再通过网卡进行发送,最后还是通过复制向外发送。(总过程如图)
经过四次复制,1.从磁盘复制到内核态一次2.内核态内存复制到用户态内存3.从用户态内存复制到网络驱动的内核态内存4.最后从网络驱动的内存复制到网卡中进行传输。若数据量很大,每次都需要经过这四部,查读的性能非常差,如何去提高效率呢?一般而言,我们拥有一个零拷贝的技术,在 java 中就有 API 来实现零拷贝技术,比如: MappedByteBuffer 就是零拷贝技术的一个 API ,零拷贝技术具体指将前面复制的四步操作转化为三步。数据读到内核态正常进行,内核态不需经过用户态直接读到网络驱动内存当中,再由网络驱动内存读到网卡,向外去发送。这种方式减少经过用户态的步骤,使用这种方式零拷贝的技术,读取数据向外发送使得其性能要比一般的复制性能高许多。要求是使用零拷贝技术对文件的大小存在一个限定,这个大小一般需满足1.5-2G 。正是因为这个条件的限制,所以 rocketMQ 存储的文件大小默认就是1G ,之前所说的1.5G 指大概的范围,总之不可超过2G 。为了使用零拷贝技术。
二、总结:
在消息存储是否保证使用的是顺序写,在消息的发送使用的是零拷贝技术。这就是 rocketMQ 在消息存储和发送的一个性能上的保证。