1、定时任务请求业务代码
1.1 没有锁的情况下
如下图:
问题场景
在没有锁的情况下,同时3个线程(3台微服务)同时进行执行同一个
上架商品
的业务代码,这时会将同一个商品上架三次导致错误
解决方式
引入锁机制,将3个请求锁住,只让一个线程进入执行
1.2 使用分布式锁 Redisson
如图:
代码实现
@Autowired
RedissonClient redissonClient;
private final String upload_lock = "race:upload:lock";
/**
* 将录入price的race上架到redis中(根据开始时间-结束时间)
*/
public void uploadRace(){
// 获取 锁
RLock lock = redissonClient.getLock(upload_lock);
// 分布式锁:锁定10秒,等待业务代码执行的时长
lock.lock(10, TimeUnit.SECONDS);
try{
// 执行业务代码
// 这里输入你要执行的方法
}finally {
lock.unlock();
}
}
1.3 对比
如果定时任务需要拆分多个服务,一定要记得加上分布式锁