netty的线程模型 设置最佳实践
(1)创建两个NioEventLoopGroup,隔离NIO Acceptor和NIO的IO线程。
(2)尽量不要在ChannelHandler中启动用户线程(解码之后,将POJO消息派发到后端的业务线程池除外)。
(3)解码要放在NIO线程调用的Handler中,不要放在用户线程中解码。
(4)如果IO操作非常简单,不涉及复杂的业务逻辑计算,没有可能导致阻塞的磁盘操作、数据库操作、网络操作等,可以再NIO线程调用的Handler中完成业务逻辑,不要切换到用户线程。
(5)如果IO业务操作比较复杂,就不要在NIO线程上完成,因为阻塞可能会导致NIO线程假死,严重降低性能。这时候可以把POJO封装成Task,派发到业务线程池中由业务线程处理,以保证NIO,线程被尽快的释放,处理其余的IO操作。
(6)可能导致阻塞的操作,数据库操作,第三方服务调用,中间件服务调用,同步获取锁,Sleep等
(7)Sharable注解的ChannelHandler要慎用
(8)避免将ChannelHandler加入到不同的ChannelPipeline中,会出现并发问题.
https://juejin.im/post/5bea1d2e51882523d3163657
https://www.infoq.cn/article/netty-concurrent-programming-analysis/
https://www.jianshu.com/p/32fc02299232
http://www.linkedkeeper.com/137.html
https://blog.csdn.net/u010853261/article/details/5580521
网友评论