定时任务在分布式下的问题

image.png

分布式系统里边,定时任务会出现这个问题

比如我们这有三台机器:A1、A2、A3,它们代表我们同一个服务的三个副本,然后我们这三台机器,每台都有一个定时任务,因为它们都是同一段程序,定时任务的设置都一样,所以等时间一到,它们都会启动定时任务。一启动定时任务以后,因为将来它们要同时执行后面的上架代码,这就会导致同一个秒杀商品被重复上架3遍。

所以,我们要做的就是不应该让每个机器都执行这个定时任务,应该只让一台机器去执行

解决

image.png

我们可以加一个分布式锁,获取到锁的机器才能执行,获取不到锁的机器,可以等获取到锁的机器执行失败,再次获取锁,这样获取到了还可以执行。如果获取到锁的机器已经把这个任务执行完了,那其它机器也就不需要执行了。

幂等性保证

信号量这块,比如现在正在秒杀,由于另外一个机器,它的定时任务可能反应的比较慢,然后在秒杀期间启动了,一启动以后,本来我们这个秒杀商品已经被抢完了,结果由于那个机器的延时启动,又给它设置了一些库存,然后用户又能继续秒杀,这样就会给商家造成很大的损失。

所以在设置信号量以及那些商品数据之前,应该查询当前这个秒杀场次的商品的信息是否已经存在于缓存中,不存在才上架,已存在就不需要上架了,这也是我们锁说的幂等性保证

代码

318,秒杀上架的幂等性保证