处理卡夫卡只处理一次边缘事件的情况

时间:2019-09-09 22:30:35

标签: apache-kafka

伙计们,   尝试使用Kafka进行POC处理消息,该实现绝对只需要处理一次。示例:as a payment system, process a credit card transaction only once

我们应该防范哪些极端情况?

here涵盖的一个失败方案是:

  

1。)如果使用者失败,并且没有承诺已读取特定偏移量,则会再次读取消息。

让我们说消费者生活在Kubernetes的Pod中,其中一位主机脱机。由于潜在的硬件问题,在吊舱消失之前,我们有可能已经处理了消息,但在Kafka中未将其标记为已处理。我是否正确理解此错误情况?

当考虑到Kafka仅做一次处理时,在生产者/消费者方面是否还有其他需要完全了解的故障情况?

谢谢!

1 个答案:

答案 0 :(得分:1)

我将基本上重复并扩展我给here的答案:

一些情况可能导致重复:

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

还有一些以数据丢失为结尾的场景-查找“不干净的领导人选举”(禁用以可用性为代价的交易)。

也-kafka“恰好一次”配置仅在所有输入,输出和副作用都发生在同一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-只是减少了重复的时间,并没有真正解决任何问题。以非常低的值产生开销。

我不得不说,作为过去几年一直维护 VERY 大型kafka安装程序的人,我永远不会使用依赖kafka进行核心交易处理的银行...