Kafka Streams等待函数与依赖对象

时间:2018-02-05 11:42:50

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

我创建了一个Kafka Streams应用程序,它接收来自不同主题的不同JSON对象,我想实现某种等待功能,但我不确定如何最好地实现它。

为了简化问题,我将在下一节中使用简化实体,我希望可以用它来描述问题。 因此,在我的一个溪流中,我收到了汽车物品,每辆汽车都有一个身份证。在第二个流中,我收到了人物对象,每个人都有一个车辆ID,并被分配给具有此ID的汽车。

我想从两个输入流(主题)中读取我的Kafka Streams应用程序,并使用具有相同car id的四个人来丰富汽车对象。当所有四个人都被包含在汽车对象中时,汽车对象只应转发到下一个下游处理器。

我计划为汽车创建一个输入流,为person对象创建一个输入流,将JSON数据解析为内部对象表示,将两个流合并在一起并应用" selectKey"合并流上的函数以从实体中提取密钥。 之后,我会将数据推送到自定义转换函数,该函数包含一个状态存储库。在这个转换函数中,我会将每个到达的汽车对象及其id存储在状态存储中。一旦新的人物物到达,我会将它们添加到州商店的相应汽车对象中(请忽略这里迟到的汽车的情况)。一旦有四个人在汽车对象中,我会将对象转发到下一个流函数并将汽车对象从州商店中移除。

这会是一个合适的方法吗?我不确定可伸缩性,因为我必须确保在运行多个实例时,具有相同id的car和person对象将由同一个应用程序实例处理。我会使用selectKey函数,这会起作用吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

基本设计看起来很合理。

然而,selectKey()本身是不够的,因为transform()(与DSL运营商相比)不会触发自动重新平衡。因此,您需要通过through()手动重新平衡。

stream.selectKey(...)
      .through("user-created-topic")
      .transform(...);

https://docs.confluent.io/current/streams/upgrade-guide.html#auto-repartitioning