前言
最近以ByteBuf作为入口,开始了Netty的学习,在这里对个人的想法、看法做一个总结。
一、功能与作用
ByteBuf是Netty中中基于byte[]的缓存管理对象。从数据存储位置来说有堆内(Heap)和堆外(Direct)。从对象重用的角度,有池化(Pooled)和非池化(Unpooled)两种。因此具体的实现是存储位置和对象重用方式的组合,每种类型对象的选择在后续文章中进行分析。
二、与ByteBuffer的区别
JDK中提供了类似的ByteBuffer,为何Netty要重定义呢?
首先,ByteBuffer的读写限制较多。作为一个缓存,读取必然依赖写入,这点可以理解。但是ByteBuffer在读的时候需要调用函数完成模式的切换。此外,ByteBuffer一旦创建,容量是固定的,使用者必须小心维护。
其次,由于上述限制,作为一个菜鸟的我很容易搞出事情来,程序这会儿跑的很溜,过一会儿就给整个throw Exception。
因此,在实现上的区别就是非常的精简和迷你,在使用上就是起到督促菜鸟进步的重大作用。
三、设计启示
ByteBuffer是Oracle首席架构师Mark Reinhold实现的。大神一般只做必须的事情,所以实现的ByteBuffer可以说是一个非常精简的内核。从某种程度上说,大神想不出来凡间的RD会这么痛苦(当然也正是普通RD不愿去做更深入的了解造就了本身的平凡)。
而从另外一个角度来说,设计出来就是给大家用的,有人说应该老少皆宜,有人说既然从事开发,那就应该有追求和梦想。听起来两者都没有错,但是具体到公司里面,RD是有层次和级别划分的,不同的层次作用不同,要求不同。一般来说,底层组件高P完成,低P的更多消化业务需求,完成业务向代码的转换。如果低P有恶性竞争,结果就是把本该优雅地有技术改变世界变成了被PM排期无情地改造自己。所以组件难用的时候,我们得从组件和自身两个角度来考量这件事。
总结
本文总结了自己对ByteBuf设计实现上的一些感想,希望对你有所帮助。如果你能给我带来更多输入,欢迎交流。