Java 定时任务在服务器集群中的实现问题
2017-01-20 本文已影响133人
囿于昼夜
针对定时任务中不同服务器易出现对同一条数据的重复处理,处理方法如下:
-
若无需考虑效率,可在 redis 中加一个锁。在定时任务开头判断锁状态,若有锁,直接 return,没有锁的话则加上锁并向下执行,在任务执行的最后删除锁。
-
若需要考虑效率就比较麻烦了,如几台服务器需要同时处理一个数据库中的数据,为了防止数据被重复处理,可做一个读取的定时任务,任务开头加锁,读取并 push 到一个 redis 队列中;再做一个处理的定时任务,pop redis 队列中的数据挨个进行处理,当 redis 队列被 pop 空以后,则把锁删掉。
但这种处理方式仍有一定的几率遇到一台服务进入读取服务判断锁状态的时候另一台服务器正好处理完最后一条队列信息把锁删掉,导致锁失效的情况。然几率较小,且未想到更好的处理方式,目前我的程序仍在这样处理。