gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:33:37 26 4
gpt4 key购买 nike

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

我的理解是,当创建连接时,Netty 创建了一个 SimpleChannelInboundHandler<String>对象来处理连接。创建连接后,处理程序 channelActive方法被调用,每次它从客户端收到一条新消息时,方法messageReceived被调用(或 Netty 4.0.24 中的 channelRead0 方法)。

  1. 我的理解正确吗?

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

  3. 如果我的 messageReceived 方法阻塞在某些东西上会发生什么需要很长时间才能完成?这会让 Netty 陷入困境吗?停止?

基本上我需要编写一个 TCP 套接字服务器,它可以尽快为大量持久连接提供服务。

  1. 关于 NioEventLoopGroup 的线程数是否有任何可用指南?以及如何在处理程序中使用任何线程?

如有任何帮助,我们将不胜感激。

最佳答案

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

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

不要忘记添加 -XmsYYYYM-XmxYYYYM 作为您的 VM 属性,因为如果没有它们,您可能会遇到 JVM 未使用所有内核的情况.

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

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

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

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

这会让 Netty 停下来吗?

  • 是的,确实如此。

关于java - 具有持久连接的 NioEventLoopGroup 的线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27074054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com