2017-07-03 55 views
0

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

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

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

即使对于这种情况,是使用群集模块还是nginx?如何为几百个用户扩展此应用程序?

+1

如果一次只接受4个以上的请求,听起来好像您的应用程序正在运行某种强加的限制(如连接池没有连接并等待连接释放)。你的故事中有太多的移动部分来查明罪魁祸首,但是首先删除你的请求处理程序的一部分,以查看哪一个可能会导致该块(另外,链接到的博客文章并没有说明单个节点服务器一次只能处理2-9个请求)。 – robertklep

回答

1

一个Express服务器一次可以处理多于9个请求,特别是如果它不与数据库交谈。

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

在这类事情上确实没有硬数字;你建立它并看看它是如何执行的。如果性能不够好,请在它之前放置一个反向代理,如nginx或haproxy以进行负载平衡。

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

+0

是有道理的。但是,我们正在做的是为几乎每个请求创建一个zmq req套接字(除非它已被缓存)。并且基本上等待socket.on('message')内的这个套接字上的响应。当你说'关闭连接'并让工作人员完成后回电,就像火灾和遗忘模型一样,如何使用zmq套接字来实现? – svk

+0

这超出了原始问题的范围。 – Soviut

相关问题