0

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

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

        //process

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

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

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

非常感谢

4

1 回答 1

0

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

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

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

例如,假设您在这里尝试进行重复数据删除, 在此处输入图像描述

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

于 2020-08-27T10:13:31.010 回答