Kafka流的交互式条件

时间:2019-03-15 13:19:20

标签: java spring spring-boot apache-kafka apache-kafka-streams

我想为我的kafka流创建交互式条件。我只想知道有可能。

示例用例是这样:

我有一些在我的kafka主题上流传的用户点击事件。用户在点击选项表中为自己定义了最小点击数,我希望在达到最小点击数时通知他们。 Kstream根据限制过滤点击次数。 Eventlistener会使用kstream输出产生的主题数据,并将通知发送给用户。

如何根据用户的持久性数据逐个定义Kstream过滤条件?当永久性数据更改时,我可以更改它吗?

1 个答案:

答案 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()));