2017-02-22 24 views
3

トピックを購読しているときにのみメッセージが失われています。ZeroMQ Pub/Subはトピックの購読時にのみメッセージをドロップします

サブスクライバは特定のトピックにサブスクライブし、別のスレッド(同じコンテキストと同じ「サブスクライブトピック」)でパブリッシャを呼び出します。
パブリッシャーは「購読トピック」を受信して​​発行します。

2つの手順(2つのサブスクライバスレッドと2つのパブリッシャスレッドを意味する)を実行すると、スレッドの1つに(ランダムに)1つのメッセージしか受信されません。
なぜ私は2番目のメッセージを失っているのか分かりません。

出版社のスレッド:

void *publisher = zmq_socket(ptStruct->zContext, ZMQ_PUB); 
assert(0 == zmq_bind(publisher, "inproc://#1")); 
printf("Publishes to %d \n", ptStruct->iID); 
assert(-1 != zmq_send(publisher, &(ptStruct->iID), sizeof(ptStruct->iID), 0)); 
zmq_close(publisher); 

加入者スレッド:

void *subscriber = zmq_socket(ptStruct->zContext, ZMQ_SUB); 
assert(0 == zmq_connect(subscriber, "inproc://#1")); 
assert(0 == zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, &(ptStruct->iID), sizeof(ptStruct->iID))); 
printf("Subscribed to %d \n", ptStruct->iID); 

/* Now run the publisher in a different thread */ 
OSTHREAD_CreateThread(&ptThread, publishThread, ptStruct, NULL); 

assert(-1 != zmq_recv(subscriber, acRec, 255, 0)); 
printf("Got %d \n", acRec[0]); 
zmq_close(subscriber); 

は、私は二回、加入者のスレッドを実行し、これが出力されます:あなたは二つの異なるパブリッシャーを作成している

Subscribed to 1 
Subscribed to 2 
Publishes to 1 
Got 1 
Publishes to 2 

答えて

1

bind()-同じものinprocエンドポイント "#1" - エンドポイントは1回のみバインドでき、2番目のパブリッシャーは同じエンドポイントでbind()に失敗し、メッセージを送信しません。

また、あなたはおそらくslow joiner問題への最初のメッセージ、-ing -ing、その後send()出版社bind()の間にいくつかの遅延に追加したいと思う - 出版社は、あなたのメッセージ、送信しようとした後、ドロップ可能性がありサイト運営者と加入者が接続を終了する前に、あなたのメッセージを失うことにもなります。

+0

興味深い..サブスクリプションでフィルタを使用していないときには機能しましたが、あなたはパブ/サブよりもこれを行う良い方法があると思いますか? (私はpub/subのような何かを必要とするので、多くの場合、多くの場合) – Drxxd

+0

あなたのコミュニケーションを設計する最良の方法を本当に理解するのに十分な詳細はありません。 pub/subで多対多を行うことができます。それぞれのpubを独自のエンドポイントにバインドして、各サブスクライバを各パブに接続するだけで済みます。しかし、なぜあなたは複数のパブソケットが必要ですか?あなたが何をしようとしているのか理解していないと、あなたの場合には何が最善であるかを示唆することはできません。 – Jason

関連する問題