Express/Socket.io /节点在一个进程中的多个应用程序

Ari*_*ric 2 scaling node.js express socket.io

更多的是"最佳实践"问题,而不是技术问题,但是我正在尝试找出组织节点/表达应用程序的最佳方式,以便进行最优化的扩展.目前,我们有一个快递js应用程序,它包含一个站点的多个"部分".这包括聊天,我们的BoxNet api和其他一些领域.

将这些区域分成他们自己的快速应用程序以单独扩展每个区域,或者将它们全部保存在一个单独的快速应用程序中会更好吗?在应用程序的不同部分之间进行交谈是不存在的,因为它不是必需的.对我而言,分离这些应用程序的最佳理由是轻松扩展其中一个不同的区域,而不必缩放未被击中的部分.我看到的负面影响将是一个潜在的管理噩梦或每个应用程序*规模的数据库的多个连接.思考?

谢谢,

ARIC

小智 6

将它们分开可能有两个原因:

  1. 如果您的服务器上有多个处理器,则每个Node.js应用程序可以在一个单独的核心上运行其事件循环并实际并行运行,而不是如此显示,使您立即将服务器性能提高一倍/三倍(假设不是I/O)界).
  2. 因为所有逻辑服务都在单个事件循环中,所以您增加了系统的脆弱性.如果一个服务锁定事件循环,则所有服务都被锁定.即使您从未在各种服务中遇到错误,您仍然会遇到"高性能"服务被置于同一事件循环中而受到惩罚的问题.

例如,假设您有三个服务:一个是在Node.js事件循环中花费约50ms的简单服务,并且不访问数据库,文件等等; 这一切都在记忆中.第二个服务在Node.js事件循环中花费约100ms,在DB/File I/O上等待约400ms.第三个服务在Node.js事件循环中花费约400ms,在DB上花费约100ms.因为事件循环本质上是一个队列,每次等待非阻塞I/O时,逻辑请求被抛回到堆栈的末尾,对于每个第二个服务,您的第三个服务可能会被减慢额外的约300毫秒.它与队列前面之间的队列,每个第一个服务约50ms(在分摊这些第一个服务中的2个之后).

当对Node.js服务器的所有请求都有类似的处理和I/O延迟时,您可以获得一致的响应时间,这比随机响应时间更好,因为前者意味着自适应流音频/视频将在比特率更高(例如),用户浏览具有一致"节奏"的网页将很快进入节奏并停止感知延迟(当然,除非过于重要).

您的数据库应该能够同时处理几十个连接,所以这不应该是一个问题; 但是如果服务实际上彼此之间没有多少关系,那么您可能也希望将数据库拆分为单独的进程.