【问题标题】:Update state in a Kafka stream chain without using Kafka Streams in an EOS way在不以 EOS 方式使用 Kafka Streams 的情况下更新 Kafka 流链中的状态
【发布时间】:2020-08-17 23:05:32
【问题描述】:

我目前正在使用 Kafka 而不是 Kafka 流库来部署分布式流处理链。我创建了一种节点,可以执行并将主题作为输入,处理获得的数据并将其发送到输出主题。该节点是一个简单的消费者/生产者对,与唯一的上游分区相关联。生产者是幂等的,处理是在事务上下文中完成的,例如:

producer.initTransaction();
try
{
        producer.beginTransaction();

        //process

        producer.commitTransaction();
}
catch (KafkaException e)
{
        producer.abortTransaction();
}

我还使用了producer.sendoffsetstotransaction 方法来确保消费者的原子提交。 我想使用键值存储来保持节点的状态(我正在考虑使用看起来很简单的 MapDB)。

但我想知道如果我用map.put(key, value) 更新我在事务中的状态,例如,事务会确保状态将被更新一次吗?

非常感谢

【问题讨论】:

    标签: apache-kafka process stream eos


    【解决方案1】:

    Kafka 对其组件只承诺一次——即,当我将 X 生成到输出主题时,我也会将 X 提交到输入主题。要么都成功,要么都失败 - 即原子。

    因此,无论您在消费和生产之间做什么,都完全由您自己来确保准确一次。除非你使用 Kafka 本身提供的 state-store。如果您使用 Kafka-streams,您可以使用它。

    如果您无法切换到 kafka 流,如果您在 mapDB 中跟踪 kafka 的偏移量并添加足够的检查,仍然可以自己确保恰好一次。

    例如,假设您在这里尝试进行重复数据删除,

    这只是一种做事方式 - 假设您在 mapDB 中放入的任何内容都会立即提交。即使没有,您也可以随时查阅“真相来源”(即此处的主题)并重建丢失的数据。

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 1970-01-01
      • 2021-10-11
      • 2021-10-16
      • 2020-06-02
      • 2022-10-06
      • 2020-07-09
      • 2019-07-14
      • 1970-01-01
      相关资源
      最近更新 更多