Storm の場合、低レベルの Java API を使用してすべてのロジックを UDF コードに入れる必要があります (Trindent が役立つとは思えません)。私は Samza と仕事をしたことがないので、それについて何の助けも提供できません (または、どのシステムがあなたの問題により適しているかを判断することもできません)。
たとえば、Storm では、 の各タプルにタイムスタンプを割り当て、Spout.nextTuple()
Bolt 内の未完了の支払いのすべてのタプルをタイムスタンプの降順でバッファリングできます。が呼び出されるたびBolt.execute()
に、新しいタプルのタイムスタンプをキューの先頭 (つまり、最も古いタプル) と比較できます。入力タプルのタイムスタンプが head-T に X を加えたものよりも大きい場合、head タプルがタイムアウトしたことがわかり、トリガーを発生させることができます。
もちろん、fieldsGrouping()
同じ支払いに属するすべてのタプルが同じ Bolt インスタンスによって処理されるようにする必要があります。また、受信ボルト タプルをタイムスタンプでいくらか並べ替えるか、より高度なタイムアウト ロジックを使用して順不同のタプルを処理する必要がある場合もあります (タイムスタンプの増加に関して)。
レイテンシ要件と入力ストリーム レートによっては、「ティック タプル」を使用して、ヘッド タプルとこのダミー ティック タプルの比較をトリガーすることもできます。または、これまで以上に厳密な実装として、このすべてのロジックを直接実行しSpout.next()
ます (支払いのすべてのタプルが同じ Spout インスタンスを通過することがわかっている場合)。