4

これについていくつかの質問を見てきましたが、満足のいく答えはありませんでした。この質問、zeromq pattern: 配信が保証された pub/subは特に似ていますが、同じ効果を達成するために他の zeromq メカニズムを使用してもかまいません。

私の質問は、ZeroMQ のパブリッシャー-サブスクライバーのようなファンアウト パターンで、メッセージが確実に配信されるようにメッセージを送信する方法はありますか? ゼロコピーのディーラーでも問題ないように見えますが、pub-sub よりもはるかに面倒です。より良いオプションはありますか?より多くのコードを書かなければならない以外に、この方法でそれを行うことの欠点は何ですか?

これが必要な理由:

インストルメンテーションからのデータを分析するコードを書いています。計測器に接続するモジュールは、他のモジュールが分析できるように、データを他のモジュールにブロードキャストできる必要があります。次に、分析されたデータを出力モジュールにブロードキャストする必要があります。

一見、ZeroMQ を使用した pub-sub はこの仕事に最適のように見えましたが、いずれかのサブスクライバーの速度が低下して最高水準点に達すると、メッセージがドロップされます。このシステムの場合、イベントの連続性のために、一部のモジュールでのみメッセージがドロップされることは許容されません。すべてのモジュールは、意味のある出力を得るためにイベントを分析する必要があります。ただし、イベントのメッセージを受信したモジュールがない場合は問題ありません。このため、分析モジュールの 1 つが最高水準点に達した場合は、パブリッシャー (インストルメンテーション モジュール) をブロックしてもかまいません。

別の方法として、見逃したメッセージを事後に処理することも考えられますが、それは後で破棄されるイベントの処理時間を浪費するだけです。

編集:これについてさらに考えてみると、inproc を使用してスレッド間で通信しているため、現在、送信されたメッセージ = メッセージが配信されることを期待しています。ただし、TCP 経由でメッセージを送信すると、ZeroMQ が意図的にドロップしなくても、メッセージが失われる可能性があります。これは、ブロック送信を使用している場合でも、ドロップされたメッセージに対処する必要があるということですか? inproc でのメッセージ配信に関する保証はありますか?

4

3 に答える 3

0

この質問は検索エンジンで出てくるので、更新したかっただけです。

PUB ソケットを使用しているときに、ZeroMQ がメッセージをドロップしないようにすることができます。ZMQ_XPUB_NODROP オプションを設定すると、送信バッファがいっぱいになったときに代わりにエラーが発生します。

その情報を使用して、ここで説明したようにデッド レター キューのようなものを作成し、その間にスリープ状態で再送信を試行し続けることができます。

この問題を効率的に処理することは、ZeroMQ の送信バッファーがいっぱいでなくなったときに通知を受ける方法がないように見えるため、現時点では不可能である可能性があります。キューに再び空きができたので、メッセージを公開できます。

于 2021-09-06T02:07:06.343 に答える