我创建了一个Kafka Streams应用程序,它接收来自不同主题的不同JSON对象,我想实现某种等待功能,但我不确定如何最好地实现它。
为了简化问题,我将在下一节中使用简化实体,我希望可以用它来描述问题。 因此,在我的一个溪流中,我收到了汽车物品,每辆汽车都有一个身份证。在第二个流中,我收到了人物对象,每个人都有一个车辆ID,并被分配给具有此ID的汽车。
我想从两个输入流(主题)中读取我的Kafka Streams应用程序,并使用具有相同car id的四个人来丰富汽车对象。当所有四个人都被包含在汽车对象中时,汽车对象只应转发到下一个下游处理器。
我计划为汽车创建一个输入流,为person对象创建一个输入流,将JSON数据解析为内部对象表示,将两个流合并在一起并应用" selectKey"合并流上的函数以从实体中提取密钥。 之后,我会将数据推送到自定义转换函数,该函数包含一个状态存储库。在这个转换函数中,我会将每个到达的汽车对象及其id存储在状态存储中。一旦新的人物物到达,我会将它们添加到州商店的相应汽车对象中(请忽略这里迟到的汽车的情况)。一旦有四个人在汽车对象中,我会将对象转发到下一个流函数并将汽车对象从州商店中移除。
这会是一个合适的方法吗?我不确定可伸缩性,因为我必须确保在运行多个实例时,具有相同id的car和person对象将由同一个应用程序实例处理。我会使用selectKey函数,这会起作用吗?
谢谢!
答案 0 :(得分:1)
基本设计看起来很合理。
然而,selectKey()
本身是不够的,因为transform()
(与DSL运营商相比)不会触发自动重新平衡。因此,您需要通过through()
手动重新平衡。
stream.selectKey(...)
.through("user-created-topic")
.transform(...);
https://docs.confluent.io/current/streams/upgrade-guide.html#auto-repartitioning