8

この質問にはEventMachineのタグが付けられていますが、あらゆる言語の一般的なBSDソケットソリューションも高く評価されています。


いくつかの背景:

TCPソケットでリッスンしているアプリケーションがあります。これは、通常のSystemVスタイルのinitスクリプトで開始およびシャットダウンされます。

私の問題は、TCPソケットを処理する準備ができるまでに起動するのに時間がかかることです。それほど長くはなく、おそらく5秒だけですが、就業時間中に再起動を実行する必要がある場合は、5秒長すぎます。また、既存の接続を開いたままにして、正常に終了することも重要です。

アプリケーションを再起動する理由は、パッチやアップグレードなどです。残念ながら、私は時々、この種のことをプロダクションで行う必要があるという立場にいます。


質問:

あるプロセスから別のプロセスにTCPリスニングソケットをきちんと引き渡す方法を探しています。その結果、ダウンタイムはほんの一瞬です。新しいプロセスが新しいconnectinoのサービスを開始する間、既存の接続/ソケットを開いたままにして、古いプロセスでの処理を終了したいと思います。

BSDソケットを使用してこれを行うための実証済みの方法はありますか?(EventMachineソリューションのボーナスポイント。)

これを実装しているオープンソースライブラリは、そのまま使用することも、リファレンスとして使用することもできますか?(繰り返しになりますが、RubyおよびEventMachine以外のソリューションも高く評価されています!)

4

2 に答える 2

8

サーバープログラムに適切な変更を加えて、ダウンタイムなしでこれを行うには、いくつかの方法があります。

1つは、たとえば特定の信号やその他のメッセージを受信したときに、サーバー自体に再起動機能を実装することです。次に、プログラムは新しいバージョンを実行し、たとえば引数として、リスニングソケットのファイル記述子番号を渡します。このソケットは、FD_CLOEXEC継承されるようにフラグをクリア(デフォルト)にします。他のソケットは引き続き元のプロセスによって処理され、新しいプロセスに渡されるべきではないため、フラグは、たとえばを使用しているソケットに設定する必要がありますfcntl()。新しいプロセスをフォークして実行した後、新しいプロセスは現在そのソケットでリッスンしているため、元のプロセスはサービスを中断することなくリッスンソケットを閉じます。

古いサーバーが新しいサーバー自体をフォークして実行する必要がない場合の別の方法は、Unixドメインソケットを使用して古いサーバープロセスと新しいサーバープロセスの間で通信することです。新しいサーバープロセスは、起動時にファイルシステム内の既知の場所にあるそのようなソケットをチェックできます。存在する場合、新しいサーバーはこのソケットに接続し、古いサーバーがSCM_RIGHTSを使用して補助データとしてリスニングソケットを転送するように要求します。この例は、cmsg(3)の最後にあります。

于 2010-02-05T16:57:17.240 に答える
1

Jean-Paul Calderoneは、2004年に、ソケットの移行やその他の問題を含む、Twistedを使用した問題の全体的な解決策に関する詳細なプレゼンテーションを作成しました。

于 2010-05-29T14:03:01.163 に答える