问题:目前需要netty进行长连接交互,netty确实稳定性比较强,而且看介绍netty
是一个高性能、异步事件驱动的NIO框架,但遇到问题,长连接数量非常少,但之间传输需要大量的读写,发现写并发数量过大时,接收消息出现了延迟。
源码:
ManagerServer.java
ConnectionServerInitializer.java
参考netty源码中线程的设计发现,netty的异步性体现在其IO上,对于海量的长连接可以通过
1)
ManagerServer.java 中设置
EventLoopGroup workerGroup = new NioEventLoopGroup(100);--->100个处理channel的线程,默认为内核数量*2
2)ConnectionServerInitializer.java中设置
但发现结果如下:
其实一个长连接handeler的处理线程还是一个。
参看源码的线程处理发现,其实netty的高性能异步只是处理IO问题,handler业务处理还是串行执行的,若业务中有执行时间不确定的操作(如数据库操作),就会发生延时的问题(数据在排队,执行时间长,但不会丢失)。
参考netty对多线程的处理方式,现在才发现jdk5之后的线程神器Excutor.
ServerHandler.java改造前:
ServerHandler.java改造后(新增ServerHandlerExcutor.java):
因为内存允许,开了2000个线程也还刚刚的,到现在测试性能提升了1000倍以上,1s并发100加业务处理在100ms左右(业务也做了优化),至少如果不会出现某个业务操作慢而导致netty接收阻塞的问题,有种从便秘一泻千里的畅快感。。。