TwoPhaseCommitSinkFunction二阶段提交

1,什么是二阶段提交?

TwoPhaseCommitSinkFunction

Flink 已经为我们提供了实现 Exactly-Once 的 FlinkKafkaProducer 类。如下图所示:它实现了 TwoPhaseCommitSinkFunction类,并重写了其中的方法,通过 2PC (Two Phase Comit) 二阶提交的方式,实现了 Exactly-Once。
在这里插入图片描述
       使用关系型数据库 MySQL,开启 CheckPoint 机制的前提下,为了保证前一次 CheckPoint 成功后到这次 CheckPoint 成功之前这段时间内的数据不丢失,如果执行到一半过程任务失败了,从而导致前一次CheckPoint成功后到任务失败前的数据已经存储到了MySQL,然而这部分数据并没有写入到 CheckPoint。如果任务重启后,前一次CheckPoint成功后到任务失败前的数据便会再次写入MySQL,从而导致数据重复的问题。这种情况,便使用到了 TwoPhaseCommitSinkFunction类,以此来实现 MySQL 关系型数据库的二阶提交。

 

2,需要什么条件?

sink对象需要支持事务,很可惜大部分都不支持,那怎么办呢?

目前解决方案就是不停重复的写,或者写入缓存,或者写入外部。

JBDC案例:

Flink 是一个流处理框架,支持在流处理任务中使用事务。而在事务处理中,最常用的是 2PC (Two-Phase Commit) 协议。Flink 在实现 2PC 时,通常需要和外部存储系统协作,比如 MySQL、Kafka 等。 对于 MySQL,Flink 提供了官方的 JDBC Connector,可以通过 JDBC 连接 MySQL 数据库。而在使用 JDBC Connector 时,需要使用 Flink 提供的实现了 2PC 协议的 SinkFunction,即 TwoPhaseCommitSinkFunctionTwoPhaseCommitSinkFunction 的代码实现中,会在 preCommit() 方法中打开 MySQL 的事务,并在 invoke() 方法中执行数据插入操作。如果数据插入成功,会调用 preCommit() 方法的 prepareCommit() 方法来提交事务。如果数据插入失败,则会调用 preCommit() 方法的 abort() 方法来回滚事务。 需要注意的是,如果在 preCommit() 方法中打开了事务,但在 invoke() 方法中抛出了异常,则 TwoPhaseCommitSinkFunction 会自动回滚事务。也就是说,在 TwoPhaseCommitSinkFunction 中不需要显式地处理异常。 总体来说,使用 Flink 实现 2PC 协议提交 MySQL 数据库的过程,可以分为以下几个步骤: 1. 实现 TwoPhaseCommitSinkFunction 接口,并实现其中的 preCommit()、commit()、abort() 方法; 2. 在 preCommit() 方法中打开 MySQL 的事务; 3. 在 invoke() 方法中执行数据插入操作; 4. 如果数据插入成功,调用 preCommit() 方法的 prepareCommit() 方法来提交事务; 5. 如果数据插入失败,则会自动回滚事务。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值