公众号merlinsea
- 定时任务执行定期删除的功能背景
- 在用户已经购买的短链是有一个有效期限的,如果一旦超过了有效期限,流量包就不能使用,这种情况相当于逻辑删除,但过期的流量包 依旧存储在数据库中,这种流量包对用户而言是没有意义的,但却依旧占据着服务器端端物理内存。随着业务的发展,这种过期的流量包 的记录会占用数据库的内存资源,因此需要引入定时任务,每过一段时间对过期的流量包进行物理删除。
- 业界常用的删除手段
- 逻辑删除:这种删除是通过del标记位来判断,当del=0标识没有删除,用户可见;del=1标识已经删除,用户不可见。 优点:可以在服务器端存储用户的记录数 缺点:删除的数据依旧占据着数据库资源
- 物理删除:这种删除是直接操作数据库,将数据彻底删除,且无法恢复 优点:删除的数据将不会占据数据库的内存资源 缺点:无法恢复用户删除的数据
- 转移到日志文件归档: 将用户删除的记录存储到日志文件中,如elasticSearch 优点:删除的数据不会继续占据用户数据库,且可以恢复用户的数据,方便做行为分析。
- 定时任务的分类
- 单机定时任务:单机的容易实现,但应用于集群环境做分布式部署,就会带来重复执行,解决方案有很多比如加锁、数据库等,但是增加了很多非业务逻辑。
- 分布式调度定时任务:把需要处理的计划任务放入到统一的平台,实现集群管理调度与分布式部署的定时任务 叫做分布式定时任务 支持集群部署、高可用、并行调度、分片处理等。
- 单机分布式任务存在的问题:
- 常见的定时任务
- 单机:Java自带的java.util.Timer类配置比较麻烦,时间延后问题
- 单机:ScheduledExecutorService,是基于线程池来进行设计的定时任务类,在这里每个调度的任务都会分配到线程池里的一个线程去执行该任务,并发执行,互不影响
- 单机:SpringBoot框架自带,SpringBoot使用注解方式开启定时任务
- 启动类里面 @EnableScheduling开启定时任务,自动扫描
- 定时任务业务类 加注解 @Component被容器扫描
- 定时执行的方法加上注解 @Scheduled(fixedRate=2000) 定期执行一次
- 分布式任务调度框架
- Elastic-Job
- XXL-Job
- Quartz
- 常见的分布式定时任务框架对比
- 如何选择分布式定时任务框架?
- XXL-Job和Elastic-Job都具有广泛的用户基础和完善的技术文档,都可以满足定时任务的基本功能需求
- xxl-job侧重在业务实现简单和管理方便,容易学习,失败与路由策略丰富, 推荐使用在用户基数相对较少,服务器的数量在一定的范围内的场景下使用
- elastic-job关注的点在数据,添加了弹性扩容和数据分片的思路,更方便利用分布式服务器的资源, 但是学习难度较大,推荐在数据量庞大,服务器数量多的时候使用