0

異なるレイアウトを持つ文字列処理サービス(c ++、入力/出力にstdin / outを使用)があり、各レイアウトは別々に実行され(最終的には別々のマシンで実行されます)、各レイアウトはロードに時間がかかるため、その後も実行し続ける必要がありますファーストラン。

関連するレイアウトサービスを実際に実行する関連するスレーブサーバーに接続するようにマスターサーバーに要求するクライアントを備えたシステムを実装する必要があります。スレーブサーバーはクライアントからサービスに渡されたデータを通信し、終了するとマスターサーバーで他のクライアントが利用できるようになります。

問題は、サーバーを実装するための最善の方法は何ですか?プロセスが完了するまでスレーブ/マスター間の接続を開いたままにして、接続が終了したことをマスターに通知する必要がありますか、それとも同期関数にある種の変数を保持してそれを確認する必要がありますか?

私が見落とした他の重要な入力(または他のデザイン)も大歓迎です、ありがとう!

4

2 に答える 2

0

C ++のものを置き換えることができないと仮定すると、これが私の頭のてっぺんからそれを行う方法です。

1台のマスターサーバーをセットアップします。そのサーバーは、要求を受け入れるプロセスを実行し(おそらく、HTTPによって、したがってWebサービスになります)、要求を読み取り、それが何であるかを解析してから、正しいスレーブを呼び出します。基本的にはプロキシとして機能します。スレーブから応答を受信すると、それを呼び出し元に転送します。ここでの単純さは、1つのタイプのリクエストを複数取得し始めた場合に、そのサーバーに追加のサーバーをセットアップして、それらへのラウンドロビンリクエストを実行できることを意味します。

スレーブは、C ++プログラムを開き、入力を転送して出力を取得するWebサービスになります。それがすべてです。

私はわざわざ開いた接続を維持しません(あなたの説明に基づくスレーブとC ++プログラムの間を除いて)。このようなものにWebリクエストを使用するだけで、プロセス中にマスターとスレーブ間の接続が開いたままになりますが、問題になることはありません。このように、この詳細について心配する必要はありません。

もし私があなたなら、JavaでC ++コードを再実装するか、JNIなどを介して呼び出すことを真剣に検討します。それを回避できれば、C++のJavaラッパーを回避することは良い設計目標になると思います。Javaは、一度起動するときに高価なプロセスを実行し、C++コードのようにメモリ内で準備を整えることができます。

これがお役に立てば幸いです。

于 2009-02-16T16:08:07.093 に答える
0

スケーラビリティのニーズに応じて、Java NIO パッケージを検討することをお勧めします。これにより、スケーラブルでノンブロッキングなサーバー実装を構築するための出発点が得られます。

于 2009-02-16T16:24:04.700 に答える