集群服务器定时任务,只运行一个定时器的设计
(1)只在一台服务器上部署该定时任务代码。
(2)在定时任务代码上加上某个特定的ip限制,仅某个ip的服务器能运行该定时任务。
(3)利用数据库的共享锁事务管理机制来运行定时任务。
第一步:新建一张数据库表,表有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。
第二步:检查是否有机器正在运行定时任务。检查方法:update定时任务表的status字段为1(1为执行中,0为未执行)、ip为自己的ip,如果update失败,则证明有机器在执行该定时任务,该机器的定时任务就不执行了,成功则进行第三步。
第三步:执行定时任务的具体内容,结束还原excute字段为0。
另外:
另外:
首先,我们先在数据库建一个表:timerT,表里面有三个字段:status(表当前定时器是否处于可运行状态)、timestamp(时间戳)、serverIP(正在运行定时器的服务器IP)。
这里其具体的用法是:当两台服务器,都运行起来后,服务器A开始执行定时器,这时,A会去读取表timerT的status字段,当为0时,则执行定时器的业务逻辑,此时A定时器,需要把status改为1,以便让另一台服务器的定时器B不去执行业务逻辑并把当前服务器的IP记录到表中,同时修改启动一个新的线程,在XXX长的时间间隔内不断去修改timestamp的值,当A执行完业务逻辑时,就把status的值改为0,这样B定时器就可以执行。
这样做可以解决一个问题,就是:当其中一个定时器A挂掉后,我们另一个定时器B,可以比对timestap的值与当前时间是否超过XXX时长,如果超过,则证明定时器A已经挂掉,这时B就会把status的值改成1,把serverIP改成B定时器所在的服务器IP,并执行业务逻辑。