本文介绍了KSQL 表-表左外连接不止一次发出相同的连接结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

using KSQL, and performing left outer join, i can see the result of my join sometime emitted more than once.

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

In other words, the same join result is emitted more than once. I am not talking about, a version of the join with the null value on the right side and a version without the null value. Literally the same record that result from a join is emitted more than once.

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

I wonder if that is an expected behaviour.

推荐答案

一般的答案是肯定的.kafka 是一个至少一次的系统.更具体地说,一些场景可能会导致重复:

the general answer is yes. kafka is an at-least-once system.more specifically, a few scenarios can result in duplication:

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

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

are you seeing any such crashes/timeouts in your logs?

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

there are a few kafka features you could try using to reduce the likelihood of this happening to you:

  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 - 只是减少重复的窗口,并不能真正解决任何问题.以非常低的值产生开销.
  1. set enable.idempotence to true in your producer configs (see https://kafka.apache.org/documentation/#producerconfigs) - incurs some overhead
  2. use transactions when producing - incurs overhead and adds latency
  3. set transactional.id on the producer in case your fail over across machines - gets complicated to manage at scale
  4. set isolation.level to read_committed on the consumer - adds latency (needs to be done in combination with 2 above)
  5. shorten auto.commit.interval.ms on the consumer - just reduces the window of duplication, doesnt really solve anything. incurs overhead at really low values.

这篇关于KSQL 表-表左外连接不止一次发出相同的连接结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 00:12