【问题标题】:How to make a distributed node.js application?如何制作分布式 node.js 应用程序?
【发布时间】:2013-03-03 18:26:48
【问题描述】:

创建 node.js 应用程序非常简单。

var app = require('express')();
app.get('/',function(req,res){
    res.send("Hello world!");
});

但是假设人们对您的Hello World! 应用程序着迷并耗尽了您的资源。如何在实践中扩大这个例子?我不明白,因为是的,您可以在不同的计算机上打开多个 node.js 实例 - 但是当有人访问 http://your_site.com/ 时,它直接针对特定的机器、特定的端口、特定的节点进程。那怎么办?

【问题讨论】:

    标签: node.js http scalability


    【解决方案1】:

    有很多方法可以解决这个问题,但归结为两件事:

    1. 能够在每台服务器上使用更多内核
    2. 能够扩展到多于一台服务器。

    节点集群

    对于第一个选项,您可以使用node-cluster 或与第二个选项相同的解决方案。 node-cluster (http://nodejs.org/api/cluster.html) 本质上是一种将节点进程分叉为一个主进程和多个工作进程的内置方式。通常,您需要 1 个 master 和 n-1 到 n 个 worker(n 是您的可用核心数)。

    负载平衡器

    第二种选择是使用负载均衡器,将请求分配给多个工作人员(在同一台服务器上,或跨服务器)。

    在这里您也有多种选择。以下是一些:

    还有一件事,一旦你开始有多个进程处理请求,你就不能再使用内存来存储状态,你需要一个额外的服务来存储共享状态,Redis (http://redis.io) 是一个流行的选择,但绝对不是表示唯一的一个。

    如果您使用 cloudfoundry、heroku 等服务,它们会为您设置好,因此您只需担心应用的逻辑(以及使用服务来处理共享状态)

    【讨论】:

    • 你关注我之前的问题了吗?因为你很擅长。Redis 很有趣,我现在正在阅读它。它可以被描述为 NoSQL 数据库吗?
    • 你指的是哪些问题,这是可能的。 Redis 确实是一个 NoSQL 数据库,可能是最简单的形式,更多的是键/值存储,在内存中,但可以持久化,并支持队列、哈希、发布/订阅等。
    • @PascalBelloncle 一个非常好的答案(y)
    • 从内存切换到服务的另一点是,当您从内存中的会话切换到另一个时,如果您正在执行诸如编写整个对象到会话并在检索后调用它们的方法,因为通常这些方法不会在没有额外工作的情况下被序列化到该服务的存储区。
    【解决方案2】:

    使用多台机器的基本方法是将它们放在负载均衡器后面,并将所有流量指向负载均衡器。这样,有人去http://my_domain.com,它将指向负载平衡器机器。负载均衡器的唯一目的(无论如何,对于这个例子;理论上可以做更多)是将流量委托给运行您的应用程序的给定机器。这意味着您可以有 x 台机器运行您的应用程序,但是外部机器(在本例中为浏览器)可以访问负载均衡器地址并访问其中一个。客户端不(也不必)知道实际上是哪台机器在处理它的请求。如果您使用AWS,则设置和管理它非常容易。请注意,Pascal 的答案在此处提供了有关您的选择的更多详细信息。

    对于 Node,您可能需要查看 Node Cluster 模块。我对这个模块并没有太多的经验,但是它应该允许你在一台机器上生成应用程序的多个进程,所有进程都共享同一个端口。还有节点,它仍然是实验性的,我不确定它的可靠性。

    【讨论】:

      【解决方案3】:

      我使用 node 已经有一段时间了,但最近有机会尝试扩展我的 node 应用程序,并且一直在研究同一主题已有一段时间,并且遇到了以下扩展的先决条件:

      1. 我的应用需要在分布式系统上可用,每个系统都运行多个节点实例

      2. 每个系统都应该有一个负载均衡器,帮助在节点实例之间分配流量。

      3. 应该有一个主负载平衡器,它应该在分布式系统上的节点实例之间分配流量。

      4. 主平衡器应始终运行,或者应具有可靠的重启机制以保持应用稳定。

      对于上述要求,我遇到了以下情况:

      1. 使用cluster 等模块在系统中启动多个节点实例。

      2. 始终使用 nginx。这是迄今为止我遇到的创建负载均衡器的最简单的机制之一

      3. 使用HAProxy 充当主负载平衡器。 few pointers 说明如何使用它并让它永远运行。

      有用的资源:

      1. Horizontal scaling node.js and websockets.
      2. Using cluster to take advantages of multiple cores.

      随着我的进步,我会不断更新这个答案。

      【讨论】:

        【解决方案4】:

        我建议查看http://senecajs.org,这是一个用于 Node.js 的微服务工具包。对于初学者来说,这是一个很好的起点,可以开始思考“服务”而不是单一的应用程序。

        话虽如此,构建分布式应用程序很难,需要时间来学习,需要 很多 时间来掌握它,通常你会在性能、可靠性、维护性之间面临很多权衡,等等

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-22
          相关资源
          最近更新 更多