【问题标题】:node.js app deployment using pm2 without downtime使用 pm2 部署 node.js 应用程序,无需停机
【发布时间】:2016-11-27 01:33:46
【问题描述】:

关于如何使用 socket.io 和 node.js 开发聊天应用程序的教程有很多,毫无疑问,node 的事件驱动优势具有做聊天应用程序的优势。但是最近这个想法出现在我的脑海中,我如何在部署应用程序时维持我的聊天应用程序?想象一下有成千上万的用户在里面积极聊天。

https://futurestud.io/tutorials/pm2-cluster-mode-and-zero-downtime-restarts这篇文章中明确指出集群技术需要格外小心,嗯,有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: javascript node.js express socket.io pm2


    【解决方案1】:

    PM2 不是解决此问题的正确工具。这很棒,但对于那种编排来说太有限了。

    最好的解决方案是在负载平衡器后面构建您的服务器,并运行应用程序的并行实例轮流处理传入的请求。这是 Docker 等容器最常见的用例之一。

    Mesosphere 的MarathonMarathon LB 就是一个很好的例子(我目前正在生产的约会应用中使用基于socket.io 的聊天)。我们让它们在 AWS 中运行,位于 Elastic Load Balancer (ELB) 后面。

    您实际上可以使用Heroku 获得类似的东西,但可能会有点困难,因为您会受到他们的负载均衡器功能的限制。在 socket.io 中,您可以使用 Redis 会话驱动程序来处理分布式会话。

    【讨论】:

    • 重启大约需要几秒钟。我测试了我的聊天应用程序。它像往常一样工作。我认为它会有一瞬间的停机时间,但之前建立的套接字并没有崩溃。
    • socket.io 与 redis 进行会话?你需要使用 socket.io 的会话吗?
    • 您是对的,但是如果您需要更新 PM2 本身,则停机时间会更长。如果您需要更新 NodeJS itsel,同样如此。如果出于任何原因需要重新启动机器,您将丢失所有集群实例。这就是为什么我说 PM2 不是最好的工具(并且得到了反对)。这是一个很好的开始,但正如您所说,“成千上万的用户”正在依赖它。我永远不会在有这么多用户的项目中使用 PM2。如果它正在运行一个节点实例集群,那么它仍然是一个单点故障,不会导致完全停机。
    • 关于 Redis 会话,如果您想要使用 Sockets 的相同代码的并行实例,您需要一个集中式会话存储(单个 PM2 中的集群事件)。查看 socket.io 官方文档了解 NodeJS 集群 (socket.io/docs/using-multiple-nodes/#using-node.js-cluster)。
    猜你喜欢
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 2017-08-24
    • 2018-08-17
    • 2019-06-24
    相关资源
    最近更新 更多