2016-10-28 7 views
0

ボルトの一つであり、3本のボルトからフェイル()の場合は嵐のリプレイによって発生するイベントの重複を処理する方法 - Aは、B、Cの私はスパウトSとのトポロジを持って

ボルトAから読み取りますSpout S. Bolt Aは、データをボルトBとCに分割します(いくつかのフィルタに基づいて)。ボルトBおよびCはそれぞれのデータシンクを有する。

私はStormのアンカーリングとタプルをボルトAにアンカーし、その後、ボルトBのackは成功しましたが、ボルトCは失敗()します。 Spout SでStormが再生すると、Bのイベントが重複してBのデータシンクに入りますか?

もしそうなら、嵐の信頼性のアンカー機能を使用している間にそれを避ける方法は何ですか?

答えて

0

ストームのアンカー機能は、少なくとも一度の処理のみをサポートしており、障害発生時に重複を処理するサポートはありません。あなたのアプリケーションのセマンティクスにもよるが、これは問題であるかもしれないし、そうでないかもしれない。

たとえば、後で等冪演算を行う場合、重複は問題ではありません(偶数演算の例は、キー値ストアの更新です。重複のために2つの演算がある場合は、キーの状態値のストアは依然として同じです)。

偶数以外の操作があり、重複が問題になる場合は、自分が所有しているかどうかを気にしてみることもできますが、これは正しく行うのが非常に難しいです。

代わりに、正確に一度の保証を提供する低レベルAPIではなく、Trident APIを使用できます。

または、最後の手段として、別のシステムを使用します。これは、まったく意味のないセマンティクスをすぐに提供します。

+0

ありがとう@Matthias。タプルをアンカーした後は、Stormで再生メカニズムがデフォルトで使用されていますか?または、ack()メソッドとfail()メソッドをオーバーライドして自分でコードを作成する必要がありますか? – figaro

+0

独自のspoutを実装する場合は、ack()とfail()を実装する必要があります。 (ストームは既に、「out-of-the-box」だけで使用できる、いわゆる「信頼できるスパウト」を提供しています。)もちろん、スパウトがフォールトトレラントであることを確認し、タプルを再発行する必要がありますfail()が呼び出されたときに、spoutが間に失敗したとしても。さらに、spout内でemitを呼び出すときにメッセージIDを割り当てる必要があります。 –

関連する問題