【问题标题】:KSQL Table-Table Left outer Join emit same join result more than onceKSQL Table-Table Left outer Join 多次发出相同的连接结果
【发布时间】:2020-01-13 16:34:33
【问题描述】:

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

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

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

【问题讨论】:

    标签: apache-kafka ksqldb


    【解决方案1】:

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

    1. 消费者只定期检查他们的位置。消费者崩溃可能会导致重复处理某些范围或记录
    2. 生产者有客户端超时。这意味着生产者可能认为请求超时并在代理端实际成功时重新传输。
    3. 如果您在 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 - 只是减少了重复窗口,并没有真正解决任何问题。以非常低的值产生开销。

    【讨论】:

    • 为什么设置“exactly_once”为加工保证不能解决?
    • "ksql.streams.processing.guarantee": "exactly_once"
    • @MaatDeamon - 没有魔法,只有开销。该设置将(如果我正确阅读文档)简单地设置我上面为受 ksql 控制的所有生产者和消费者提供的所有配置。请注意,即使在官方文档中 - docs.ksqldb.io/en/latest/concepts/processing-guarantees/… - 您也会被警告要真正获得一次,即使是 ksql 控制之外的上游/下游客户端也需要正确配置。并且您应该真正衡量性能影响与 dups 的损害
    猜你喜欢
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多