定时任务的执行以及分布式锁
定时任务的执行
1. 为什么需要控制定时任务的执行?
不控制的后果:
- 浪费资源,会出现多台(比如1000台)服务器同时开始执行定时任务的情形
- 脏数据,比如出现重复插入的情况
2. 要控制定时任务在同一时间只能有一个服务器执行
怎么做?
- 分离定时任务程序和主程序,只在 1 个服务器运行定时任务。成本太大。
- 写死配置,每个服务器都执行定时任务,但是只有 ip 符合配置的服务器才真实执行业务逻辑,其他的直接返回。成本最低;但是现在服务部署不一定是单机部署了,可能进行了容器化部署,是动态IP。
- 动态配置,配置是可以轻松的、很方便地更新的(代码无需重启),但是只有 ip 符合配置的服务器才真实执行业务逻辑。问题:服务器多了、IP 不可控还是很麻烦,还是要人工修改。
- 数据库
- Redis
- 配置中心(Nacos、Apollo、Spring Cloud Config)
- 分布式锁,只有抢到锁的服务器才能执行业务逻辑。坏处:增加成本;好处:不用手动配置,多少个服务器都一样。
单机就会存在单点故障。