我是nodejs的初学者。我想在生产中使用nodejs。我想实现nodejs故障转移。当我正在执行聊天应用程序时,如果节点服务器失败,聊天不应该分解并且应该自动连接到不同的节点服务器,并且应该使用相同的套接字ID进行进一步聊天,以便聊天消息不应该消失。这可以实现吗?任何样品。
我不应该使用Ngnix / HAProxy。另请告诉我节点服务器应该如何:Active-Active或Active-Passive
答案 0 :(得分:7)
PM2最好是流程管理员,尤其是自动故障转移,自动扫描,自动重启等功能。
介绍如下,
PM2是Node.js应用程序的生产过程管理器 内置负载均衡器。它允许您保持应用程序活着 永远,重新加载他们没有停机时间和促进共同 系统管理任务。
在生产模式下启动应用程序非常简单:
$ pm2 start app.js
PM2经常受到700多次测试的攻击。</ p>
适用于Linux(稳定版)&amp; MacOSx(稳定)&amp; Windows(bêta)。
答案 1 :(得分:3)
你遇到的几个问题是:
守护进程 - 保持您的应用:如前所述,forever
等脚本可用于监督您的nodeJS应用程序在失败时重新启动它。这适用于在最坏情况下启动应用程序。
类似地,recluster可用于分叉您的应用程序,并通过创建管理程序进程和子进程使其更具故障性。
未捕获的异常:nodejs中的一个已知障碍是无法使用try / catch块捕获异步错误。因此,异常会冒泡并导致整个应用程序崩溃。
您应该使用domains来创建受异常影响的活动的逻辑分组,并在适当时处理它,而不是让这种情况发生。如果您正在运行具有状态的Web服务器,则可能应该捕获未处理的异常,并在终止应用程序之前正常关闭其余连接。
(如果您正在运行无状态应用程序,则可能只是忽略该异常并尝试继续;尽管这不一定是可取的。请谨慎使用它。
安全性:这是一个很大的话题。你需要至少确保:
顺便说一句,我看到你在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)
对于一个简单的方法,我认为您应该在客户端构建重新连接机制,并使用进程管理forever
或PM2
来管理Node.js进程。我尝试了太多方法,但仍然无法克服套接字问题,只要进程停止,它总会被杀死。
答案 4 :(得分:0)
您可以尝试使用Pm2 start app.js -I 0
。这将以群集模式运行您的应用程序,为同一个线程创建许多子进程。您可以在各种进程之间共享套接字信息。