具有持久连接的NioEventLoopGroup的线程数

Mar*_*arc 3 java sockets nio tcp netty

我想使用Java Netty为来自客户端的大量持久连接创建TCP服务器.换句话说,成像那里有1000个客户端设备,并且所有客户端设备都创建并维护与TCP服务器的持久连接.将存在合理数量的流量(主要是文本行),这些流量在每个持久连接中来回传递.如何确定NioEventLoopGroup的boss和worker组中使用的最佳线程数?

我的理解是,在创建连接时,Netty会创建一个SimpleChannelInboundHandler对象来处理连接.创建连接后,调用处理程序channelActive方法,每次从客户端获取新消息时,都会调用messageReceived方法(或Netty 4.0.24中的channelRead0方法).我的理解是否正确?如果我有长时间运行的代码在messageReceived中运行会发生什么 - 我是否需要在另一个线程(java.util.Thread)中启动此代码?如果我的messageReceived方法阻塞某些内容或需要很长时间才能完成,会发生什么?这会让Netty停滞不前吗?

基本上我需要编写一个TCP套接字服务器,它可以尽快为大量持久连接提供服务.是否有关于NioEventLoopGroup的线程数以及如何使用处理程序内的任何线程的指导?

任何帮助将不胜感激.

Mak*_*sym 5

如何确定NioEventLoopGroup的boss和worker组中使用的最佳线程数?

  • 关于Boss Thread,如果你说你需要持久连接,就没有意义使用很多boss线程,因为boss线程只负责接受新的连接.所以我只使用一个boss线程.
  • 工作线程的数量应取决于您的处理器核心.

不要忘记添加-XmsYYYYM-XmxYYYYM作为您的VM属性,因为如果没有它们,您可以在JVM未使用所有核心时遇到问题.

如果我有长时间运行的代码在messageReceived中运行会发生什么 - 我是否需要在另一个线程(java.util.Thread)中启动此代码?

  • 你真的需要这样做吗?可能你应该考虑用另一种方式做你的逻辑,如果没有那么你可能应该为每个连接考虑使用新线程的OIO.

如果我的messageReceived方法阻塞某些内容或需要很长时间才能完成,会发生什么?

  • 您应该避免在处理程序中使用线程阻止操作.

这会让Netty停滞不前吗?

  • 是的,确实如此.