Java服务器-多客户端处理-使用线程是否最佳?

Java服务器-多客户端处理-使用线程是否最佳?,java,multithreading,optimization,client-server,Java,Multithreading,Optimization,Client Server,我正在开发基于服务器-客户端通信的系统,并试图确定处理多个客户端的最佳方式。重要的是我不想使用任何第三方库 在互联网上的许多地方,我看到通过为每个连接创建一个单独的线程来解决这个问题,但我认为当我假设将有大量连接时,这不是最好的方法(也许我错了)。所以,我想到的解决方案是 创建事件队列并由工作线程处理-定义的线程池(其中有恒定数量的n个工作线程)。这个解决方案似乎很慢,但我无法想象在处理大量客户的情况下会有多大的区别 我也一直在考虑通过服务器(在不同的物理机器上)的多实例负载平衡,但它只是任何解

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

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

创建事件队列并由工作线程处理-定义的线程池(其中有恒定数量的n个工作线程)。这个解决方案似乎很慢,但我无法想象在处理大量客户的情况下会有多大的区别

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

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

其他信息:

  • 我假设有很多联系
  • 每次连接都将持续很长时间(几天,也许几周)
  • 程序将需要非常频繁地向指定的客户端发送一些数据
  • 每个客户端大约每3秒钟向服务器发送一次数据
  • 为了避免讨论(因为SO不是他们的场所):

  • 一个客户端-一个线程
  • 多客户端-线程和事件池的固定数量
  • 任何类似异步的解决方案,我都不知道
  • 还有别的吗

  • 我听说Java7在NIO包下有真正的异步IO。除了很难相处之外,我对它了解不多

    java中的基本IO是阻塞的。这意味着使用固定数量的线程来支持许多客户机在基本IO中是不可能的,因为在阻止从不发送数据的客户机读取调用时,可能会占用所有线程

    如果您改变对第三方库的看法,我建议您使用Grizzly/Netty查看异步IO


    如果您还没有改变主意,请自己研究NIO。

    我建议从每个连接一个线程的简单体系结构开始。大小足够大的系统上的现代JVM可以支持数千个线程。您可能会惊喜地发现,即使是这个简单的方案,效果也很好。但是,如果您需要300k连接,我怀疑每个连接一个线程是否可以工作。(但我以前就错了。)您可能不得不处理线程堆栈大小和操作系统资源限制

    排队系统将有助于将连接与处理工作的线程分离,但它将增加从每个客户端接收的每条消息所完成的工作量。这也会增加延迟(但我不确定这有多重要)。如果您有300k个连接,您可能希望有一个从连接读取的线程池,并且您还希望有一个以上的队列供工作流过。如果有30万个客户端每3秒发送一次数据,那就是10万次操作/秒,这是一个队列中需要处理的大量数据。这可能会成为一个瓶颈


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

    对于您所描述的,线程可能工作得最好。如果你担心优化和资源使用,那么考虑使用C++,它允许使用异步SoCKSC,也允许异步通信。@ TeaBay程序员没有想到使用C++,没有线索为什么,所以谢谢!无论如何,Java有许多我非常欣赏的内置特性,如果能保留这些特性就太好了them@WilliamMorrison不幸的是,我对C不太熟悉。而且,据我所知,它与我不使用的Windows有着密切的关系,所以我想会出现很多我不得不处理的奇怪情况。不过还是要谢谢你,这是另一件让我更接近C#的事!什么是大量的连接(每台主机)?10万?一百万?1000万?非常感谢,你帮我在脑海中整理了一下,所以现在是时候尝试一下,并通过实验找到最好的解决方案了。包含选项的选择器似乎是一个很好的折衷方案。