分布式定时任务 | 青训营笔记

134 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天

前言

什么是分布式定时任务?

把分散的,可靠性差的计划任务纳入统一的平台,并实现集群管理调度和分布式部署的一种定时任务的管理方式,就叫做分布式定时任务。

它有两层含义:

它是运行在分布式集群环境下的调度任务,同⼀个定时任务程序部署多份,则同一时刻应当只允许⼀个定时任务执行。

定时任务的拆分,就是把⼀个大的作业任务拆分为多个小的作业任务,同时执行。 分布式定时任务的意义

为什么使用分布式定时任务?主要有如下两点原因:

高可用:

单机版的定式任务调度只能在一台机器上运行,如果程序或者系统出现异常就会导致功能不可用,而这个对于一些核心系统功能来说是不可接受的。

单机性能瓶颈:单机能力毕竟有限,随着任务量的提高,始终会有单机处理不过来的情况。

分布式定时任务使用场景:

订单审核、出库、订单超时自动取消与退款

优惠券生成、发放与过期

物流信息推送与状态刷新

数据积压监控、日志监控、服务可用性探测作业

定时备份与更新数据

金融系统每天的定时结算

按月批量统计报表数据

单点定时任务的缺点:

定时任务与消息队列的区别

共同点:

异步处理:比如注册、下单事件 可用于应用解耦:不管定时任务作业还是MQ都可以作为两个应用之间的齿轮实现应用解耦 流量削峰去谷:电商大促销的时候,任务作业和MQ都可以用来平滑流量,后端系统根据服务能力定时处理订单或者从MQ抓取订单抓取到⼀个订单到来事件的话触发处理,对于前端用户来说看到的结果是已经下单成功了 不同点:

定时任务作业是时间驱动,而MQ是事件驱动;时间驱动是不可代替的,比如金融系统每⽇的利息结算,不是说利息来⼀条(利息生成事件发生)就计算一条,而是通过定时任务基于时间节点批量计算

分布式定时任务解决方案

分时方案

严格划分时间片,交替运行计划任务,当主系统宕机后,备用系统仍然工作,但是处理周期被拉长了。

缺点:周期延长了。

HA高可用方案

正常情况下主系统工作,备用系统守候,心跳检测发现主系统出现故障备用系统启动。

缺点:单一系统,不能做负载均衡,只能垂直扩展,也就是硬件层面的升级,无法做水平扩展。

多路心跳方案 采用多路心跳,做服务级,进程级的,IP和端口级别的心跳检测,正常情况是主系统工作,备用系统守候,心跳检测主系统出现故障,备用系统启动,当再次检测到主系统工作,则将执行权交回主系统。

缺点:开发比较复杂,程序健壮性要求高。

任务抢占方案

A,B两台服务器同时工作,启动需要存在一前一后,谁先启动谁率先加锁,其他服务器只能等待,他们同时对互斥锁进行监控,一旦发现锁被释放,其他服务那个先抢到,那个运行,运行前加排他锁。

优点:可以进一步实现多服务器横向扩展。

缺点:开发难度高,会出现死锁的问题。

任务轮询+抢占排队方案

每个服务器首次启动时加入队列;

每次任务运行首先判断自己是否是当前可运行任务,如果是便运行;

如果不是当前运行的任务,检查自己是否在队列中,如果不在队列中,便加入队列。

总结

今天学习到了分布式定时任务的优缺点以及其解决方案。个人感觉HA高可用方案更加优秀,但是需要复杂的程序来控制。