Java NIO
ProtocolDecoder -> RpcProtocol -> RpcHandler -> RpcCommandHandler -> RpcRequestProcessor -> ProtocolEncoder
CombinedChannelDuplexHandler 类
netty – runTasks & 0x3F
所以,如果用户在代码中使用到了Runnable和ScheduledFutureTask,请合理设置ioRatio的比例,
通过NioEventLoop的setIoRatio(int ioRatio)方法可以设置该值,默认值为50,即I/O操作和用户自定义任务的执行时间比为1:1。
设计要点3:IdleStateHandler使用要当心。很多用户会使用IdleStateHandler做心跳发送和检测,这种用法值得提倡。
相比于自己启定时任务发送心跳,这种方式更高效。
但是在实际开发中需要注意的是,在心跳的业务逻辑处理中,无论是正常还是异常场景,处理时延要可控,防止时延不可控导致的NioEventLoop被意外阻塞。
例如,心跳超时或者发生I/O异常时,业务调用Email发送接口告警,由于Email服务端处理超时,导致邮件发送客户端被阻塞,级联引起IdleStateHandler的AllIdleTimeoutTask任务被阻塞,最终NioEventLoop多路复用器上其它的链路读写被阻塞。
对于ReadTimeoutHandler和WriteTimeoutHandler,约束同样存在。
心跳
ChannelDuplexHandler
TCP参数优化
java.net.SocketOptions
1 | public final static int TCP_NODELAY = 0x0001; |
接收缓冲区SO_RCVBUF
常用的TCP参数,例如TCP层面的接收和发送缓冲区大小设置,
在Netty中分别对应ChannelOption的SO_SNDBUF和SO_RCVBUF,需要根据推送消息的大小,合理设置,对于海量长连接,通常32K是个不错的选择。