如何在单个分区的kafka主题上运行ktable-ktable的多个应用程序实例加入kafka流应用程序?

时间:2019-01-27 08:04:47

标签: apache-kafka-streams spring-cloud-stream spring-kafka

KTable<Key1, GenericRecord> primaryTable = createKTable(key1, kstream, statestore-name);
KTable<Key2, GenericRecord> childTable1 = createKTable(key1, kstream, statestore-name);
KTable<Key3, GenericRecord> childTable2 = createKTable(key1, kstream, statestore-name);

primaryTable.leftJoin(childTable1, (primary, choild1) -> compositeObject)
            .leftJoin(childTable2,(compositeObject, child2) -> compositeObject, Materialized.as("compositeobject-statestore"))
.toStream().to(""composite-topics)

对于我的应用程序,我使用的是KTable-Ktable连接,这样,只要在主流或子流上接收到数据,就可以使用三个表的setter和getter将它设置为CompositeObject。这三个传入的流具有不同的键,但是在创建KTable时,我将所有三个KTable的键都设为相同。

我的所有主题都只有一个分区。当我在单个实例上运行应用程序时,一切运行正常。我可以看到CompositeObject填充了所有三个表中的数据。 传递recordID和本地状态存储名称也可以很好地运行所有交互式查询。

但是当我运行同一应用程序的两个实例时,我看到带有主要和child1数据的CompositeObject,但是child2仍然为空。即使我尝试使用交互式查询对statestore进行调用,它也不会返回任何内容。

我正在使用spring-cloud-stream-kafka-streams库编写代码。

请提出未设置该设置的原因是什么,以及应该采用哪种正确的解决方案。

1 个答案:

答案 0 :(得分:2)

Kafka Streams的缩放模型与输入主题分区的数量相关。因此,如果您的输入主题是单个分区,则无法向外扩展。输入主题分区的数量决定了您的最大并行度。

因此,您将需要创建具有更高并行度的新主题。