KSQL Table-Table左外部Join多次发出相同的联接结果

时间:2019-09-11 19:45:44

标签: apache-kafka ksql

使用KSQL并执行左外部联接,我可以看到有时联接发出的联接结果不止一次。

换句话说,相同的联接结果被发射多次。我不是在谈论在右侧具有null值的联接版本和没有null值的版本。从字面上看,一次联接产生的同一记录会发出多次。

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

1 个答案:

答案 0 :(得分:2)

一般答案是肯定的。 kafka是至少一次的系统。 更具体地说,某些情况可能导致重复:

    消费者仅定期检查自己的位置。消费者崩溃可能导致重复处理某些范围或记录 生产者有客户端超时。这意味着生产者可能会认为请求已超时,而在代理方实际上确实成功了,则重新传输。
  1. 如果您在kafka群集之间镜像数据,通常是通过某种生产者+消费者对完成的,这可能导致更多重复。

您是否在日志中看到任何此类崩溃/超时?

您可以尝试使用一些kafka功能来减少发生这种情况的可能性:

  1. 在生产者配置中将enable.idempotence设置为true(请参阅https://kafka.apache.org/documentation/#producerconfigs)-会产生一些开销
  2. 在生成时使用事务-产生开销并增加延迟
  3. 在生产者上设置transactional.id,以防您跨机器故障转移-大规模管理变得复杂
  4. 在使用者上将isolation.level设置为read_committed-增加延迟(需要与上述2结合使用)
  5. 缩短使用者的auto.commit.interval.ms-只是减少了重复的时间,并没有真正解决任何问题。以非常低的值产生开销。