可从不同的应用程序ID访问的QueryableStore

时间:2019-05-26 14:23:15

标签: apache-kafka kafka-consumer-api apache-kafka-streams

我有一个应用程序,它消耗所有用户活动作为流,例如,我想统计一下他看到主页的次数等等。我将计数具体化到一个持久的键值存储中。我想从其他应用程序访问此键值存储并从该存储中获取数据,因为我想通过其余端点共享这些统计信息。有可能吗?

2 个答案:

答案 0 :(得分:2)

  

我想从其他应用程序访问此键值存储并从该存储中获取数据,因为我想通过其余端点共享这些统计信息。有可能吗?

是的,这是可能的。该功能在Kafka Streams中称为interactive queries。还有一个名为Kafka Music的演示应用程序,您可以以此为起点。

您的第一个应用程序使用Kafka Streams连续计算状态,并且还需要提供诸如REST / Thrift / ...之类的第二个应用程序可以查询的API。您的第二个应用程序可以是任何东西:它可以是Python应用程序,JavaScript应用程序,甚至可以是curl之类的命令行工具-不必是另一个Kafka Streams应用程序。

您必须使用喜欢使用的任何REST工具等,手动实现第一个应用程序的“ API”,就像需要实现REST API的任何其他Java应用程序一样。通过上述interactive queries功能,Kafka Streams提供了所有必要的方法,可通过您自己的DIY API挖掘和公开Kafka Streams状态存储中的数据。 (Kafka Streams故意不提供“ REST API”或“ gRPC API”等本身,因为开发人员之间的需求通常大不相同。)

答案 1 :(得分:0)

您无法访问其他应用程序的状态存储。

您可以将汇总结果发送到主题,第二个应用程序将在该主题(aggregationResults)上建立自己的状态存储

汇总应用程序:

builder.<String, String>stream("input")
    .groupByKey(Grouped.with(Serdes.String(), Serdes.String()))
    .windowedBy(TimeWindows.of(Duration.ofMinutes(5)).grace(ofSeconds(10)))
    .aggregate(
        () -> "",
        ((key, value, aggregate) -> "")
    )
    .suppress(Suppressed.untilWindowCloses(unbounded()))
    .toStream().to("aggregationResults");