一、秒级调度解决问题
基于调度平台已存在的基本功能,在业务系统使用调度表、缓存等方案,解决数据并发、实时性等问题。
1.业务系统使用调度表控制并发,调度平台会到调度表取需要执行的任务,取到任务之后更新任务表该条任务的状态,防止任务并发执行,处理完成之后将状态更新到处理状态。
2.任务执行不跳出,对于实时性要求较高的任务,等待指定时间之后继续取任务执行,不返回任务调度平台,做到准实时处理。
3.减少调度平台强依赖,调度平台只配置触发URL,没有job执行必须依赖的参数,配置简单,调度平台正常会配置一个任务组(多个任务),某一个或者几个任务由于网络、系统等原因导致假死、调用异常等,其他调度能正常处理,不影响业务。
二、组件图
调度平台介绍:对各业务系统中的定时任务集中进行管理和调度。所有任务、触发规则统一在调度控制台定义、管理、删除;集中解决了集群环境下任务并发执行的控制;对任务调度执行情况的监控和异常短信告警、重试机制;提供跨业务系统的后继任务调度。
三、任务调度表模型设计
任务调度表的目的是存放要执行的任务组,有执行状态、分库、分表等,每次调度执行前要先更新执行状态,避免并发,调度平台也有调度并发的控制,但是由于网络、发布等原因,无法精确判断业务是否实际执行,需要在业务系统控制。
字段名 | 描述 |
JOB任务组名称 | 调度的任务组名,调度平台发起调度请求要传改名称,然后从该表获取要处理的分库、分表 |
执行状态 | 0:待处理,1:处理中 |
更新时间 | 存放执行状态变更时间 |
待处理表名 | 调度任务要扫描的表名称,用于备注,任务框架主要使用分库分表 |
分库号 | 待处理表或者业务表数据量很大,要拆分到多个库多张分表,用于提高查询性能,例:1,3,5;就代表要处理1分库、3分库、5分库 |
分表号 | 例:0,5,10;代表要处理0分表、5分表、10分表 |
调度平台的调度任务名 | 调度平台每次调度,调度任务名(存redis) |
调度应用ip | 存本次调度的执行应用ip,用于分析问题(存redis) |
四、设计方案(非多活环境)
存在的问题:频繁查询db,使用redis优化
JOB在处理任务时,需要加载任务到任务队列中,但每次都需要查库,不走缓存,查询次数也相当频繁,对数据库的性能有一定的影响。
将秒级job进行优化,原本秒级job每次加载完redis待处理队列,处理完以后再次加载每次都会去查数据库。优化过后会将待处理的job任务加载到redis中,每次读取redis,并修改redis中的处理状态,不再去操作数据库。
五、优化后方案(支持多活环境)
直接看图,已很详细。