因为netty的eventLoop的异步执行任务,所以我们的任何写请求都将转化为一个任务到eventLoop的读写线程里面执行,这个线程只有一个,所以弥足珍贵,我们必须好好利用。
有时候,看很多框架源码,发现他们都不是在netty的handler里面去写数据,我估计是因为网络异步特性,加上netty的异步特性,导致我们控制力度变得很弱,所以不得不在外面来控制这种异步特性。
需要控制的地方有:
1.写数据的异步性,我们如果在handler里面写数据,如果不借助Future阻塞等待,那么我们必将不可能知道什么数据真正写出去,而且,因为有操作系统层面的隔离,我们甚至不知道什么时候数据会从网卡发出去。。。。我们不能控制网卡,但起码我们要控制我们在应用层面的写数据的有效性,我们要确定数据确实发出去了,而不是调用了简单的write方法就不管了。
所以,我们在外部来检测是否已经写数据完成,注意,这里不能在handler里面写数据,因为即使是在这里写数据,最终也会有可能构建一个写任务来执行,所以,不能在handler里面执行Future的sync和await !!!
那么,心跳检测,登录认证校验等,都必须在handler以外去做,这样才真正的复合网络异步编程的基本要求。
2.同时读写数据的不确定性。
如果存在读和写都存在,同时存在,那么先执行读,还是先执行写?