幸運の石:
私は私のカフカ・ストリームのためのインタラクティブな条件を作成します。私はちょうどそれが可能であるかを知りたいです。
例のユースケースはこれです:
私はカフカのトピックを超えるユーザーのクリックイベントその流れを持っています。ユーザーがクリックオプションテーブルで自分自身のための最小限のクリック数を定義し、私は彼らが最低限のクリック数に達したときにそれらを知らせたいです。Kstreamは制限accordingtoクリック数をフィルタリングします。イベントリスナーは、kstream出力によって生成され、ユーザに通知を送信トピックのデータを消費します。
どのように私は彼らの永続的なデータに基づいて、ユーザがKstreamフィルタ条件のユーザーを定義することができますか?永続データが変更されたとき、私はそれを変更することができますか?
バルトシュWardziński:
次の2つのトピックを作成する必要があります。
user-prefs
- キーは、ユーザIDであり、その値は、クリック数の最小値であるユーザの好み、です。(グッドプラクティスは、それが圧縮させることです)clicks
- オリジナルのクリックが送信されているトピック、キーは、ユーザIDと値は重要ではありません(一部の文字列を想定)
あなたは、ユーザの嗜好(クリックの最小数)を送信KafkaProducerを使用してuser-prefs
、彼らはあなたを変更するかどうかは、ユーザーのクリックに行く新しいメッセージを送信する必要がclicks
話題を。
あなたには、いくつかの時間(60秒)のためにそれらを集約したいとします。
まず、グループと集約クリックに持っており、最終的な結果を送信します。その後、あなたは、最終的な結果に参加しuser-prefs
、最小限のクリック数が保持されています、。フィルタは凝集クリック数およびクリック数の最小数に基づいて行われます
KStream<String, Long> clicks = builder.<String, String>stream("clicks")
.groupByKey().windowedBy(TimeWindows.of(Duration.ofSeconds(60)).grace(Duration.ofSeconds(1)))
.count(Materialized.with(Serdes.String(), Serdes.Long()))
.suppress(Suppressed.untilWindowCloses(Suppressed.BufferConfig.unbounded()))
.toStream().map((key, value) -> new KeyValue<>(key.key(), value));
KTable<String, Long> userPrefs = builder.<String, Long>table(
"user-prefs",
Consumed.with(Serdes.String(), Serdes.Long())
);
clicks.join(
userPrefs,
(userClicks, minUserClicksNumber) -> userClicks >= minUserClicksNumber,
Joined.with(Serdes.String(), Serdes.Long(), Serdes.Long())
)
.filter((userName, isSufficientNumberOfClick) -> isSufficientNumberOfClick)
.map(((key, value) -> new KeyValue<>(key, key)))
.to("output", Produced.with(Serdes.String(), Serdes.String()));