一直想请教一个问题,你曾经说过netty的buffer设计得其实不好。
我对这个的理解是jvm的实现无法针对高并发网络通信场景进行专门优化,所以netty设计了这个。但是想不出除了用起来确实反人类,还要人工给它做引用计数外,有什么别的缺陷吗?
另外补充一点,为什么我现在仍然首选netty,因为在我有空自己做一个网络框架之前,netty最符合我的需求的,各种网络通信协议都已经做了比较好的支持了。
一直想请教一个问题,你曾经说过netty的buffer设计得其实不好。
我对这个的理解是jvm的实现无法针对高并发网络通信场景进行专门优化,所以netty设计了这个。但是想不出除了用起来确实反人类,还要人工给它做引用计数外,有什么别的缺陷吗?
另外补充一点,为什么我现在仍然首选netty,因为在我有空自己做一个网络框架之前,netty最符合我的需求的,各种网络通信协议都已经做了比较好的支持了。
我说一下
引用来自“talent-tan”的评论
1、它的零拷贝只是阶段性拷贝,譬如我们在收发数据时最原始的对象其实是jdk的bytebuffer,netty做了个包装器,这个包装器是零拷贝的----其实就是加了一层指针。 2、jdk原生的bytebuffer足够好了,想不出为什么还要弄一套新的bytebuffer,最多写几个util方法即可 3、netty的源代码我没看,但是看过一些比较热的网文,而且我们也能根据jdk原始api推猜一些东西出来 4、你能驾驭netty,并且喜欢它的api,选择它没毛病啊,不需要听从别人的意见 5、我创造t-io是因为我某些智商不够用,掌握不好netty的apinetty的buffer有很多种。你说的加一层指针实现零拷贝的,这是协议解析中很常用的数据结构。
比如http头,第一层readline后,用这个结构包一下再给解析http头具体属性的代码,对于实现http头具体内容解析的代码来说,传来的就是一行数据。而实际只是在原来数据上加了层指针,而不是拷贝。
还有里面的联合buffer把多个buffer合并成看起来像一个连续的buffer的功能。目的也是在维持代码抽象性的前提下,减少没有必要的拷贝,提高性能。这些都是数据结构而已,很好理解也不是问题所在。
这次主要咨询的是它提供的非jvm托管的堆外buffer以及堆外基础上设计的bufferpool。也就是我提到的还要开发者自己管理引用,不会被垃圾回收的那些东西。个人感觉是jvm不够好而无奈做的设计。原本以为你已经看透了它其实走了弯路。看来实际可能说的不是这个。
@乌龟壳 @talent-tan 坑爹就找osc他爹 @红薯
大清早看到你们两pk bytebuffer,确实也是我的疑惑,持续关注!
另外,兄弟也可以看一下这个国产框架,我没研究过,但看起来还不错,另外这个作者说了他为什么要创造他这个框架
http://git.oschina.net/helyho/Voovan#project_comm_title
另外t-io,就不要通过诋毁netty来抬高自己了,netty有太多细节,是通过对apache mina的不足进行改进的。不考虑极限情况和实现细节,一定会出问题,这也是我从mina转到netty并且只使用netty的原因。
引用来自“zhuzhua”的评论
原生的bytebuffer屎一样,你多用用就知道了。缺少好几个必要的属性,需要自己去计算。
netty在其上封装了一层,提供了这几个需要自己计算的属性,用起来不再那么的绕。。。
而且只有使用bytebuffer,或者netty的bytebuf,才能够实现缓冲区服用,不然性能烂的
像屎一样,做通信的都懂。
首先你就没看过netty的源码,你以为netty不过是在原生上封装一层而已? 好好读读源码才好意思说话,不然很容易误导人
只是几个utils,我真的快笑死,好好学,好好看