得益于高性能、低时延的优势,Netty被广泛应用于物联网领域,用于海量终端设备的协议接入、消息收发和数据处理。
当服务端出现性能瓶颈或者阻塞时,就会导致终端设备连接超时和掉线,引发各种问题,因此在物联网场景下,一定要防止服务端代码因为编码不当导致的意外阻塞,进而无法处理终端请求消息。
服务端接收不到客户端发送消息案例
堆栈分析以及解决方案
NioEventLoop线程防死锁策略
总结
服务端接收不到客户端发送消息案例
服务端使用Netty构建,接受客户端请求消息,然后下发给后端其他系统,最后返回应答给客户端。系统运行一段时间后发现服务端收不到客户端发送的信息,导致业务终端。
服务端运行一段时间后相关日志:
服务端每隔一段时间会接收不到消息,隔一段时间后恢复,然后又没消息,周而复始。根据实际情况排查了客户端没法消息的情况以及CPU资源导致的周期性阻塞还有内存导致频繁GC引起业务线程暂停。
堆栈分析以及解决方案
排除上述原因,有可能是Netty的NioEventLoop线程阻塞,导致TCP缓冲区的数据没有及时读取,故障期间采用服务端的线程堆栈进行分析,结果如图:
如图,Netty的NioEventLoop读到消息后,调用业务线程池执行业务逻辑时,RejectedExecution出现异常,由于后续的业务逻辑由NioEventLoop线程执行,可以判定业务拒绝策略