0

コードを更新するとき、またはプロセスまたはホットスワップ コードを再起動するときに、ソケット接続を維持することは可能ですか?

私が取り組んでいる次世代の分散サーバー アプリケーション (現在は node.js で記述) について考えており、サーバーとリモート クライアントが接続している限り、tcp ソケットを開いたままにできるようにしたいと考えています。サーバー コードが更新された場合や、特定のインスタンスが再起動または消失した場合でも、ネットワーク接続を維持します。

次のいずれかが可能ですか?

  • コードが再起動する前に、ソケット情報を保存しますが、リモート エンドは開いたままです。これはCで完全に実行できるようです。
  • コードが再起動する前に、ソケット情報を別のインスタンスまたはプロセスに送信しますか?
  • Erlang の場合、特定のコードがホット スワップされた場合、データ構造と接続は乱れませんか?
  • いくつかのタプル スペースにソケットを分散します。私はこれについて何も知りませんが、少なくとも面白そうです。

私が見るべき参考資料はありますか?Erlang はこのシステムの将来のバージョンの有力な候補のように思えますが、おもちゃの例以外には使用していません。

編集:Linuxで実行

4

3 に答える 3

3

編集:タイプミスを修正。

これがどのプラットフォームで実行されているかについて言及しなかったので、Linux/Unix と仮定します。これを行うには、少なくとも 2 つの方法があります。

  1. 「新しい自分をフォークして実行する」ことを意味する信号をアプリに送信します。新しい自己はソケットを継承します。

  2. unix-pipes 経由でソケット fds を渡すことができるはずです。app-v1 に信号を送信してソケットを事前定義されたパイプにダンプし、完了したらそれを強制終了してから app-v2 を起動し、unix-pipe 経由でソケットをもう一度渡す最小限のスチュワード アプリケーションを作成できます。

于 2012-10-11T01:39:11.657 に答える
1

私の頭の上から2つのアイデア、

  1. 標準インターフェースを使用して別のプロセスでソケット ハンドラーを実装する

  2. コードを dll にコンパイルします。これにより、ソフトウェアの更新が発生したときに実際の dll をロードおよびアンロードできます。

于 2012-10-10T23:50:18.043 に答える
1

はい、Erlang では新しいバージョンに従ってコードを交換し、内部状態データ構造を変換することが可能です。簡単に言うと、変換関数を実装し、新しいバージョンのコードをロードした後にそれを同期的に呼び出す必要があります (接続が失われることはありませんが、もちろん、変換が完了するまで少し待つ必要があります)。この機能はOTPで確実に提供されます (たとえば、使用している場合は function を実装できます) 。gen_servercode_change

于 2012-10-11T08:08:28.873 に答える