【问题标题】:Simple message passing Nodejs server accepting only 4 requests at a time简单的消息传递 Nodejs 服务器一次只接受 4 个请求
【发布时间】:2017-07-03 07:23:23
【问题描述】:

我们在 windows server 2012 上部署了一个简单的 express 节点服务器,它只接收 3 个参数的 GET 请求。它对这些参数进行了一些次要处理,有一个非常简单的内存节点缓存,用于缓存其中一些参数组合,与外部许可证服务器接口以获取请求用户的许可证并将其设置在 cookie 中,然后是,它通过负载均衡器(与 zmq 一起运行)与一些工作人员交互,以下载一些大文件(以块的形式,解压缩并提取它们,将它们写入某些目录)并将它们显示给用户。在部署这些文件时,还会启动对工作人员的一些其他调用。

节点服务器不与任何数据库或磁盘通信。它只是等待其他机器上运行的负载均衡器的响应(这些操作很长,通常需要 2-3 分钟才能发送响应)。因此,本质上,计算和数据库交互发生在其他机器上。节点服务器只是一个简单的消息传递/握手服务器,它在事件处理程序中等待响应,发起其他请求并呈现响应。

我们目前没有使用“集群”模块或 nginx。使用裸机节点服务器,是否可以同时接受和处理至少 16 个请求?像http://adrianmejia.com/blog/2016/03/23/how-to-scale-a-nodejs-app-based-on-number-of-users/ 这样的页面提到一个简单的节点服务器一次只能处理 2-9 个请求。但即使使用我们的基本实现,一次接受的请求也不超过 4 个。

即使在这种情况下也需要使用集群模块或 nginx 吗?如何为几百个用户扩展这个应用程序?

【问题讨论】:

  • 如果一次接受的请求不超过 4 个,听起来您的应用程序遇到了某种强加的限制(例如连接池已用完连接并等待连接释放向上)。您的故事中有太多活动部分无法确定罪魁祸首,但首先要删除请求处理程序的部分内容,以查看可能导致阻塞的部分(此外,您链接到的博客文章实际上并未说明单个节点服务器一次只能处理 2-9 个请求)。

标签: node.js express nginx scalability


【解决方案1】:

Express 服务器一次可以处理超过 9 个请求,尤其是在它不与数据库通信的情况下。

您所指的文章假定每个请求都有一些数据库访问权限,并通过节点本身而不是 CDN 提供静态资产。所有这些都发生在具有 1GB RAM 的单个 CPU 上。这是一个数据库和 Web 服务器,它们都运行在一个具有最小 RAM 的单核上。

这类事情确实没有硬性数字;您构建它并查看它的性能。如果性能不够好,可以在前面放一个反向代理,比如nginx或者haproxy做负载均衡。

但是,根据您的问题,如果您确实遇到了一次只能有 4 个连接的瓶颈,那么听起来您将这些连接保持打开的时间过长并阻塞了其他连接。最好让那些长时间运行的进程由节点启动,关闭连接,然后让这些服务器在完成后以某种方式回调。

【讨论】:

  • 有道理。但是,我们正在做的是为几乎每个请求创建一个 zmq req 套接字(除非它已经被缓存)。并在 socket.on('message') 中等待此套接字上的响应。当您说“关闭连接”并让工作人员在完成后回电时,就像火灾后忘记模型一样,如何使用 zmq 套接字实现这一点?
  • 这超出了原问题的范围。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 2014-11-03
  • 2016-02-02
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多