これについていくつかの質問を見てきましたが、満足のいく答えはありませんでした。この質問、zeromq pattern: 配信が保証された pub/subは特に似ていますが、同じ効果を達成するために他の zeromq メカニズムを使用してもかまいません。
私の質問は、ZeroMQ のパブリッシャー-サブスクライバーのようなファンアウト パターンで、メッセージが確実に配信されるようにメッセージを送信する方法はありますか? ゼロコピーのディーラーでも問題ないように見えますが、pub-sub よりもはるかに面倒です。より良いオプションはありますか?より多くのコードを書かなければならない以外に、この方法でそれを行うことの欠点は何ですか?
これが必要な理由:
インストルメンテーションからのデータを分析するコードを書いています。計測器に接続するモジュールは、他のモジュールが分析できるように、データを他のモジュールにブロードキャストできる必要があります。次に、分析されたデータを出力モジュールにブロードキャストする必要があります。
一見、ZeroMQ を使用した pub-sub はこの仕事に最適のように見えましたが、いずれかのサブスクライバーの速度が低下して最高水準点に達すると、メッセージがドロップされます。このシステムの場合、イベントの連続性のために、一部のモジュールでのみメッセージがドロップされることは許容されません。すべてのモジュールは、意味のある出力を得るためにイベントを分析する必要があります。ただし、イベントのメッセージを受信したモジュールがない場合は問題ありません。このため、分析モジュールの 1 つが最高水準点に達した場合は、パブリッシャー (インストルメンテーション モジュール) をブロックしてもかまいません。
別の方法として、見逃したメッセージを事後に処理することも考えられますが、それは後で破棄されるイベントの処理時間を浪費するだけです。
編集:これについてさらに考えてみると、inproc を使用してスレッド間で通信しているため、現在、送信されたメッセージ = メッセージが配信されることを期待しています。ただし、TCP 経由でメッセージを送信すると、ZeroMQ が意図的にドロップしなくても、メッセージが失われる可能性があります。これは、ブロック送信を使用している場合でも、ドロップされたメッセージに対処する必要があるということですか? inproc でのメッセージ配信に関する保証はありますか?