Apache kafka 将值发送到输出主题后清除KTable条目

Apache kafka 将值发送到输出主题后清除KTable条目,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个数据库,存储每个网页的浏览量。它通过使用一个名为pageviews的卡夫卡主题来实现这一点,其中每条消息的页面名称为键,而值为自上一条消息以来的浏览次数 这是pageviews主题中需要的消息示例: 页面浏览量主题: key: "index", value: 349 key: "products", value: 67 key: "index", value: 15 key: "about", value: 11 ... key: "index", value: <timesta

我有一个数据库,存储每个网页的浏览量。它通过使用一个名为
pageviews
的卡夫卡主题来实现这一点,其中每条消息的页面名称为
,而
值为自上一条消息以来的浏览次数

这是
pageviews
主题中需要的消息示例:

页面浏览量主题:

key: "index", value: 349
key: "products", value: 67
key: "index", value: 15
key: "about", value: 11
...
key: "index", value: <timestamp>
key: "index", value: <timestamp>
key: "product", value: <timestamp>
...
builder.stream("viewstream")
    .groupByKey()
    .aggregate(...) // this builds a KTable with the sums of views per page
    .toStream()
    .to("pageviews")
pageviews
的使用者每次将上述
值添加到pageviews表中时都会添加这些值

现在,我正在创建
pageviews
主题的制作人。此应用程序的数据源是
viewstream
主题,其中每个视图创建一条消息,如:

查看流主题:

key: "index", value: 349
key: "products", value: 67
key: "index", value: 15
key: "about", value: 11
...
key: "index", value: <timestamp>
key: "index", value: <timestamp>
key: "product", value: <timestamp>
...
builder.stream("viewstream")
    .groupByKey()
    .aggregate(...) // this builds a KTable with the sums of views per page
    .toStream()
    .to("pageviews")
我对此拓扑有两个问题:

  • 保存聚合的KTable在向
    页面视图
    生成输出消息后不会得到重置/清除,因此只需将聚合值添加到DB表中,我们就会得到错误的结果。如何使发送到
    pageviews
    的每条消息不包含以前消息中已发送的视图

  • 我希望
    pageviews
    消息每15分钟发送一次(默认速率约为每30秒一次)


  • 我正在尝试为这两个窗口设置窗口,但到目前为止我失败了。

    您可以使用15分钟的翻转窗口来实现此行为,并在窗口时间过去之前抑制结果(请记住添加宽限时间以限制上一个窗口将接受的事件的延迟)。查看详细信息。 我会这样做:

    builder.stream("viewstream")
                    .groupByKey()
                    //window by a 15-minute time windows, accept event late in 30 second, you can set grace time smaller
                    .windowedBy(TimeWindows.of(Duration.ofMinutes(15)).grace(Duration.ofSeconds(30)))
                    .aggregate(...) // this builds a KTable with the sums of views per page
                    .suppress(Suppressed.untilWindowCloses(Suppressed.BufferConfig.unbounded()))
                    .toStream()
                    //re-select key : from window to key
                    .selectKey((key, value) -> key.key())
                    .to("pageviews");
    

    谢谢你,Tuyen。我做了一个30+5秒窗口的实验,我经历的是(重置所有主题后):(a)生产者在50秒内发送100条消息,(b)拖缆正在解析所有消息,但只有30条消息被聚合和发出。其余的虽然由拖缆接收,但从未发出,尽管我等待的时间太长。是的,这是预期的行为,因为根据流时间发出消息,因此,除非有新消息传入,否则不会发出上一个窗口中的某些上一次聚合消息。在这个问题上,我有一个使用处理器API的解决方案:如果您不断收到消息,这应该不是问题