2017-02-19 16 views
1

私はZeroMQ(C++版)を初めてお使いですか?br: PUB/SUBフォーマルコミュニケーションパターンの原型を使用してプログラムを作成しているときに、問題が残っています。ZeroMQは未解決のメッセージの数をカウントできますか?

プログラム:それは私がPUBに可能なメッセージな限りを送信すると仮定し、私のプロジェクトは、
です。
これは私がROUTERソケットタイプを使用していました。

問題
レシーバは、メッセージが(アップハイウォーターマークに到達するまで)待ち行列に入れられ、その後、SUB側に落下始まりなっているため、これに、遅いです。

を探して:
私は私に「優秀キュー内のメッセージの数を」伝える(C++上)ZeroMQからメソッドを、したいです。

検索には多くの回答がありませんでした。
私はこれに関するあらゆる種類のポインタまたはヘルプを探しています。

+2

ZMQはアクターモデルシステムです。これは、送信者がメッセージの配信時期を知る仕組みがないことを意味します。これを必要とする場合は、サブスクライバからのパブリッシャへのメッセージのための別のソケットが必要です。メッセージは「別のメッセージを送信してください」という意味です。 – bazza

+0

@bazza 13、お返事ありがとうございます。私はsend()がDONTWAITフラグで呼び出された場合、Queue Full(メッセージ配信失敗)の場合は-1を返します。同じことをしようとしたが動作していない。それは常にデータのサイズを返します。あなたはこれについて何か考えていますか?キューは満杯だがsend()は適切な値を返しています。 –

答えて

0

非同期メッセージングを使用しているようです。これは、送信者がメッセージ到着および/またはキューイングを知らないことを意味する。送信者がメッセージを送信するたびにインクリメントする静的カウンタと、受信者がメッセージを受け取ったときにインクリメントする静的変数を使用できますか?この2つの違いを利用すると、キューに入れられるメッセージの数がわかるはずです。これは安全ではないため、実験的である必要がありますが、より多くの洞察力を与えるかもしれません。むしろ、どのメッセージにも影響を与えないようにSUBを最適化することに焦点を合わせるべきです。料金をチェックして、それを回避できるかどうかを確認してください。または、処理によって遅延が発生した場合は、着信メッセージの格納に使用する独自のバッファを作成することもできます。

1

回答が見つかりました。ルータの種類の下で3つのパラメータを使用して、私はそれを解決することができました。 zmq.hppの を送信しています(これはrouter-> sendメソッドまで続きます)。ルータのレベルで ルータレベルで複数のチェックがあります(キューが満杯か、パケットが届かないなど) * router mandator/sendtimeout(-1)/を設定し、dontwaitでパケットを送信すると、zmq sendはすべてのエラー/再処理を処理しますtry(zmqキューのフルOR HWMヒットを含む)

関連する問題