Nodejs故障转移

时间:2013-12-10 10:04:01

标签: node.js failover

我是nodejs的初学者。我想在生产中使用nodejs。我想实现nodejs故障转移。当我正在执行聊天应用程序时,如果节点服务器失败,聊天不应该分解并且应该自动连接到不同的节点服务器,并且应该使用相同的套接字ID进行进一步聊天,以便聊天消息不应该消失。这可以实现吗?任何样品。

我不应该使用Ngnix / HAProxy。另请告诉我节点服务器应该如何:Active-Active或Active-Passive

5 个答案:

答案 0 :(得分:7)

PM2最好是流程管理员,尤其是自动故障转移,自动扫描,自动重启等功能。

介绍如下,

  

PM2是Node.js应用程序的生产过程管理器   内置负载均衡器。它允许您保持应用程序活着   永远,重新加载他们没有停机时间和促进共同   系统管理任务。

     

在生产模式下启动应用程序非常简单:

$ pm2 start app.js
     

PM2经常受到700多次测试的攻击。<​​/ p>      

官方网站:http://pm2.keymetrics.io

     

适用于Linux(稳定版)&amp; MacOSx(稳定)&amp; Windows(bêta)。

答案 1 :(得分:3)

你遇到的几个问题是:

守护进程 - 保持您的应用:如前所述,forever等脚本可用于监督您的nodeJS应用程序在失败时重新启动它。这适用于在最坏情况下启动应用程序。

类似地,recluster可用于分叉您的应用程序,并通过创建管理程序进程和子进程使其更具故障性。

未捕获的异常:nodejs中的一个已知障碍是无法使用try / catch块捕获异步错误。因此,异常会冒泡并导致整个应用程序崩溃。

您应该使用domains来创建受异常影响的活动的逻辑分组,并在适当时处理它,而不是让这种情况发生。如果您正在运行具有状态的Web服务器,则可能应该捕获未处理的异常,并在终止应用程序之前正常关闭其余连接。

(如果您正在运行无状态应用程序,则可能只是忽略该异常并尝试继续;尽管这不一定是可取的。请谨慎使用它。

安全性:这是一个很大的话题。你需要至少确保:

  1. 您的应用程序作为具有最少权限的非root 用户运行。端口&lt; 1024需要root权限。通常,这是从具有nginx,docker或类似的更高端口代理的。
  2. 您正在使用helmet并尽可能地强化您的应用程序。
  3. 顺便说一句,我看到你在NodeJS面前使用Apache,这并不一定,因为apache可能会在其负载下使用它的线程模型比使用它更多地使用nodeJS&#39 ; s事件循环模型。

答案 2 :(得分:1)

假设您使用数据库来验证客户端,那么完成它并不是很重要,我的意思是,管理服务器脚本状态的脚本,如forever所做的,

如果脚本失败,它会尝试启动脚本,超过你应该设计服务器脚本来处理每个已知和可能的未知错误,发送给它的任何信号等等。

一个小例子就是溪流。

(Websocket Router)
 |       
 |_(Chat Channel #1) \
 |_(Chat Channel #2) - Channel Cache // hold last 15 messages of every channel  
 |_(Chat Channel #3) / 
 |_(Authentication handler) // login-logout

- 希望我能以某种方式帮助你。

答案 3 :(得分:1)

对于一个简单的方法,我认为您应该在客户端构建重新连接机制,并使用进程管理foreverPM2来管理Node.js进程。我尝试了太多方法,但仍然无法克服套接字问题,只要进程停止,它总会被杀死。

答案 4 :(得分:0)

您可以尝试使用Pm2 start app.js -I 0。这将以群集模式运行您的应用程序,为同一个线程创建许多子进程。您可以在各种进程之间共享套接字信息。