7

コンテキスト: OS: Linux (Ubuntu)、言語: C (実際には Lua ですが、これは問題ではありません)。

私は ZeroMQ ベースのソリューションを好みますが、正気であれば何でも受け入れます。

注: 技術的な理由から、ここでは POSIX シグナルを使用できません。

1 台のマシン (「ワーカー」) に複数の同じ長寿命プロセスがあります。

ときどき、コマンドライン ツールを介して各プロセスに制御メッセージを配信する必要があります。例:

$ コマンド アンド コントロール ワーカー タイプのラン コレクト ガベージ

このマシンの各ワーカーはrun-collect-garbageメッセージを受信する必要があります。注: ソリューションがクラスター内のすべてのマシンのすべてのワーカーに対して何らかの方法で機能する場合は完璧ですが、その部分は自分で書くことができます。

実行中のワーカーに関する情報を保存する場合、これは簡単に実行できます。たとえば、それらの PID を既知の場所に保持し、その中のどこかに PID を持つ既知のパスで制御 Unix ドメイン ソケットを開きます。または、TCP ソケットを開き、ホストとポートをどこかに保存します。

しかし、これには格納された情報の慎重な管理が必要になります。たとえば、ワーカー プロセスが突然停止した場合はどうなるでしょうか。また、情報をどこかに保存する必要があるため、複雑さが増します。

PUB/SUB スタイルでこれを行う良い方法はありますか? つまり、ワーカーはサブスクライバーであり、コマンド アンド コントロール ツールはパブリッシャーであり、彼らが知っているのは、いわばメッセージを受け取る単一の「チャネル URL」だけです。

追加要件:

  • コントロール チャネルへのメッセージは、ポーリング (選択など) ループからワーカーを起動する必要があります。
  • メッセージの配信は保証されている必要があり、リッスンしているすべてのワーカーに到達する必要があります。
  • ワーカーには、ブロックせずにメッセージを監視する方法が必要です — 理想的には、上記のポーリング/選択/その他のループによるものです。
  • 理想的には、ワーカー プロセスはある意味で「サーバー」である必要があります。「チャネル サーバー」(存在する場合) への接続を永続的に維持する必要はありません。または、これはフレームワークによって透過的に行われる必要があります。
4

4 に答える 4

4

通常、このようなパターンではパブリッシャーのプロキシが必要です。つまり、プロキシに送信すると、すぐに配信が受け入れられ、エンド サブスクライバー ワーカーに確実に転送されます。ZeroMQ ガイドでは、これを実装するいくつかの異なる方法について説明しています。

http://zguide.zeromq.org/page:all

于 2011-05-17T19:32:03.480 に答える
2

あなたの要件を考えると、スティーブの提案は最も単純に思えます.2つの既知のソケットをリッスンするデーモンを実行します-ワーカーはそれに接続し、コマンドツールはそれにプッシュして接続されたワーカーに再配布します。

ワーカーの 1 つを効果的に指名することで、おそらく機能する複雑なことを行うことができます。たとえば、起動時にワーカーは PUB ipc:// ソケットを tmp などのアクセス可能な場所に bind() しようとします。bind()sa 2 番目の IPC を PULL ソケットとして獲得し、通常の役割に加えてフォワーダー デバイスとして機能するものと、元の IPC に connect() するものがあります。コマンド ライン ツールは 2 番目の IPC に connect() し、そのメッセージをプッシュします。勝者が死亡し、ファイルがロックされたままになるリスクがあります。コマンド ライン ツールでこれを特定し、再バインドしてからスリープすることができます (接続を確立できるようにするため)。それでも、それはすべて少し複雑です。プロキシを使用すると思います!

于 2011-06-28T14:43:11.163 に答える
0

あなたが説明していることは、ギアマンド/スーパーバイザーの実装にうまく適合すると思います。

Gearman は優れたタスク キュー マネージャーであり、supervisord を使用すると、プロセスがすべて実行されていることを確認できます。これも TCP ベースなので、異なるマシンにクライアント/ワーカーを配置できます。

http://gearman.org/

http://supervisord.org/

最近、単一障害点がないように、複数のワーカーにリンクされた複数のギアマンド ノードで何かをセットアップしました

編集:申し訳ありませんが、私はちょうど読み直して、これが理想的ではないかもしれないことを知りました。

Redisには、私がまだ使用していないが、有望に思えるシンプルで見栄えの良い pub/sub 機能がいくつかあります。

于 2011-04-23T15:51:16.757 に答える
0

マルチキャスト PUB/SUB を使用します。pgmオプションが ZeroMQ ディストリビューションにコンパイルされていることを確認する必要があります ( man 7 zmq_pgm)。

于 2011-04-28T23:21:27.027 に答える