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