Apache kafka 卡夫卡曾经是生产者和消费者

Apache kafka 卡夫卡曾经是生产者和消费者,apache-kafka,kafka-consumer-api,kafka-producer-api,Apache Kafka,Kafka Consumer Api,Kafka Producer Api,我使用Kafka作为消息代理,为一个简单的数据管道实现了一次语义。通过设置setenable.idemponence=true,我可以强制卡夫卡制作人只写一次生成的每条记录 然而,在消费方面,我需要保证消费者只读取每条记录一次(我对将消费的记录存储到外部系统或另一个卡夫卡主题不感兴趣)。为了实现这一点,我必须确保对轮询记录进行处理,并将其偏移量以原子/事务方式提交给\uu consumer\u offset主题(两者同时成功/失败) 在这种情况下,我需要借助Kafka事务API在消费者轮询循环中

我使用Kafka作为消息代理,为一个简单的数据管道实现了一次语义。通过设置set
enable.idemponence=true,我可以强制卡夫卡制作人只写一次生成的每条记录

然而,在消费方面,我需要保证消费者只读取每条记录一次(我对将消费的记录存储到外部系统或另一个卡夫卡主题不感兴趣)。为了实现这一点,我必须确保对轮询记录进行处理,并将其偏移量以原子/事务方式提交给
\uu consumer\u offset
主题(两者同时成功/失败)


在这种情况下,我需要借助Kafka事务API在消费者轮询循环中创建一个事务生产者,在该循环中,我在事务中执行:(1)处理消耗的记录,(2)在关闭事务之前提交其偏移量。在这种情况下,正常的commitSync/commitSync是否可用?

卡夫卡中只有一次的功能可以通过以下三种设置的组合来实现:

  • isolation.level=read\u committed
  • transactional.id=
  • processing.guarange=仅一次
  • 有关启用一次到位功能的更多信息:

    “在消费方面,我需要保证消费者准确地读取每条记录一次”

    Gopinath的回答很好地解释了如何在卡夫卡制作者和卡夫卡消费者之间实现一次。这些配置(加上KafkaProducer中事务API的应用)保证生产者发送的所有数据将只存储在Kafka中一次。但是,它不能保证消费者只读取一次数据。当然,这取决于您的抵销管理

    无论如何,我理解你的问题,你想知道消费者自己是如何准确地处理一条已消费的消息的

    为此,您需要以原子方式自行管理偏移量。这意味着,你需要建立自己的“交易”围绕

    • 正在从卡夫卡获取数据
    • 处理数据,以及
    • 在外部存储已处理的偏移
    commitSync和commitAsync方法不会让您走得更远,因为它们只能确保在使用者中最多处理一次或至少处理一次。此外,处理是幂等的也是有益的

    有一个很好的例子解释了这样一个实现:使用
    ConsumerBalanceListener
    并将偏移量存储在本地文件系统中。还提供了完整的代码示例

    “我是否需要借助Kafka事务API在消费者轮询循环中创建事务生产者?”

    事务API仅适用于Kafkaproducer,据我所知,无法用于您的抵销管理