2014-11-22 72 views
2

我想使用Java Netty为来自客户端的大量持久连接创建一个TCP服务器。换句话说,映像中有1000个客户端设备,并且它们都创建并维护与TCP服务器的持久连接。将会有合理的流量(大部分是文本行)在这些永久连接之间来回传递。如何确定NioEventLoopGroup的boss和worker组中使用的最佳线程数?具有持久连接的NioEventLoopGroup的线程数

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

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

任何帮助将不胜感激。

回答

5

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

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

不要忘记添加-XmsYYYYM-XmxYYYYM为你的虚拟机属性,因为没有他们,你可以当你的JVM没有使用的所有核心所面临的情况。

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

  • 你真的需要这样做吗?也许你应该想到以另一种方式来做你的逻辑,如果不是的话,那么你应该考虑每个连接的新线程。

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

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

这是否会让Netty陷入瘫痪?

  • 是的,它的确如此。
+0

太棒了,谢谢! – Marc 2014-11-24 18:43:09