Kafka3.x核心速查手册二、客户端使用篇-7、生产者消息事务

本文介绍了Kafka如何通过生产者消息事务确保批量消息的一致性,保证同一批次的消息要么全部成功写入,要么全部失败。在启用幂等性基础上,KafkaProducer提供了初始化事务、开始事务、提交事务和放弃事务的API。同时,文章提到了消费者端实现消息幂等性的挑战,并建议在业务逻辑中确保幂等性,例如通过交易ID检查消息是否已处理过。
摘要由CSDN通过智能技术生成

​ 通过Kafka的幂等性特性,可以保证单条消息的数据安全性。而在此基础上,Kafka还为批量消息的数据安全性,设计提供了消息事务功能。**Kafka的生产者消息事务,是保证同一批次的多条消息,可以同时保证同时写入成功或者同时写入失败。**注意:要使用生产者消息事务,需要先保证幂等性功能是开启的。

​ 这涉及到KafkaProducer的几个API:

// 1 初始化事务
void initTransactions();
// 2 开启事务
void beginTransaction() throws ProducerFencedException;
// 3 提交事务
void commitTransaction() throws ProducerFencedException;
// 4 放弃事务(类似于回滚事务的操作)
void abortTransaction() throws ProducerFencedException;

​ 对于单个Producer,可以通过生产者事务机制保证这一批消息刚好发送一次。

public class TransactionProducer {
    private static final String BOOTSTRAP_SERVERS = "worker1:9092,worker2:9092,worker3:9092";
    private static final String TOPIC = "disTopic";

    public static void main(String[] args) {
        Properties properties = new Properties();
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, BOOTSTRAP_SERVERS);
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        // 设置事务 id(必须),事务 id 任意起名,建议包含一定的业务唯一性
        properties.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "order_1");

        KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(properties);
        // 初始化事务
        kafkaProducer.initTransactions();
        // 开启事务
        kafkaProducer.beginTransaction();
        try {
            for (int i = 0; i < 5; i++) {
                kafkaProducer.send(new ProducerRecord<>(TOPIC, "Message " + i));
            }
            // 提交事务
            kafkaProducer.commitTransaction();
        } catch (Exception e) {
            // 终止事务
            kafkaProducer.abortTransaction();
        } finally {
            kafkaProducer.close();
        }
    }
}

​ 对于幂等性这个话题,再延伸到消费者端。其实Broker与消费者端是有消息重试机制的,所以要保证消费者端的消息幂等性,是比较困难的。通常,主要还是在消费者端的业务逻辑中自行保证业务幂等性。比如,对于转账交易消息,可以通过交易ID先去后端判断一下消息有没有处理过。如果已经处理过,就放弃这条消息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

roykingw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值