在Spring Kafka中实现批量事件的Exactly-Once处理

问题描述 投票:0回答:1

我正在开发一个 Spring Kafka 应用程序,我在其中为主题 A(列表<'Sms>)生成批量事件。目标是实现整个流程的Exactly-once处理,包括Topic A的消费、处理、生产到Topic B的一一处理(Sms)。我对此有几个问题:

  1. 生产者端:为了确保生产者的一次性交付,我启用了幂等生产(enable.idempotence=true,transactional_id_config =“transaction-event-id”)和事务。此设置对于为主题 A 生成批量事件是否正确?

  2. 消费者端:在消费者端,我使用isolation.level=read_comfilled来消费消息,以确保只处理已提交的消息。这足以实现一次性处理吗?

  3. 对外部服务(Sms-Sender 微服务)的 REST 调用:处理后,我对外部服务(Sms-Sender 微服务)进行 REST 调用。如何确保此外部调用的至少一次语义或默认值是恰好一次?我是否应该考虑记录日志(将每个成功的剩余调用写入数据库并检查事件是否存在不调用)和重复数据删除策略或者是否有推荐的方法?

java apache-kafka spring-kafka kafka-consumer-api
1个回答
0
投票

如果您不使用 Kafka Streams,而是单独使用生产者/消费者,则需要进一步考虑:

  1. 使用厂家前请致电

    producer.initTransactions();
    。它将帮助您的生产者做好交易使用的准备。提到的配置有效。

  2. 对于消费者,您还需要定义

    enable.auto.commit=false
    才能手动提交偏移量。当消费者轮询消息时,处理结果和偏移量应该存储在原子操作中,否则可能无法正常工作。例如,如果消息处理结果需要发送到另一个主题,那么您应该在同一个事务中从消费者端发送带有偏移量的消息。

  3. 实际的方法取决于您如何在 SMS Sender 服务端处理请求。

我可以建议下一个简单的方法:

每条消息都分配有唯一的 UUID,SMS 发送服务将能够检查该消息是否之前已被看到并决定要做什么。如果已经发送 - 那么可能会返回 OK 并且不执行任何操作,否则在失败的情况下重试发送。

注意: 请参阅具有良好 Kafka 消息保证解释和实现细节的来源:https://medium.com/@andy.bryant/processing-guarantees-in-kafka-12dd2e30be0e

© www.soinside.com 2019 - 2024. All rights reserved.