深入探秘 Netty、Kafka 中的零拷贝技术!( 四 )

Components 用来保存的就是所有接收到的 Buffer,Indices 记录每个 buffer 的起始位置,lastAccessedComponentId 记录上一次访问的 ComponentId 。
CompositeChannelBuffer 并不会开辟新的内存并直接复制所有 ChannelBuffer 内容,而是直接保存了所有 ChannelBuffer 的引用,并在子 ChannelBuffer 里进行读写,实现了零拷贝 。
其他零拷贝RocketMQ 的消息采用顺序写到 commitlog 文件,然后利用 consume queue 文件作为索引 。
RocketMQ 采用零拷贝 mmap+write 的方式来回应 Consumer 的请求 。
同样 Kafka 中存在大量的网络数据持久化到磁盘和磁盘文件通过网络发送的过程,Kafka使用了 Sendfile 零拷贝方式 。
总结零拷贝如果简单用 Java 里面对象的概率来理解的话,其实就是使用的都是对象的引用,每个引用对象的地方对其改变就都能改变此对象,永远只存在一份对象 。




推荐阅读