Flink CDC 3.0 表结构变更时导致webUI接口无反应!
表结构变更流程可参考:Flink CDC 3.0 表结构变更的处理流程
原因:因为deliverCoordinationRequestToCoordinator
和requestJob
都是SchedulerNG
中方法,该类的线程模型是单线程执行,所以在deliverCoordinationRequestToCoordinator
执行表结构变更时,webUI
使用SchedulerNG
中方法的接口无反应!
requestJob:获得执行图信息
deliverCoordinationRequestToCoordinator:转发表结构变更等请求到协调器
解决方案:https://github.com/apache/flink-cdc/pull/3128
SchemaRegistry
(协调器)原先执行schemaChange
(在flushSuccess
方法中)是同步,现改为异步;SchemaOperate
与SchemaRegistry
(协调器)交互由同步阻塞改为轮训;具体如下
原先:SchemaOperator
调用requestReleaseUpstream
方法远程调用到SchemaRegistry
(协调器)请求释放,协调器收到请求会调用PendingSchemaChange中responseFuture.get()
方法等待;responseFuture
会在所有sink
节点flush
完成且执行完schemaChange
后设置responseFuture
为完成,最后返回结果。
新方案:SchemaOperator
调用requestReleaseUpstream
方法远程调用到SchemaRegistry
(协调器)请求释放,直接返回responseFuture
,但是返回类型是processingResponse/ReleaseUpstreamResponse
,如果是processingResponse
则一直轮训直到返回ReleaseUpstreamResponse
;