整体架构图
项目目录
setl分析
整体Uml类图
增量同步接口调用逻辑图
Select
详细流程分析(基于内存和canal)
调度模型
1. 正常运行调度流程
假如并行度为3
----------------------------------------------------------->时间轴
| ProcessSelect
--> 1
--> 2
-->3
--> 1
| ProcessTermin
---> 1 ack
----> 2ack
---> 3ack
a. ProcessSelect拿到数据后,丢入pool池进行异步处理,并通知ProcessTermin顺序接收termin信号
b. 同一时间在s/e/t/l流水线上的数据受并行度控制,满了就会阻塞ProcessSelect,避免取过多的数据,只会多取一份,等待其中一个s/e/t/l完成
c. ProcessTermin接受到termin信号
i. 会严格按照发出去的batchId/processId进行对比,发现不匹配,发起rollback操作.
ii. 会根据terminType判断这一批数据是否处理成功,如果发现不成功,发起rollback操作
2. 异常调度流程
假如并行度为3
|-->1 --> 2 -->3(ing)
a. 当第1份数据,ProcessTermin发现需要rollback,此时需要回滚2,3份数据的批次. (可能第2,3份数据还未提交到s/e/t/l调度中)
i. 如果2批次数据已经提交,等待2批次termin信号的返回,此时需要阻塞ProcessSelect,避免再取新数据
ii. 如果第2批次数据未提交,直接rollback数据,不再进入s/e/t/l调度流程
b. 当所有批次都已经处理完成,再通知ProcessSelect启动 (注意:这里会避免rollback和get并发操作,会造成数据不一致)
3. 热备机制
a. Select主线程会一直监听mainstem的信号,一旦抢占成功,则启动ProcessSelect/ProcessTermin线程
b. ProcessSelect/ProcessTermin在处理过程中,会检查一下当前节点是否为抢占mainstem成功的节点,如果发现不是,立马停止,继续监听mainstem
c. ProcessSelect进行get数据之前,会等到ProcessTermin会读取未被处理过termin信号,对上一次的selector进行ack/rollback处理
i. 注意:ProcessSelect进行get数据时,需要保证batch/termin/get操作状态保持一致,必须都处于同一个数据点上
细节解析
1、select是如何保证同步?
select始终只有一个子线程来拉数据,不像etl会同时创建多个线程。单线程肯定是同步的
2、select如何控制并发度?
使用阻塞队列,初始化的时候在阻塞队列创建固定并发度数量的资源:
后续都通过load线程来进行生产/消费
Extract
执行步骤
Transform
执行步骤
1、