【发布时间】:2016-04-07 21:11:05
【问题描述】:
我是 nodejs 的初学者。我正在尝试在生产中使用 nodejs。我想实现nodejs故障转移。当我正在执行聊天应用程序时,如果节点服务器出现故障,则聊天不应中断,并且应自动连接到不同的节点服务器,并且应使用相同的套接字 id 进行进一步聊天,以免聊天消息消失。这是可以实现的吗?任何样品。
我不应该使用 Ngnix/HAProxy。也让我知道节点服务器应该如何:主动-主动或主动-被动
【问题讨论】:
我是 nodejs 的初学者。我正在尝试在生产中使用 nodejs。我想实现nodejs故障转移。当我正在执行聊天应用程序时,如果节点服务器出现故障,则聊天不应中断,并且应自动连接到不同的节点服务器,并且应使用相同的套接字 id 进行进一步聊天,以免聊天消息消失。这是可以实现的吗?任何样品。
我不应该使用 Ngnix/HAProxy。也让我知道节点服务器应该如何:主动-主动或主动-被动
【问题讨论】:
PM2是首选的进程管理器,特别是auto-failover,auto-scaling,auto-restart的特性。
介绍如下,
PM2 是 Node.js 应用程序的生产流程管理器,具有 内置负载均衡器。它使您可以使应用程序保持活力 永远,在不停机的情况下重新加载它们并促进共同 系统管理任务。
在生产模式下启动应用程序非常简单:
$ pm2 start app.jsPM2 经常受到 700 多项测试的攻击。
适用于 Linux(稳定)和 MacOSx(稳定)和 Windows(测试版)。
【讨论】:
你要同时解决几个问题:
守护进程 - 让您的应用程序保持正常运行:如前所述,forever 等脚本可用于监督您的 nodeJS 应用程序以在失败时重新启动它。这对于在最坏的故障情况下启动应用程序很有用。
同样,recluster 可用于分叉您的应用程序,并通过创建主管进程和子进程使其更具抗故障能力。
未捕获的异常:nodejs 中的一个已知障碍是无法使用 try/catch 块捕获异步错误。因此,异常可能会冒泡并导致整个应用程序崩溃。
而不是让这种情况发生,您应该使用domains 来创建受异常影响的活动的逻辑分组并适当地处理它。如果您正在运行有状态的网络服务器,则可能应该捕获未处理的异常,并且在终止应用程序之前优雅地关闭其余连接。
(如果您正在运行无状态应用程序,则可以忽略异常并尝试继续;尽管这不一定是可取的。小心使用它)。
安全:这是一个很大的话题。您至少需要确保:
顺便说一句,我看到您在 NodeJS 前面使用 Apache,这不一定是因为 apache 可能会在负载下使用它的线程模型而不是 nodeJS 使用它的事件循环模型。
【讨论】:
假设您使用数据库来验证客户端,并没有太多需要完成的工作,我的意思是,管理服务器脚本状态的脚本,就像 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
--希望我能在某些方面有所帮助。
【讨论】:
对于一个简单的方法,我认为您应该在客户端构建一个重新连接机制,并使用forever 或PM2 的进程管理来管理您的Node.js 进程。我尝试了太多方法,但仍然无法解决套接字问题,每当进程停止时它总是被杀死。
【讨论】:
您可以尝试使用Pm2 start app.js -I 0。这将以集群模式运行您的应用程序,为同一线程创建许多子进程。您可以在各个进程之间共享套接字信息。
【讨论】: