从source 到 flink的exactly-once 文章很多自己看。
问题来源于群里一个人的提问。
flink运算结果在落地的时候怎么保证exactly-once。
目前两种方式,
1、一种是利用幂等性。
举例说明,假设现在 要把mysql的数据同步到oracle。有Insert记录和update记录。怎么保证oracle中结果是正确的 。oracle中加一个主键。那么多次Insert的时候 由于主键的存在 最终结果是正确的。
对于多次 Update, 在数据有序的情况下 , 多次Update 最终结果 也是正确的。对于同一个id hash到同一个 kafka分区来保证 数据的有序。
2、第二种呢方法是利用事务性, 关系型数据库大多是支持事务的。如果要写入 es这样不支持事务的 存储器里边怎么办。
可以将flink的汇总数据写入 kafka,目前kafka的连接器是支持事务的,这个估计也就是为什么做实时数仓的要将汇总数据写入kafka的原因之一。 之后可以利用 ELK的ack机制来保证exactly-once 。