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

时间:2014-11-22 04:30:32

标签: java sockets tcp netty nio

我想使用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的线程数以及如何在处理程序中使用任何线程的指导?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

这会让Netty停滞不前吗?

  • 是的,确实如此。