0

長時間にわたるアプリの再起動によるダウンタイムの苦痛を軽減するために、次のようなことを考えました。

  1. ポート 80 のメイン アプリ #1。
  2. ポート 80 でアプリケーション #2 もフェールオーバーしますが、アプリケーション #1 が機能していない場合にのみ要求に応答します。
  3. アプリ #2 がアクティブなユーザーに「維持」メッセージを提供できるようにします。

同じポートで 2 つのプロセスを実行すると、最終的にはError: EADDRINUSE- になるため、単純な方法は機能しません。私はserver.on('error')イベントに出くわし、アプリ #1 が停止するまでアプリ #2 を待機させることにしたので、ポートが使用可能になります。

function tryPitchIn(){
     var server = http.createServer(app);

     server.on('listening', function(){
        console.log('Application #1 crashed/ended');
        console.log('Pitching in...');
     });

     server.on('error', function(){
        console.log('noting to do');
        setTimeout(tryPitchIn, 250);
     });

     server.listen(80);
}

tryPitchIn();

上記はうまく機能していますが、アプリ #1 の初期化でアプリ #2 を終了するのに苦労しなければなりません。これは、さまざまなオペレーティング システムで行うのは簡単ではありません。

ノードプロセス(によって開始されたnpm start)に静的IDを与えて、別のプロセス(できればクロスOS)から終了させることは可能ですか? または、シナリオの他のアイデアはありますか?

4

2 に答える 2

1

I like Amadan's answer. On top of that I have to mention that doing much other than logging in .on('error') (and also for unchaughtException) is not recommended. The system could be in a volatile state (internal states of modules could be inconsistent, for example), and you don't want to keep running for long like that.

Either do what Amadan says, or use node.js domains, or use several processes behind a load balancer (which is basically what Amadan says).

于 2013-10-01T03:41:03.053 に答える