调度模型: 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操作状态保持一致,必须都处于同一个数据点上@author jianghang 2012-7-31 下午05:39:06 @version 4.1.0
|
|