client - Netty 能否作为客户端有效地处理大量传出连接?

标签 client nio netty

我正在创建一个客户端-服务器关系,其中单个客户端将使用持久 TCP 连接连接到任意数量的服务器。服务器的实际数量尚未确定,但设计目标是争取 1000 台。

我找到了一个使用直接 Java NIO 的示例,它几乎完全符合我对它如何工作的心智模型:

http://drdobbs.com/jvm/184406242

一般来说,它会打开所有 channel 并将它们添加到一个监控 java.nio.channels.Selector 的线程中。尤其是选择器的使用使得它的扩展性比使用标准的每 channel 线程更好。

我宁愿使用(稍微)更高级别的套接字框架,如 Netty,也不愿直接使用 Java NIO。不幸的是,我无法确定 Netty 将如何处理这样的情况。也就是说,我发现的示例和讨论都倾向于以服务器端为中心,接受大量并发连接。

但是从客户端做这件事呢?如果我创建大量 channel 并等待它们的事件,Netty 将如何在后端处理这个问题?

最佳答案

这不是您问题的直接答案,但我希望它对您有所帮助。下面,我描述了一种方法,供您确定您正在寻找的答案。这是我最近为即将开展的项目所做的事情。

与 OIO(旧 IO)相比,Netty 框架和 NIO 的异步特性确实会为您的应用程序提供更好的内存和 CPU 使用特性。在 Netty 中处理缓冲区的方式也将是有益的,因为它将帮助您避免复制字节缓冲区。重点是所有线程池和 NIO 细节都将为您处理,让您专注于您的业务逻辑。您提到了 NIO Selector,您将从中受益; Netty 的好处是您可以从中获益,而不必自己担心该实现,因为它已经为您完成了。

我对客户端的理解是,它与服务器端非常相似,应该为您提供相应的性能提升(只要您的业务逻辑不引入任何性能问题)。

我的建议是拼凑出一个或多或少能满足您要求的原型(prototype)。省去任何耗时的细节,只需添加您需要的基本 Netty 处理程序即可。

然后我会使用 jmeter调用您的客户端以将负载应用于服务器和客户端。使用类似 jconsole 的东西或 jvisualvm将向您展示客户端和服务器在负载下的性能特征。你也可以试试 jprobe .您可以在 jmeter 中添加一个监听器来指示吞吐量。我建议在服务器模式下使用 jmeter,在另一台机器上使用客户端,在另一台机器上使用服务器。这是一些前期工作,但如果您决定继续,您将准备好这些工具,以便在您继续进行进一步测试时使用。

我怀疑不引入任何无关的性能不佳的组件的体面的 Netty 实现将为您提供您正在寻找的性能特征,但是,唯一可以确定的方法是在预期负载下测量系统。

您需要定义预期的负载情况以及在此类负载下所需的性能特征。鉴于这些输入,您可以测量您的系统以了解它是否满足您的期望。我个人认为没有人可以告诉您它是否会以预期的方式运行。你必须测量它。这是了解系统是否满足您需求的唯一可靠方式。

I would rather use a (slightly) higher level socket framework like Netty, than direct Java NIO.

这是正确的做法。您可以尝试实现自己的 NIO 服务器和客户端,但既然您已经可以轻松获得高度完善的框架,为什么还要这样做呢?

关于client - Netty 能否作为客户端有效地处理大量传出连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10001974/

相关文章:

java - 使用 Bytebuffers 和 NIO 时如何避免 OutOfMemoryError?

java - 提高JAVA中Netty服务器的性能

java - Redisson NoSuchFieldError : WRITE_BIGDECIMAL_AS_PLAIN 错误

java - 如何使用 netty 5.0 创建大量连接

Java - 如何检索局域网上已知端口的服务器IP

java - FileChannel.transferTo 用于 Windows 中的大文件

java - Netty 3.2.6 到 Netty 4.0x 迁移

java - java - 如何在没有JVM参数的Java 9中隐藏警告 "Illegal reflective access"?

c# - 不同解决方案中的共享项目使 Visual Studio 编译器失败 (C#)

python - 检查由 Twisted 的 FTPClient.retrieveFile 方法检索的文件的完整性