Hi

可以看一下TwoPhaseCommitSinkFunction的实现,preCommit是在snapshotState时调用,会将当前的currentTransactionHolder存储到pendingCommitTransactions,直到notifyCheckpointComplete时(也就是commit时),将pendingCommitTransactions取出进行事务性操作。所以preCommit时候不需要写是不符合语义的。

如果借助TwoPhaseCommitSinkFunction,确实需要适当减少checkpoint 
interval,否则可能很久都没有输出,但是不建议在state较大时设置成秒级。

祝好
唐云
________________________________
From: 1900 <575209...@qq.com>
Sent: Tuesday, August 27, 2019 14:15
To: user-zh <user-zh@flink.apache.org>
Subject: 关于flink中端对端的精确一次性理解问题

根据flink端对端的定义,采用二阶段提交,flink中已经封装好了,放到TwoPhaseCommitSinkFunction中,只要实现对应的方法就行,



�C beginTransaction

�C preCommit

�C commit

�C abort



如果sink端的操作是幂等的,就不需要实现了,假设现在我要实现写入MYSQL,实现端对端精确一次性,这种情况下是不是 preCommit不需要写,
然后最终commit再提交事务?这样事务的打开时间就跟checkpoint的时间关联了,假设checkpoint时间很长,是不是意味着事务打开时间很长,有风险;
而且如果checkpoint要持续的进行着(原来假设每分钟一次checkpoint,现在要每秒一次?),不能设置间隔时间?
或者是间隔时间都算到下次checkpoint中,这样事务的打开时间更长了,请问是不是这样理解?
这样端对端精确一次性是不是效果很小?

回复