当运行两个实例时,即使密钥存在于kafka流中的本地Ktable中,密钥的元数据也是错误的



在将记录聚合到Ktable中时,我遇到了一个奇怪的问题。我的系统中有以下场景。

  1. 有两个kafka流应用程序在不同的节点上运行(具有相同的应用程序id,但具有不同的应用程序服务器配置(。

  2. 这两个流都侦听相同的主题模式,其中记录由键(字符串值(分区。

  3. 每当两个应用程序都在运行时,一些分区由app-1消耗,一些分区则由app-2消耗,这是正常的。然后,他们建立了自己的本地州立商店。

  4. 我有一个grapql查询系统,它允许您查询键,并在本地表或另一个远程实例中获取其值。

  5. 问题是,当我查询一个键的元数据时,它给了我错误的hostInfo(即使该键由实例一处理,它也显示它具有实例二的hostInfo(。但是,当我在实例一的本地状态存储中查询该键的值时,我可以看到该键确实存在。(只是密钥的元数据是错误的(

  6. 这种行为对于两种情况下的密钥来说都是随机的(有些密钥指向正确的元数据,而有些则不指向(

  7. 我已经登录了state listener,它告诉我是否正在进行再平衡。但是,当记录流式传输或我查询时,我必须确保不会发生再平衡。

  8. 我面临的问题与此类似。Kafka Streams中的metadataForKey方法为连接到同一组的多个应用程序实例提供了错误的信息

  9. 此外,当我查询本地状态存储中的所有键时,我可以看到该键存在。

有人知道是什么原因导致了这个问题吗?请

你好,这里的问题是我通过自己的自定义逻辑发送Kafka主题,用于记录分区,而没有使用Kafka提供的默认实现。在流方面,它使用默认的分区逻辑计算密钥的元数据,这导致了错误的元数据。所以,我所要做的就是用我在kafka端使用的相同逻辑来实现我自己的自定义分区器,并使用该逻辑来计算元数据。

相关内容

最新更新