Apache kafka 如何优化聚合,以便首先完成每个消费者的聚合?
我有一个名为Apache kafka 如何优化聚合,以便首先完成每个消费者的聚合?,apache-kafka,apache-kafka-streams,Apache Kafka,Apache Kafka Streams,我有一个名为input的卡夫卡主题,有多个分区 假设一条消息如下所示: { "key": 123456, "otherKey": 444, ... } input.groupBy((k, v) -> v.getOtherKey()) .windowedBy(TimeWindows.of(Duration.of(60, SECONDS))) .count() .suppress(untilWindowCloses(Suppress
input
的卡夫卡主题,有多个分区
假设一条消息如下所示:
{
"key": 123456,
"otherKey": 444,
...
}
input.groupBy((k, v) -> v.getOtherKey())
.windowedBy(TimeWindows.of(Duration.of(60, SECONDS)))
.count()
.suppress(untilWindowCloses(Suppressed.BufferConfig.unbounded()))
.toStream()
.to("output");
记录按“键”进行分区(因此同一个键将始终由同一个卡夫卡消费者进行处理)
现在我想计算每分钟每个“otherKey”的事件数。据我所知,使用如下KStreams
可以很容易地做到这一点:
{
"key": 123456,
"otherKey": 444,
...
}
input.groupBy((k, v) -> v.getOtherKey())
.windowedBy(TimeWindows.of(Duration.of(60, SECONDS)))
.count()
.suppress(untilWindowCloses(Suppressed.BufferConfig.unbounded()))
.toStream()
.to("output");
使用groupBy
,Kafka Streams将数据重新分区到内部Kafka主题,在input
主题中,每个事件对应一个事件
这对我来说似乎是浪费。它可以按“otherKey”统计每个kafka使用者(仅计算使用者的分区)中的消息,并按“otherKey”每分钟只发布一次到内部主题
有没有办法使用Kafka Streams做到这一点?您对行为的观察是正确的,您优化执行的想法也是正确的 但是,目前尚未实施此优化。原因是,
suppress()
是一个全新的操作符,在引入suppress()
之前,您描述的优化没有意义
如果您真的想进行这种优化,那么可以使用处理器API构建它