Kafka Producer之事务性

文章目录

  • [1. 跨会话幂等性失效](#1. 跨会话幂等性失效)
  • [2. 开启事务](#2. 开启事务)
  • [3. 事务流程原理](#3. 事务流程原理)

事务性可以防止跨会话幂等性失效,同时也可以保证单个生产者的指定数据,要么全部成功要么全部失败,不限分区。不可以多个生产者共用相同的事务ID。

1. 跨会话幂等性失效

幂等性开启后,broker会对每个分区记录生产者状态,并且生产者具有PID,消息被标记为PID加上序列号,数据重复和有序都是在其基础之上运作的。

生产者重启等因素会导致PID变化,导致幂等性短暂失效。

2. 开启事务

因为事务是基于幂等性的,所以幂等性的配置都要有。

java 复制代码
package org.dragon.producer;

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.HashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;

public class KafkaProducerTransactionTest {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        //创建producer
        HashMap<String, Object> config = new HashMap<>();
        config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:19092");
        config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        //配置acks等级
        config.put(ProducerConfig.ACKS_CONFIG, "-1");
        config.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, true);
        config.put(ProducerConfig.RETRIES_CONFIG, 5);
        // 把buffer改小一点,让测试数据组成更多batch
        config.put(ProducerConfig.BATCH_SIZE_CONFIG, 5);
        config.put(ProducerConfig.REQUEST_TIMEOUT_MS_CONFIG, 3000);
        // 事务ID
        config.put(ProducerConfig.TRANSACTIONAL_ID_CONFIG, "my-tx-id");

        KafkaProducer<String, String> producer = new KafkaProducer<String, String>(config);
        //初始化事务
        producer.initTransactions();

        try {
            // 开启事务
            producer.beginTransaction();
            for (int i = 0; i < 10; i++) {
                //创建record
                ProducerRecord<String, String> record = new ProducerRecord<String, String>(
                        "test2",
                        "" + i,
                        "我是你爹" + i
                );
                //发送record
                Future<RecordMetadata> send = producer.send(record, new Callback() {
                    @Override
                    public void onCompletion(RecordMetadata recordMetadata, Exception e) {
                        System.out.println("回调信息:消息发送成功");
                    }
                });
                System.out.println("发送数据");
                send.get();
            }
            // 提交事务
            producer.commitTransaction();
        }catch(Exception e) {
            // 中止事务
            producer.abortTransaction();
            e.printStackTrace();
        }finally{
            //关闭producer
            producer.close();
        }
    }
}

3. 事务流程原理

  1. 查找联系事务管理器

  2. 根据设置的TRANSACTIONAL_ID_CONFIG计算PID,计算方式为哈希值%分区数量

  3. 初始化事务

  4. 将涉及到的分区信息发送给事务管理器,方便事务管理器管理和监控这些分区的事务状态。

  5. 生成数据,发送数据到对应Broker

  6. 对应Broker把分区信息发送给事务管理器,为了确认哪些分区确实已经收到了事务中的消息

  7. 对应Broker返回ACKS

  8. 生产者发起结束事务的请求

  9. 修改事务状态为准备提交

  10. 事务管理器将事务标记为成功或者失败,并通知对应broker。

  11. 修改事务状态为已提交

相关推荐
heimeiyingwang23 分钟前
【架构实战】分布式事务TCC模式:两阶段提交的工程艺术
分布式·架构
WhoAmI26 分钟前
Elasticsearch实战指南:构建实时全文检索系统
elasticsearch·kafka
GIS数据转换器40 分钟前
蓄能电力大数据监管平台
大数据·人工智能·分布式·数据挖掘·数据分析·智慧城市
zhangzeyuaaa1 小时前
Kafka 核心原理超通俗详解|Offset、消费组、分区、持久化一次讲透
分布式·kafka
隔壁阿布都1 小时前
Kafka `acks` 参数取值全解
分布式·kafka
卷毛迷你猪1 小时前
小肥柴的Hadoop之旅 快速实验篇(0-1)虚拟机模拟完全分布式环境搭建
大数据·hadoop·分布式
飞火流星020271 小时前
Hadoop3.1.1集群+Hive3.1.0环境安装
大数据·hadoop·分布式·hadoop3.1.1集群安装·hive3.1.0安装
Shota Kishi2 小时前
解析 Solana 网络结构:通过领导者调度、验证者分布与质押集中度理解分布式区块生产
分布式·web3·去中心化·区块链
科技AI训练师2 小时前
2026年清虹分布式坐席系统如何破局技术内卷与运维成本困局
运维·分布式
三声三视2 小时前
Electron + 鸿蒙分布式投屏:PC 端一键推送画面到鸿蒙设备全实战
分布式·electron·harmonyos·鸿蒙·桌面