Kafka Streams DSL または Processor API を使用して、ウィンドウ内でレコードを並べ替える方法はあるのだろうか。
例として、次の状況を想像してください (任意の状況ですが、必要なものに似ています)。
ユーザーのクリックなど、いくつかのイベントの Kafka トピックがあります。トピックに 10 個のパーティションがあるとします。メッセージはキーによって分割されますが、各キーは一意であるため、一種のランダムな分割です。各レコードにはユーザー ID が含まれており、後でストリームを再分割するために使用されます。
ストリームを消費し、各メッセージを別のトピックに発行して、そのユーザー ID でレコードを分割します (元のストリームをユーザー ID で再分割します)。
次に、この再分割されたストリームを消費し、消費されたレコードを 10 分単位でウィンドウ化されたローカルの状態ストアに保存します。特定のユーザーのすべてのクリックは常に同じパーティションにありますが、元のトピックには 10 個のパーティションがあったため、順序は保証されません。
私は Kafka Streams のウィンドウ モデルを理解しており、その時間は新しいレコードが入ってくると進みますが、このウィンドウはイベント時間ではなく処理時間を使用する必要があり、ウィンドウが期限切れになったときにバッファリングされたものを並べ替えることができる必要がありますイベントを作成し、その順序で別のトピックに発行します。
知らせ:
イベント時間ではなく、処理時間を使用してウィンドウ内でレコードをフラッシュ/処理できる必要があります。次のクリックで時間が進むのを待ちきれません。
ウィンドウがソートされてフラッシュされるとすぐに、ストアからすべてのレコードを削除する必要があります。
アプリケーションがクラッシュした場合、(アプリケーションの同じインスタンスまたは別のインスタンスで) 回復し、特定のユーザーの新しいレコードが来るのを待たずに、処理されなかったすべてのウィンドウを処理する必要があります。
Kafka Streams 1.0.0 では処理 API でウォール クロック時間を使用できることは知っていますが、必要なものを実装する正しい方法が何であるかはわかりません (さらに重要なのは、上記の回復プロセスの要件を考慮することです)。