多任务分布式并发处理

1、 不同步,任务入库持久化前一次性分配好,根据一定的规则将任务与主机关联,如前10个给主机1,接下来10个给主机2。。。,每个任务处理时间有不可预知性,导致分配不均,有些主机早早就歇着,有些还在忙碌。

2、 程序同步,主机处理完一个任务主动从任务池里取下一个任务,需要在master主机程序里维持一个队列LinkedBlockingQueue(或PriorityBlockingQueue),任务数据如果过大内存无法一次全部缓存,需要定期往队列补充任务或在队列消耗到某阀值时从数据库补充任务。

3、 数据库同步,利用数据库行锁,参考quartz集群处理

select * from qrtz_locks where LOCK_NAME='job_access' for update

第一个窗口执行后有返回

多任务分布式并发处理_第1张图片

第二个窗口执行后将一直处于等待,等待第一个会话释放锁,先锁住job_access行,等待对job表处理结束提交后,其他主机才可对job表进行操作

多任务分布式并发处理_第2张图片

    qrtz_locks表只有一列LOCK_NAME,会话得到锁后从未完任务中任取一个,任务状态设为处理中,然后commit释放锁。

    也可利用表的排他锁lock table tabA in exclusive mode


你可能感兴趣的:(分布式,同步,行锁)