Kafka Streams - 如何进行全局指标聚合?

时间:2017-06-26 18:48:41

标签: apache-kafka apache-kafka-streams

所以我需要一个GlobalKTable包含多个实例中多条消息的聚合。现在,我的单个实例KTable设置看起来像这样:

final KTable<String, Double> aggregatedMetrics = eventStream
        .groupByKey(Serdes.String(), jsonSerde)
        .aggregate(
                () -> 0d,
                new MetricsAggregator(),
                Serdes.Double(),
                LOCAL_METRICS_STORE_NAME);

显然,这不会扩展,因为每个实例只有它收到的消息的更新指标,而不是所有其他实例收到的所有消息。我在考虑使用它:

final KStreamBuilder builder = new KStreamBuilder();   
builder.globalTable(METRIC_CHANGES_TOPIC, METRICS_STORE_NAME);

然后只是将我的aggregatedMetrics KTable的更新流式传输到METRIC_CHANGES_TOPIC,这将更新全局表。但是,每个实例只会在每次更新全局表时覆盖其他实例的聚合。

我有什么办法可以进行全球聚合吗?

1 个答案:

答案 0 :(得分:2)

解决方案对我来说是正确的。

这听起来不正确:

  

但是,每个实例都只是覆盖其他实例&#39;每次更新全局表时的聚合。

请注意,聚合是基于密钥完成的。因此,不同的实例将聚合在不同的键上,因此,每个实例只会在GlobalKTable中更新自己的键。