我想为我的kafka流创建交互式条件。我只想知道有可能。
示例用例是这样:
我有一些在我的kafka主题上流传的用户点击事件。用户在点击选项表中为自己定义了最小点击数,我希望在达到最小点击数时通知他们。 Kstream根据限制过滤点击次数。 Eventlistener会使用kstream输出产生的主题数据,并将通知发送给用户。
如何根据用户的持久性数据逐个定义Kstream过滤条件?当永久性数据更改时,我可以更改它吗?
答案 0 :(得分:1)
您需要创建两个主题:
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()));