all-to-all通信を行う最善の方法は何ですか?全員が他の全員にサブスクライブしている状態でpub-subを行うのが最善でしょうか?それとも、これにより適したソケットタイプはありますか?
1 に答える
これは XPUB/XSUB プロキシで実現できます。多くのクライアントが他の多くのクライアントと話している。こちらのガイドの概要。
プロキシー
プロキシは、多対多のクライアントを接続するための仲介者として機能します。expresso.cの例。プロキシはスタンドアロンで実行されます。
void *subscriber = zsocket_new (ctx, ZMQ_XSUB);
zsocket_bind (subscriber, "tcp://*:6000");
void *publisher = zsocket_new (ctx, ZMQ_XPUB);
zsocket_bind (publisher, "tcp://*:6001");
zmq_proxy (subscriber, publisher, 0);
クライアント
クライアントは、パブリッシャーとサブスクライバーの役割を同時に果たします。メイン スレッドで、pub ソケットを作成し、それをプロキシの XSUB 側に接続します。メッセージの送信に使用します。
void *publisher = zsocket_new (ctx, ZMQ_PUB);
zsocket_connect (publisher, "tcp://localhost:6000");
ここで、XPUB 上のプロキシからのメッセージをリッスンするクライアントに子スレッドを作成する必要があります。
void *subscriber = zsocket_new (ctx, ZMQ_SUB);
zsocket_connect (subscriber, "tcp://localhost:6001");
クライアントがメッセージを公開すると、メッセージを送信したクライアントを含め、XSUB をリッスンしているすべてのクライアントがそれを取得するので、そのことを覚えておいてください。
双方向のメッセージングが必要ない場合は、PubClient と SubClient を実装し、それぞれが送信または受信のいずれかで意図された役割を果たしますが、両方ではありません。上記のクライアント コードは、そのアプローチのために単純に 2 つのクラスに分割されます。
繰り返しますが、これを行う方法は他にもありますが、これが最も簡単です。それが役に立てば幸い