7

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

多个客户端连接 -----> 服务器 ------> 对应的数据库连接

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

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

或者

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

在这里的任何帮助将不胜感激。

4

2 回答 2

8

这类问题有两种方法

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

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

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

第二种方法使用的线程数取决于您的应用程序。如果您对 cpu 的使用量很大并且有一定数量的长 I/O 操作(读取或写入磁盘或网络),您可以增加这个数量。

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

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

在任何情况下,使用超时系统在服务器崩溃之前解除阻塞很长的请求。

于 2015-07-08T13:58:00.670 回答
2

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

Apache多线程(worker)模式下运行时,将为新连接创建新线程(请注意,来自同一浏览器的请求通过keep-alive从同一线程提供服务)。

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

因此,Apache 非常适合计算密集型任务,而 Node.js 适合多个(巨大)基于事件的小型请求。

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

如果可以,您也可以合并一些优秀的 Node.js 功能。如果线程上的某些任务花费的时间太长,请使用回调杀死该线程,以便在任务完成后创建一个新任务。你可以做一个基准测试,甚至训练一个神经网络来找出什么时候做这个!

尽情狂欢!

于 2015-07-08T14:01:58.970 回答