RabbitMq を使用すると、チャネルを介した単一の接続で複数のキューへのサブスクリプションが実現されます。これにより、単一のソケットを使用して複数のサブスクリプションを処理できます。Zero MQ で複数のメッセージ タイプのソケット接続を最小化するためのアナログ戦略は何ですか?
1 に答える
PUB/SUB メッセージ エンベロープは、ZeroMQ でこの問題を解決するための推奨される方法だと思います ( Pub-Sub Message Envelopesを参照)。
メッセージを送信する前に、発行者はトピックをエンベロープで送信する必要があります。
s_sendmore (publisher, "A");
s_send (publisher, <Serialized MessageA>);
.....
s_sendmore (publisher, "B");
s_send (publisher, <Serialized MessageB>);
サブスクライバーには、複数のトピックを処理するための 3 つのオプションがあります。
エンベロープからメッセージ タイプを読み取り、メッセージ タイプに応じてデシリアライザーを使用します (図のクライアント 1)。
char *topic = s_recv (subscriber); char *body = s_recv (subscriber); //If topic == "A", the body contains serialized MessageA, otherwise MessageB
を使用して 1 つのトピックのみをサブスクライブし
zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, ...);
ます。この状況では、ZeroMQ は PUB 側のメッセージ フィルタリングを実行し (3.x 以降)、クライアントは MessageA タイプのメッセージのみを受信することを確認できます (図のクライアント 2)。char *topic = s_recv (subscriber); char *body = s_recv (subscriber); //Ignore the topic, the body contains serialized MessageA
INPROC
すべてのメッセージをサブスクライブし、クライアント プロセス内にソケットでメッセージを発行するプロキシを作成します。個々のサブスクライバーはzmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, ...);
、単一タイプのメッセージをサブスクライブするために使用する必要があります。(クライアント 3 を参照)。void *frontend = zsocket_new (context, ZMQ_SUB); zsocket_connect (frontend, "tcp://<....>"); void *backend = zsocket_new (context, ZMQ_PUB); zsocket_bind (backend, "inproc://all_messages"); // Start the proxy zmq_proxy (frontend, backend, NULL); ... //On another thread void *sub1 = zsocket_new (context, ZMQ_SUB); zsocket_connect (sub1, "inproc://all_messages"); zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "A", 1); ... void *sub2 = zsocket_new (context, ZMQ_SUB); zsocket_connect (sub2, "inproc://all_messages"); zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "B", 1);
また、さまざまなトリックに役立つ XPUB/XSUB ソケットを見つけることもできます。たとえば、 Last Value Cachingを参照してください