背景
我们很多应用都是以集群方式存在,但有些操作无法并发进行,如某些定时扫描表的任务等,需要控制并发,否则容易造成重复处理。
方案
当前我们微服务基本都已接入consul,因此使用Consul的Key/Value的Acquire/Release机制来实现。
Spring Cloud
@Autowired
private ConsulClient consulClient;
CheckTtl checkTtl = new CheckTtl("ttlLock" + lockKey, consulClient); Lock lock = new Lock(consulClient, lockKey, checkTtl);//Lock是自定义的
try { //是否阻塞,阻塞时轮询间隔,最大重试次数 if (lock.lock(true, 500L, null)) { // 处理业务逻辑 }
} finally {
lock.unlock();
}
然后使用lock即可。
不同的lockKey表示不同的锁对象。像定时任务的简单互斥,直接lock.lock(false,null,null)判断返回为true时才处理定时任务就行了。