1

長期接続を処理する C++ を使用して単純な Web サーバーを作成しています。ただし、時々 Web サーバーをリロードする必要があります。リロード後に確立された接続を保持できるように、確立された接続をあるプロセスから別のプロセスに引き渡す方法があるかどうか疑問に思います。

ファイル記述子を渡すだけで十分でしょうか? 接続状態はどうなりますか? 同じことを行う同様のオープンソース プロジェクトはありますか?

考えやアイデアはありますか?

ありがとう、

4

1 に答える 1

2

これが可能かどうかは本当にわかりませんが、そうではないと思います。その後、子は記述子を「継承」しますfork()が、それらが本来のように動作するかどうかはわかりません (動作すると思われますが)。また、フォークすると、新しいコードを実行できません (できますか?) シンプル記述子番号はプロセス固有であるため、関係のない新しいプロセスに渡すだけでは機能せず、プロセスが終了すると閉じられます。

1 つの解決策 (より単純な解決策がない場合) は、サーバーを 2 つのプロセスに分割することです。

  1. フロントエンド: 接続を受け入れるだけの非常に単純なプロセスで、接続を開いたままにし、受信したデータを 2 番目のプロセスに転送し、その逆も行います。
  2. サーバー: すべてのロジックと処理を行うが、クライアントと直接通信しない実際の Web サーバー。

1 番目と 2 番目のプロセスは、単純なプロトコルを介して通信します。このプロトコルの機能の 1 つは、2 番目のプロセスの終了と再起動をサポートする必要があります。

これで、クライアント接続を失うことなく実際のサーバー プロセスをリロードできます (フロントエンド プロセスによって処理されるため)。また、このフロントエンドは非常に単純で、おそらく構成やバグがほとんどないため、リロードする必要はほとんどありません。それはまったく。(修正が必要なバグに遭遇したり、構成などを変更する必要があるため、サーバープロセスをリロードする必要があると思います。)

このシステムが持つことができるもう 1 つの重要で役立つ機能は、サーバー プロセス間を「段階的に」移行できることです。つまり、すでにフロントエンドとサーバーが実行されていますが、サーバーをリロードすることにしました。フロントエンドに接続する別のサーバー プロセスを起動すると (古いサーバーがまだ実行され接続されている間に)、フロントエンド プロセスはすべての新しいクライアント接続を新しいサーバー プロセスに転送します (または、既存のクライアント接続。) そして、古いサーバーが処理中のすべての要求の処理を終了すると、正常かつクリーンに終了します。

私が言ったように、これは、より簡単で単純なものが見つからない場合にのみ試すことができる解決策です.

于 2013-08-21T19:16:57.237 に答える