这更像是一个设计问题。我有以下实现
多个客户端连接----->服务器------>相应的DB conns
使用Web套接字完成客户端/服务器通信。它目前是一个单线程应用程序。显然,这种设计不会扩展,因为服务器上的负载太高,并且响应客户端的响应时间太长。 后端操作涉及处理大量数据。
我的问题:为每个Web套接字连接创建一个新线程是个好主意吗?这意味着500个客户端有500个线程(无论是多线程还是单线程,Web套接字的数量都是相同的)。这样可以减轻服务器的负担,从而使生活更轻松。
或
是否有更好的逻辑来实现可扩展性?其中一个可以根据作业的优点创建线程,并由主线程处理其余部分。这种方式似乎在未来会再次出现同样的问题。
非常感谢任何帮助。
答案 0 :(得分:7)
这种问题有两种方法
实际上你正在使用第二种方法但只使用1个线程。
您可以使用线程池来处理您的请求,而不是仅使用一个。
第二种方法使用的线程数取决于您的应用程序。如果您强烈使用cpu和一定数量的长I / O操作(读取或写入磁盘或网络),则可以增加此数量。
如果没有I / O操作,则线程数应该更接近cpu核心数。
注意:现有的Web服务器使用这两种方法来处理http请求。就像一个例子 Apache 使用第一个(一个请求的一个线程)和 NodeJs 使用第二个(它是事件驱动的)。
在任何情况下,使用超时系统在服务器崩溃之前解锁非常长的请求。
答案 1 :(得分:1)
您可以查看两个非常好的可扩展Web服务器, Apache 和 Node.js 。
Apache ,在多线程(worker)模式下运行时,将为新连接创建新线程(请注意,来自同一浏览器的请求来自同一浏览器线程,通过 keep-alive )。
Node.js 非常不同,并通过委派任务来使用 asynschronous 工作流程。
因此,Apache可以很好地扩展计算密集型任务,而Node.js可以很好地扩展多个(巨大的)小型,基于事件的请求。
你提到你在后端做了一些繁重的任务。这意味着您应该创建多个线程。怎么样?创建一个具有MAX_THREADS
限制和MAX_THREADS_PER_CLIENT
限制的线程队列,使用相同的线程为客户端提供重复请求。您的主线程必须只生成新线程。
如果可以,您还可以合并一些优秀的Node.js功能。如果线程上的某个任务花费的时间太长,则在作业完成时使用回调来终止该线程以创建新线程。你可以做一个基准甚至训练NN来找出什么时候这样做!
爆炸!