如何控制任务在多节点环境幂等执行

383 阅读1分钟

在实际开发中我们往往会需要在固定时间点触发任务, 但是在多节点情况下, 我们应当如何避免定时任务重复调度呢. 接下来介绍几种处理方式

1. 通过配置配置文件开关控制

在每个服务的配置文件里面, 都设置了开关, 只有开的哪一个才会执行任务

伪代码
yml enable.task = ture

if(task) {
    // 开启了才执行
}

这种方式只适合比较小的系统, 不够灵活

2. 通过分布式锁的方式进行控制

通过Redis分布锁, 哪一个jvm获得到锁, 就让其执行, 其他的都不执行

boolean lock = redisTemplate.tryLock(key, 10);
if(lock) {
    // 抢到锁了, 才执行
}

3. 通过分布式定时任务调度

例如 xxl-job 等工具, 服务通过注册到xxl注册中心上, 然后通过取模的形式进行处理

4. 分片处理

单独为跑批建立一个单独的服务, 对于数据量特别大的情况, 可以对服务进行集群, 
然后将数据进行分片, 例如按照id进行均摊到各个机器上面, 在各个机器中,
在利用多线程进行处理, 从而让处理时间大幅度提升