Apache kafka KSQL表左外部联接多次发出相同的联接结果

Apache kafka KSQL表左外部联接多次发出相同的联接结果,apache-kafka,ksqldb,Apache Kafka,Ksqldb,通过使用KSQL并执行左外连接,我可以多次看到连接的结果 换句话说,相同的联接结果会多次发出。我不是说,连接的一个版本在右边有空值,另一个版本没有空值。从字面上讲,连接产生的同一条记录被多次发出 我想知道这是否是一种预期的行为 一般的答案是肯定的。卡夫卡是一个至少有一次的系统。 更具体地说,有几种情况可能导致重复: 消费者只会定期检查他们的位置。消费者崩溃可能会导致某些范围或记录的重复处理 生产者有客户端超时。这意味着生产者可能认为请求超时并在代理端实际成功时重新传输 如果在kafka集群之间镜

通过使用KSQL并执行左外连接,我可以多次看到连接的结果

换句话说,相同的联接结果会多次发出。我不是说,连接的一个版本在右边有空值,另一个版本没有空值。从字面上讲,连接产生的同一条记录被多次发出


我想知道这是否是一种预期的行为

一般的答案是肯定的。卡夫卡是一个至少有一次的系统。 更具体地说,有几种情况可能导致重复:

  • 消费者只会定期检查他们的位置。消费者崩溃可能会导致某些范围或记录的重复处理
  • 生产者有客户端超时。这意味着生产者可能认为请求超时并在代理端实际成功时重新传输
  • 如果在kafka集群之间镜像数据,这通常是由生产者+消费者对完成的,这可能会导致更多的重复
  • 您是否在日志中看到任何此类崩溃/超时

    您可以尝试使用一些卡夫卡功能来降低发生这种情况的可能性:

  • 在producer配置中将
    enable.idemptence
    设置为true(请参阅)-会产生一些开销
  • 在生成时使用事务-会产生开销并增加延迟
  • 在生产商上设置
    transactional.id
    ,以防跨机器的故障转移变得复杂,难以大规模管理
  • 在使用者上设置
    isolation.level
    read\u committed
    -增加延迟(需要与上述2项结合使用)
  • 缩短消费者的
    auto.commit.interval.ms
    ——只是减少了重复窗口,并不能真正解决任何问题。以非常低的值产生开销

  • 为什么将“精确一次”设置为处理担保无法解决此问题?“ksql.streams.processing.guarance”:“精确一次”@MaatDeamon-没有魔法,只有开销。该设置(如果我正确阅读了文档)只需为ksql控制下的所有生产者和消费者设置我上面提供的所有配置。请注意,即使在官方文档中,您也会被警告,要真正获得一次,即使是ksql控制之外的上游/下游客户机也需要正确配置。您应该真正衡量DUP对性能的影响和损害