2

複数のサービスにリクエストを行う複数のクライアントがある場合、zeromq によって提案された ROUTER/DEALER アーキテクチャで特定のワーカーにメッセージを送信する方法は? より具体的にはservice A service B、ZMQ_DEALER の背後にいる場合です。service Aまたはservice Bのみにメッセージを送信する方法は?

4

3 に答える 3

3

ZeroMq ガイドの Majordomo パターンをご覧ください。

https://zguide.zeromq.org/docs/chapter4/#Service-Oriented-Reliable-Queuing-Majordomo-Pattern

Majordomo Protocol (MDP) は、興味深い方法で PPP を拡張および改善します。クライアントが送信する要求に「サービス名」を追加し、特定のサービスに登録するようワーカーに要求します。サービス名を追加すると、Paranoid Pirate キューがサービス指向のブローカーに変わります。

ここに画像の説明を入力

于 2014-04-09T10:21:50.130 に答える
1

ROUTER/DEALER を介して特定のワーカーにメッセージを送信する方法はありません。もしあったとしたら、(実装と使いやすさの両方の点で)非常に複雑になります。

それでも解決策は明らかです。ルーターのエンドポイントだけでなく、ワーカーのエンドポイントもクライアントに公開します。特定のワーカーにメッセージを送信する必要がある場合は、直接送信してください。ランダムワーカーに送信する必要がある場合は、ルーター経由で送信してください。

于 2013-04-02T23:43:00.607 に答える
0

この質問でワーカーが何を意味するのかはわかりませんが、ルーターソケットを介して特定の接続にメッセージを送信できます。

たとえば、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 を持っているかをサーバーに伝えることが、より楽しくなりました! いくつかの方法がありますが、要点から離れているため、別の投稿に譲ります。

于 2015-06-08T13:31:52.880 に答える