flink-kafka-mysql【事务,外部管理偏移量】
有时候,因为业务的需要,我们需要保证端到端的语义一致性。那么,如果我们将kafka的偏移量外存,再辅以事务机制,即可做到端到端的语义一致性。(当然,如果可能的话,我们只需要保证min等性,也不需要这么麻烦。)
话不多说,直接上案例。
首先,需要建立一张student表,以及kafka偏移量的表。
CREATE TABLE `kafka` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`topic` varchar(11) DEFAULT NULL,
`partition` int(11) DEFAULT NULL,
`offset` bigint(20) DEFAULT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UK_topic_partition_date` (`topic`,`partition`)
) ENGINE=InnoDB AUTO_INCREMENT=263 DEFAULT CHARSET=utf8mb4;
CREATE TABLE `student` (
`id` int(11) NOT NULL,
`name` varchar(100) NOT NULL,
`pass` varchar(40) NOT NULL,
`age` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
其次,我们往kafka发送数据
package com.nuc.transaction;
import com.alibaba.fastjson.JSON;
import com.nuc.test.Student;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
*
* 往kafka写入数据
*
*/
public class TestKafkaProducer {
public static final String broker_list = "172.16.10.102:9092,172.16.10.103:9092,172.16.10.104:9092";
public static final String topic = "test1";
public static void main(String[] args) throws InterruptedException {
Properties props = new Properties();
props.put("bootstrap.servers", broker_list);
props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");
KafkaProducer producer = new KafkaProducer<String, String>(props);
for (int i = 1; i <= 10000; i++) {
Student student = new Student(i, "yrx" + i, "password" + i, 18 + i)