分布式定时任务需要考虑的问题
分布式定时任务问题
定时任务的多机分布会产生几个需要解决的问题:
- 多台机器的时间一致性问题
如果多台机器的时区不一致,那锁基本上无从谈起了。 或者时区一致,但可能服务器时间相差几秒钟,那么也有可能导致锁丢失。
- 锁未释放问题(服务器宕机怎么办)
那么如果serverA在加锁的过程中,出现宕机怎么办,是否会一直处于加锁状态
- 命名空间问题
每个定时任务应该有不同的锁命名,防止出现同名锁。
- 多个定时任务同时并发执行sendmail,key如何保证唯一?
可以使用实例的ip+端口做唯一key,这样能够保证多个实例的唯一性
- 两台服务器时间差超过30s怎么办?
通过中间媒介来确定时间。或者在服务器中杜绝这个问题
- 最重要的问题还是在于,两台服务器的时间有可能有细微差别,他们本身就有可能不是并发的
这一点在分布式定时任务领域里很重要。
仅仅是加了一个同步锁是远远不够的
解决方案可以是根据业务的不同来设置不同的锁超时时间,例如某个业务定时任务,每天只可以执行一次,那么将超时时间设置为1个小时最保险,如果某个定时任务每分钟执行,执行操作时间大约20s,那你可以将超时时间设置成30s。
另一个解决方案是设置一个统一的、中心级别的定时任务,任务负责派发消息,通过消息队列的方式来做定时,这里就不细表,这种方式比较适合异构、或者跨网络、跨机房级别的分布式。