大数据开发——消息队列Kafka入门与应用(七)

150 阅读1分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。

6.3   【理解】Kafka事务编程

6.3.1  事务相关属性配置

6.3.1.1  生产者

// 配置事务的id,开启了事务会默认开启幂等性

props.put("transactional.id", "first-transactional");

6.3.1.2 消费者

// 1. 消费者需要设置隔离级别

props.put("isolation.level","read_committed");

//  2. 关闭自动提交

https://juejin.cn/editor/drafts/7063820810963648549

6.3.2  Kafka事务编程

6.3.2.1  需求

在Kafka的topic 「ods_user」中有一些用户数据,数据格式如下:

姓名,性别,出生日期

张三,1,1980-10-09

李四,0,1985-11-01

我们需要编写程序,将用户的性别转换为男、女(1-男,0-女),转换后将数据写入到topic 「dwd_user」中。要求使用事务保障,要么消费了数据同时写入数据到 topic,提交offset。要么全部失败。

6.3.2.2 启动生产者控制台程序模拟数据

创建名为ods_user和dwd_user的主题

bin/kafka-topics.sh --create --bootstrap-server node1.itcast.cn:9092 --topic ods_user

bin/kafka-topics.sh --create --bootstrap-server node1.itcast.cn:9092 --topic dwd_user

生产数据到 ods_user

bin/kafka-console-producer.sh --broker-list node1.itcast.cn:9092 --topic ods_user

从dwd_user消费数据

bin/kafka-console-consumer.sh --bootstrap-server node1.itcast.cn:9092 --topic dwd_user --from-beginning  --isolation-level read_committed

6.3.2.3 编写启动生产者控制台程序模拟数据

编写一个方法 createConsumer,该方法中返回一个消费者,订阅「ods_user」主题。注意:需要配置事务隔离级别、关闭自动提交。

实现步骤:

1. 创建Kafka消费者配置

 Properties props = new Properties();
 props.setProperty("bootstrap.servers""node1.itcast.cn:9092");
 props.setProperty("group.id""ods_user");
 props.put("isolation.level","read_committed");
 props.setProperty("enable.auto.commit""false");
 props.setProperty("key.deserializer""org.apache.kafka.common.serialization.StringDeserial  izer");
 props.setProperty("value.deserializer""org.apache.kafka.common.serialization.StringDeserializer");

2 创建消费者,并订阅 ods_user 主题

// 1. 创建消费者
    public static Consumer<StringStringcreateConsumer() {
        // 1. 创建Kafka消费者配置
        Properties props = new Properties();
        props.setProperty("bootstrap.servers""node1.itcast.cn:9092");
        props.setProperty("group.id""ods_user");
        props.put("isolation.level","read_committed");
        props.setProperty("enable.auto.commit""false");
        props.setProperty("key.deserializer""org.apache.kafka.common.serialization.StringDeserializer");
        props.setProperty("value.deserializer""org.apache.kafka.common.serialization.StringDeserializer");

        // 2. 创建Kafka消费者
        KafkaConsumer<StringString> consumer = new KafkaConsumer<>(props);
6.3.2.4  编写创建生产者代码

编写一个方法 createProducer,返回一个生产者对象。注意:需要配置事务的id,开启了事务会默认开启幂等性。

1. 创建生产者配置

Properties props = new Properties();
props.put("bootstrap.servers""node1.itcast.cn:9092");
props.put("transactional.id""dwd_user");
props.put("key.serializer""org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer""org.apache.kafka.common.serialization.StringSerializer");

2. 创建生产者对象

public static Producer<StringStringcreateProduceer() {
        // 1. 创建生产者配置
        Properties props = new Properties();
        props.put("bootstrap.servers""node1.itcast.cn:9092");
        props.put("transactional.id""dwd_user");
        props.put("key.serializer""org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer""org.apache.kafka.common.serialization.StringSerializer");

        // 2. 创建生产者
        Producer<StringString> producer = new KafkaProducer<>(props);
        return producer;
    }