gpt4 book ai didi

Java 服务器 - 多个客户端处理 - 使用线程是最佳选择吗?

转载 作者:行者123 更新时间:2023-12-02 05:39:09 25 4
gpt4 key购买 nike

我正在开发基于服务器-客户端通信的系统,我正在尝试确定处理多个客户端的最佳方法。重要的是我真的不想使用任何第三方库

在互联网的许多地方,我看到这个问题是通过为每个连接创建一个单独的线程来解决的,但当我假设会有大量连接时,我认为这不是最好的方法(也许我错了) )。所以,我想到的解决方案是

创建事件队列并由工作人员处理它们 - 定义的线程池(其中有固定数量的工作人员 n)。这个解决方案似乎相当慢,但我无法想象在处理大量客户端的情况下会有多大的差异。

我也一直在考虑通过多实例化服务器(在不同的物理机器上)进行负载平衡,但它只是任何解决方案的一个很好的附加组件,而不是解决方案本身。

我知道Java并不是真正的异步友好,但也许我缺乏一些知识,并且有一个很好的解决方案。如果有任何建议,我将不胜感激。

其他信息:

  1. 我认为连接数量确实很大
  2. 每个连接都会持续很长时间(几天,也许几周)
  3. 程序需要频繁地向指定客户端发送一些数据
  4. 每个客户端大约每 3 秒向服务器发送一次数据

为了避免讨论(因为 SO 不适合他们):

  1. 一个客户端 - 一个线程
  2. 许多客户端 - 线程和事件池数量恒定
  3. 任何我不知道的类似异步的解决方案
  4. 还有什么吗?

最佳答案

我建议从每个连接一个线程的简单架构开始。足够大的系统上的现代 JVM 可以支持数千个线程。您可能会惊讶地发现这个简单的方案竟然如此有效。不过,如果您需要 300k 个连接,我怀疑每个连接一个线程是否可行。 (但我以前就错了。)您可能必须调整线程堆栈大小和操作系统资源限制。

排队系统将有助于将连接与处理工作的线程解耦,但它会增加从每个客户端收到的每条消息完成的工作量。这也会增加延迟(但我不确定这有多重要)。如果您有 300k 个连接,您可能希望有一个从连接中读取数据的线程池,并且您还希望有多个队列供工作流过。如果您有 300k 个客户端每 3 秒发送一次数据,则每秒执行 100k 操作,这是要通过单个队列推送的大量数据。这可能会变成瓶颈。

另一种可能值得研究的方法是拥有一个工作线程池,但不是每个工作线程从连接读取线程写入的队列中读取数据,而是让每个工作线程直接处理一堆套接字。使用 NIO 选择器让每个线程在多个套接字上等待。假设有 100 个线程,每个线程处理 3,000 个套接字。或者可能有 1,000 个线程,每个线程处理 300 个套接字。这取决于处理每条传入消息所需的数据量和工作量。你必须进行实验。这可能比使用异步 I/O 要简单得多。

关于Java 服务器 - 多个客户端处理 - 使用线程是最佳选择吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24661560/

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