【详述】 starrocks 提供的flink connector jar包,有没有遇到过使用sink时,用starrocks语义是:exactly-once 时,会丢数据
【背景】通过Flink CDC 2.2版本 + flink-connector-starrocks-1.1.10_fink-1.13 版本
【业务影响】
【StarRocks版本】1.19版本,使用更新模型
【集群规模】3fe(1 follower+2observer)+3be(fe与be混部)
【机器信息】CPU虚拟核/内存/网卡,8C/32G/万兆
【附件】
看了一下源码分析:StarRocksDynamicSinkFunction.invoke方法和flink cp快照时方法:snapshotState方法,都会调用这段代码:
在方法中flush方法,会处理调用如下方法: ,在offer方法是把取出的cp数据放入双向队列处理,在异步线程会处理队列,如图:
异步线程处理有异常会标识在 字段上,虽然该字段加了 volatile 的可见行,也能及时被捕获到,如图:
按代码逻辑来讲,invoke和snapshotState都是会调用checkFlushException异常,只要sink starrocks stream load api http请求失败,也会抛出对应的RuntimeException异常,从而让cp和invoke的方法失败,也不会丢数据;但从代码上分析,没有疑问发现任务疑问,一开始已为是字段flushException虽然加了volatile 可见性,还可能会延迟可见性,因为在dostreamApi有重试机制如图: ,要等重试次数过后才捕获到,对于cp来说,可能已完成,在cp snapshotState方法有触发清cp状态后端数据;但这一点,后面仔细查看源码,也不对成立,在cp flush调用方法,有如下代码: 这代码应该就是解决标识异常的问题的,所以,看了源码,还是没有发现可能存在的原因,请指教