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

时间:2012-03-21 16:37:37

标签: node.js express socket.io scaling

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

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

谢谢,

ARIC

1 个答案:

答案 0 :(得分:6)

将它们分开可以有意义,原因有两个:

  1. 如果您的服务器上有多个处理器,则每个Node.js应用程序可以在一个单独的核心上运行其事件循环,并且实际上并行运行,而不是如此显示,让您立即加倍/服务器性能增加三倍(假设没有I / O限制)。
  2. 因为所有逻辑服务都在一个事件循环中,所以您增加了系统的脆弱性。如果一个服务锁定事件循环,则所有服务将被锁定。即使您从未在各种服务中遇到错误,您仍然会遇到“高性能”服务被置于同一事件循环中而受到惩罚的问题。
  3. 例如,假设您有三个服务:一个是在Node.js事件循环中花费约50毫秒并且不访问数据库,文件等的简单服务;这一切都在记忆中。第二个服务在Node.js事件循环中花费约100ms,在DB / File I / O上等待约400ms。第三个服务在Node.js事件循环中花费约400ms,在DB上花费约100ms。因为事件循环本质上是一个队列,每次等待非阻塞I / O时,逻辑请求被抛回到堆栈的末尾,对于每个第二个服务,您的第三个服务可能会被减慢额外的约300毫秒。它与队列前面之间的队列,每个第一个服务约50ms(在分摊这些第一个服务中的2个之后)。

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

    您的数据库应该能够同时处理几十个连接,因此这不应该是一个问题;但是如果服务真的没有相互关联,你可能也希望将数据库分成不同的进程。