コンテキスト: OS: Linux (Ubuntu)、言語: C (実際には Lua ですが、これは問題ではありません)。
私は ZeroMQ ベースのソリューションを好みますが、正気であれば何でも受け入れます。
注: 技術的な理由から、ここでは POSIX シグナルを使用できません。
1 台のマシン (「ワーカー」) に複数の同じ長寿命プロセスがあります。
ときどき、コマンドライン ツールを介して各プロセスに制御メッセージを配信する必要があります。例:
$ コマンド アンド コントロール ワーカー タイプのラン コレクト ガベージ
このマシンの各ワーカーはrun-collect-garbage
メッセージを受信する必要があります。注: ソリューションがクラスター内のすべてのマシンのすべてのワーカーに対して何らかの方法で機能する場合は完璧ですが、その部分は自分で書くことができます。
実行中のワーカーに関する情報を保存する場合、これは簡単に実行できます。たとえば、それらの PID を既知の場所に保持し、その中のどこかに PID を持つ既知のパスで制御 Unix ドメイン ソケットを開きます。または、TCP ソケットを開き、ホストとポートをどこかに保存します。
しかし、これには格納された情報の慎重な管理が必要になります。たとえば、ワーカー プロセスが突然停止した場合はどうなるでしょうか。また、情報をどこかに保存する必要があるため、複雑さが増します。
PUB/SUB スタイルでこれを行う良い方法はありますか? つまり、ワーカーはサブスクライバーであり、コマンド アンド コントロール ツールはパブリッシャーであり、彼らが知っているのは、いわばメッセージを受け取る単一の「チャネル URL」だけです。
追加要件:
- コントロール チャネルへのメッセージは、ポーリング (選択など) ループからワーカーを起動する必要があります。
- メッセージの配信は保証されている必要があり、リッスンしているすべてのワーカーに到達する必要があります。
- ワーカーには、ブロックせずにメッセージを監視する方法が必要です — 理想的には、上記のポーリング/選択/その他のループによるものです。
- 理想的には、ワーカー プロセスはある意味で「サーバー」である必要があります。「チャネル サーバー」(存在する場合) への接続を永続的に維持する必要はありません。または、これはフレームワークによって透過的に行われる必要があります。