私は分散システムを研究していて、この古い質問に言及しています: stackoverflow link
完全に1回、最低1回、および最高1回の保証の違いを本当に理解できません。これらの概念をKafka、Flink、およびStormで読み、Cassandra。誰かがFlinkは1回だけの保証があるのでより良いと言いますが、Stormは少なくとも1回しかありません。
ワンスモードはレイテンシには優れていますが、同時にフォールトトレランスには劣ると理解しています。重複していない場合、ストリームをどのように回復できますか?そして、これが本当の問題であるなら、なぜ1回限りの保証が他の保証よりも優れていると考えられるのでしょうか。
誰かが私により良い定義を与えることができますか?
以下の定義は Akka ドキュメントから引用されています
一度だけ配信
メカニズムに渡されるメッセージごとに、そのメッセージは0回または1回配信されます。よりカジュアルな言葉で言えば、メッセージが失われる可能性があることを意味します。
at-least-oncedelivery
メカニズムに渡されるメッセージごとに、少なくとも1つが成功するように、配信時に複数の試行が行われる可能性があることを意味します。繰り返しになりますが、これは、よりカジュアルな言い方をすると、メッセージが複製されても失われることはないことを意味します。
正確に1回配送
メカニズムに渡されるメッセージごとに、受信者に対して正確に1つの配信が行われることを意味します。メッセージは失われたり複製されたりすることはありません。
最初の方法は、送信側またはトランスポートメカニズムの状態を維持せずに、ファイアアンドフォーゲット方式で実行できるため、最も安価で、パフォーマンスが高く、実装オーバーヘッドが最小です。 2番目の方法では、トランスポート損失に対抗するために再試行が必要です。これは、送信側で状態を維持し、受信側で確認応答メカニズムを持つことを意味します。 3番目は最も高価であり、結果として最悪のパフォーマンスになります。これは、2番目に加えて、重複した配信を除外するために受信側で状態を維持する必要があるためです。
Flinkはこれらの用語を使用して、イベントがアプリケーションの状態に与える影響について説明します。毎日のウィンドウでタグApache-flinkを使用して、stackoverflowへの投稿をカウントしようとしているとします。私が正確に1回の保証で作業している場合、各投稿は正確に1回カウントされ、失敗があったとしても、分析は100%正確になりますそれを実現するには、方法と一部のデータを再処理する必要があります。 Flinkはこれをグローバルに一貫したスナップショットとストリーム再生の組み合わせで実現します。 少なくとも1回の場合、エラーが発生すると、一部の投稿が2回カウントされる可能性がありますが、すべての投稿がパイプラインによって分析されることが保証されます。また、を最大で1回使用すると、障害が発生した場合にスナップショットが作成されず、再生も行われません。
正確性とフォールトトレランスの点では1回だけが最適ですが、レイテンシが少し増えるという犠牲が伴います。
このテーマのより詳細な扱いについては、データアーティザンからのこのブログ投稿を参照してください- Apache Flink™による高スループット、低遅延、正確に1回のストリーム処理 -および Flinkの内部のドキュメント 。
ここ は読む価値のあるアグレッシブな記事です。
私はあなたの質問に答えようとします:
すべて(またはほとんど)のCloud Computing Patterns
は簡潔に説明されています。私はあなたにそれを本当にお勧めします、見てみましょう: http://www.cloudcomputingpatterns.org
正確に1回の配信
多くの重要なシステムでは、重複メッセージは受け入れられません。メッセージングシステムは、重複する可能性のあるメッセージを自動的にフィルタリングすることにより、各メッセージが1回だけ配信されるようにします。
At-least-once Delivery
メッセージが失われたり、回復に時間がかかりすぎるような障害が発生した場合、メッセージは再送信され、少なくとも1回は確実に配信されます。