Kafka exactly-once 语义能不能应用在read-process场景中?
Can we apply Kafka exactly-once semantics in read-process scenario?
Kafka在read-process场景下如何保证exactly-once语义。 read 意味着我们正在从 Kafka 主题中读取并进行一些处理,然后我们正在尝试提交偏移量。
让我们假设,我们处理了消息但无法提交并且在提交之前进程崩溃了。重启后,再次尝试使用相同的消息。那么如何处理这种情况呢?这可以用 Kafka Transaction API 处理吗?
有类似的问题,但没能正确理解,也留下了很少的评论。只是想确认我的理解。
Kafka Transaction 为消费-过程-生产场景提供 EOS。这个 exactly once 过程通过由生产者而不是消费者提交偏移量来工作。即,结果的产生到 kafka 和提交消费的消息都是由 kafka 生产者(而不是单独的 kafka 消费者和生产者)完成的,它带来了恰好一次。 EOS in kafka transaction确保对于每条消费的消息,我们在kafka上只有一个结果(结果可能包含多条消息),但在失败场景下消息可能会被处理多次。
所以你不能在读取过程中实现exactly once。您可以使用的唯一解决方案是使您的消息幂等并以某种方式更改您的业务逻辑,以使重复消息没有副作用。例如:
-如果您使用数据库并在插入或处理并删除传入消息之前检查重复值,请使用重复数据删除过程。
-在某些重复影响数据库的场景中,我们可以将偏移量提交到数据库,从而在一个事务中进行数据插入和偏移量提交。
Kafka在read-process场景下如何保证exactly-once语义。 read 意味着我们正在从 Kafka 主题中读取并进行一些处理,然后我们正在尝试提交偏移量。 让我们假设,我们处理了消息但无法提交并且在提交之前进程崩溃了。重启后,再次尝试使用相同的消息。那么如何处理这种情况呢?这可以用 Kafka Transaction API 处理吗?
有类似的问题,但没能正确理解,也留下了很少的评论。只是想确认我的理解。
Kafka Transaction 为消费-过程-生产场景提供 EOS。这个 exactly once 过程通过由生产者而不是消费者提交偏移量来工作。即,结果的产生到 kafka 和提交消费的消息都是由 kafka 生产者(而不是单独的 kafka 消费者和生产者)完成的,它带来了恰好一次。 EOS in kafka transaction确保对于每条消费的消息,我们在kafka上只有一个结果(结果可能包含多条消息),但在失败场景下消息可能会被处理多次。
所以你不能在读取过程中实现exactly once。您可以使用的唯一解决方案是使您的消息幂等并以某种方式更改您的业务逻辑,以使重复消息没有副作用。例如:
-如果您使用数据库并在插入或处理并删除传入消息之前检查重复值,请使用重复数据删除过程。
-在某些重复影响数据库的场景中,我们可以将偏移量提交到数据库,从而在一个事务中进行数据插入和偏移量提交。