現在、Python で zmq を使用しています。サーバーは REP ソケットを使用しています。
メッセージを受信したときに、送信者を知る方法はありますか? が 2 つのメッセージを受信した場合、それらが同じユーザーからのものかどうかを知る必要があるだけなので、たとえば uid で十分です。
サーバー側で非同期リクエスト処理を実装したいようです: サーバーにリクエストを受け入れさせ、それらを非同期的に処理し、各リクエストのレスポンス データが利用可能になるたびにクライアントにレスポンスを送り返します。当然のことですが、リクエストの処理が完了した後、どのクライアントに送り返すかをどのように知るのでしょうか?
シンプルな REP ソケットを使用すると、ZMQ はrecv() -> send(), recv() -> send()
連続性を強制することで、この種の問題に遭遇しないようにします。つまり、recv()
REP ソケットで aを実行した後、再度 ing を実行する前にa を実行する必要があります。応答は、メッセージを受け取ったクライアントに送り返されます。一度に 1 つのクライアントのみであるため、クライアントのアドレスに疑いの余地はありません。send()
recv()
しかし、これはリクエスト処理を並列化したい場合にはあまり役に立ちませんね? REP の動作が制限的すぎる場合が多くありますが、これはまさにマルチパート メッセージと ROUTER (または XREP) ソケットの目的です。XREPrecv() -> send()
は REP のロックステップを破りますが、それは以前に見たように問題を引き起こします - 複数のクライアントが接続されている場合、どのクライアントに返信を送るべきかをどうやって知るのですか? これを機能させるために、ZMQ の XREP はメッセージの先頭にメッセージ部分をエンベロープのように追加します。これにrecv()
は、要求元の接続の ID が含まれます。
ZMQ ガイドには、高度な Request-Reply パターンに関する章全体があります。また、非同期リクエストの処理の例はこちらで、ZMQ 接続処理の簡単な説明はこちらでご覧いただけます。
http://zguide.zeromq.org/page%3aall#Transient-vs-Durable-Socketsを読むと、接続しているピアのソケットではなく、使用しているソケットのIDのみを取得できますに。
そうは言っても、送信者情報をメッセージに組み込むだけです。これは簡単に行うことができます (UUID またはクライアントごとの特定の名前を使用)。