使用 websockets 的多线程

Multithreading with websockets

这更像是一个设计问题。我有以下实现

多个Client连接-----> Server ------>对应DB conns

client/server 通信是使用网络套接字完成的。目前是单线程应用程序。显然,这种设计无法扩展,因为服务器上的负载太高,并且响应客户端的时间太长。 后端操作涉及处理大量数据。

我的问题:为每个网络套接字连接创建一个新线程是个好主意吗?这意味着 500 个客户端有 500 个线程(无论是多线程还是单线程,网络套接字的数量都是相同的)。这将减轻服务器上的负载,从而使生活变得更加轻松。

是否有更好的逻辑来实现可扩展性?其中之一可能是根据作业的优点创建线程,并让主线程处理其余的。这不知何故似乎在未来又回到了同样的问题。

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

这种问题有两种解决方法

  • 每个请求一个线程
  • 固定数量的线程来管理所有请求

实际上您使用的是第二种方法,但只使用了一个线程。

您可以改进它,使用一个线程池来处理您的请求,而不仅仅是一个。

第二种方法使用的线程数取决于您的应用程序。如果您经常使用 cpu 和一定数量的长 I/O 操作(读取或写入磁盘或网络),您可以增加此数量。

如果您没有 I/O 操作,线程数应该接近 cpu 核心数。

注意: 现有的 Web 服务器使用这两种方法进行 http 请求。举个例子,Apache 使用第一个(一个请求一个线程),NodeJs 使用第二个(它是事件驱动的)。

在任何情况下,使用超时系统在服务器崩溃之前解锁非​​常长的请求。

您可以看看两个非常好的可扩展 Web 服务器,ApacheNode.js.

Apache,在多线程(worker)模式下运行时,将为新连接创建新线程(注意请求来自通过 keep-alive).

从同一个线程为同一个浏览器提供服务

Node.js 有很大不同,它通过委派任务使用 异步 工作流。

因此,Apache 可以很好地扩展计算密集型任务,而 Node.js 可以很好地扩展多个(巨大的)基于事件的小请求。

您提到您在后端执行一些繁重的任务。这意味着您应该创建多个线程。如何?创建一个线程队列,具有 MAX_THREADS 限制和 MAX_THREADS_PER_CLIENT 限制,使用同一线程为客户端的重复请求提供服务。您的主线程只能生成新线程。

如果可以,您也可以合并一些不错的 Node.js 功能。如果线程上的某个任务花费的时间太长,则使用任务回调终止该线程以在作业完成时创建一个新任务。您可以做一个基准测试甚至训练神经网络来找出何时执行此操作!

玩得开心!