複数のサービスにリクエストを行う複数のクライアントがある場合、zeromq によって提案された ROUTER/DEALER アーキテクチャで特定のワーカーにメッセージを送信する方法は? より具体的にはservice A
service B
、ZMQ_DEALER の背後にいる場合です。service A
またはservice B
のみにメッセージを送信する方法は?
3 に答える
ZeroMq ガイドの Majordomo パターンをご覧ください。
https://zguide.zeromq.org/docs/chapter4/#Service-Oriented-Reliable-Queuing-Majordomo-Pattern
Majordomo Protocol (MDP) は、興味深い方法で PPP を拡張および改善します。クライアントが送信する要求に「サービス名」を追加し、特定のサービスに登録するようワーカーに要求します。サービス名を追加すると、Paranoid Pirate キューがサービス指向のブローカーに変わります。
ROUTER/DEALER を介して特定のワーカーにメッセージを送信する方法はありません。もしあったとしたら、(実装と使いやすさの両方の点で)非常に複雑になります。
それでも解決策は明らかです。ルーターのエンドポイントだけでなく、ワーカーのエンドポイントもクライアントに公開します。特定のワーカーにメッセージを送信する必要がある場合は、直接送信してください。ランダムワーカーに送信する必要がある場合は、ルーター経由で送信してください。
この質問でワーカーが何を意味するのかはわかりませんが、ルーターソケットを介して特定の接続にメッセージを送信できます。
たとえば、Dealer ソケットが ID を登録する場合、Router は ID を使用してそのソケットと直接通信できます。したがって、2 つのディーラーの背後に serviceA と serviceB がある場合、ルーターはメッセージの前にソケット ID (および SNDMORE フラグを使用)。例えば
ZMQ.Socket dealer = context.socket(ZMQ.DEALER);
dealer.setIdentity("serviceA".getBytes());
次に、Router ソケットは、以下を送信することにより、そのディーラーと直接通信できます。
routerSocket.sendMore("serviceA".getBytes());
routerSocket.send(data)
このソリューションには 1 つの問題があります。ZMQ は、ソケットがルーティングできなくなったとき (たとえば、何らかのネットワーク ドロップが発生した場合や、単にサービスを再起動した場合など) を記憶し、それができない場合はメッセージをそこにルーティングしません。再接続。そのため、ソケット ID に固定文字列を使用することはお勧めできません。代わりに UUID を使用する傾向があります。どのクライアント/サービスがどの UUID を持っているかをサーバーに伝えることが、より楽しくなりました! いくつかの方法がありますが、要点から離れているため、別の投稿に譲ります。