.RocketMq的存储机制

1)顺序写

我们知道,操作系统每次从磁盘读写数据的时候,都需要找到数据在磁盘上的地址,再进行读写。而如果是机械硬盘,寻址需要的时间往往会比较长而一般来说,如果把数据存储在内存上面,少了寻址的过程,性能会好很多;

但Kafka 的数据存储在磁盘上面,依然性能很好,这是为什么呢?

这是因为,Kafka采用的是顺序写,直接追加数据到末尾。实际上,磁盘顺序写的性能极高,在磁盘个数一定,转数一定的情况下,基本和内存速度一致

因此,磁盘的顺序写这一机制,极大地保证了Kafka本身的性能

2)零拷贝

比如:读取文件,再用socket发送出去这一过程

buffer = File.read

Socket.send(buffer)

传统方式实现:

先读取、再发送,实际会经过以下四次复制

1、将磁盘文件,读取到操作系统内核缓冲区Read Buffer

2、将内核缓冲区的数据,复制到应用程序缓冲区Application Buffer

3、将应用程序缓冲区Application Buffer中的数据,复制到socket网络发送缓冲区

4、将Socket buffer的数据,复制到网卡,由网卡进行网络传输

————————————————

版权声明:本文为CSDN博主「Rooibos gron」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:RocketMq常见面试题_rocketmq面试题_Rooibos gron的博客-CSDN博客

统方式,读取磁盘文件并进行网络发送,经过的四次数据copy是非常繁琐的

重新思考传统IO方式,会注意到在读取磁盘文件后,不需要做其他处理,直接用网络发送出去的这种场景下,第二次和第三次数据的复制过程,不仅没有任何帮助,反而带来了巨大的开销。那么这里使用了零拷贝,也就是说,直接由内核缓冲区Read Buffer将数据复制到网卡,省去第二步和第三步的复制。

那么采用零拷贝的方式发送消息,必定会大大减少读取的开销,使得RocketMq读取消息的性能有一个质的提升

此外,还需要再提一点,零拷贝技术采用了MappedByteBuffer内存映射技术,采用这种技术有一些限制,其中有一条就是传输的文件不能超过2G,这也就是为什么RocketMq的存储消息的文件CommitLog的大小规定为1G的原因

小结:RocketMq采用文件系统存储消息,并采用顺序写写入消息,使用零拷贝发送消息,极大得保证了RocketMq的性能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值