C#调度管理工具(1) 调度的设计

 

最新有新的需求,需要写一个调度管理工具. 借鉴之前有用过 Yan Bin 的 调度管理器 DispatcherV2, 其中的 一些设计原理 我大致整理了一下.

 windows 计划任务 

 

 

  计划任务 扩展

 调度的时候 我们可能需要做一些额外的事情,比如 检查网络,写运行日志,动态设置[执行参数]

 

调度计划执行时间和频次

1.每隔几分钟/几小时/几天 运行一次 

2.每周几 运行一次

3.每月多少号运行, 或者 月末最后一天运行

 

调度的执行类型

1. 一次性任务

    比如验证一下执行工具 逻辑是否正确,运行一次之后, 就停.

2.永久性任务

   比如  抓取博客园首页内容,每隔一段时间就要运行

 

列举在实际生产中的调度模型

 

例子1.:数据同步, 同步到别的业务库,别的业务,或者数据仓库

          于是设定 每一小时运行一次

 

例子1.:数据同步,基本上只有周一到周五,早上8点到晚上10点 会产生数据, 晚上是休息时间,产生的数据可以第二天再同步

          于是设定 每一小时运行一次, 并且同步时间窗口设定在  6:00-22:30  (这里为什么设置22:30 而不是 22点, 是有原因的,后面再讲)

 

例子2.:一周运行2次,  要考虑周一到周五 信息会比较密集, 周六周天相对数据比较稀松,

          于是设定 每周3运行一次, 每周6 运行一次 ,配置了2个 调度.

 

例子3: 每月初就要查看xx信用分,数据量比较大,计算也需要时间

          于是设定, 每月最后一天20:00:00 进行任务调度,(程序优化后,大概需要执行2个小时, 随着数据量的扩充, 5年的增量数据, 3小时内基本也能跑完)

 

例子4:调度工具本身也是一个定时任务,每隔一段时间执行一次 

          调度工具自己没法自启动,所以 配置在windows计划任务 里面, 每5分钟运行一次,如果前面的任务没有执行完,则不产生新的任务.

 

基于以上实际业务, 分析需求, 设定业务字段

单个调度

1.   任务执行的 有效日期和 过期日期 EffectivityTime 和 ExpirationTime  , 开始时间可以写2000-01-01, 结束时间 2099-01-01

2.   频率类型 (FreequencyType)   例如  天 (Daily) /周 (Weekly) /月 (Monthly)

3.   频率间隔 (FreequencyInterval)  ,如果设置 的是 Weekly 值是 1-7,表示周一到周日;Monthly 表示 月的第几天 比如1-31号,如果是月的最后一天, 设置为-1

4.   只执行一次的时间 (DailyTimeOnce) , time 类型, 'HH:mm:ss'  ;  DailyTimeOnce 和 DailyHourInterval,DailyMinuteInterval 这三个值是互斥关系

5.   每隔几个小时执行 DailyHourInterval

6 .  每隔几分钟执行 DailyMinuteInterval

7.   窗口执行时间 DailyTimeWindow    ; null 是不指定, 其他值 要求5位时间 ,比如9点 写  09:00:00-10:00 

8.   设定执行超时时间 Timeout,  单位 秒, 

9.   设定如果执行出错,允许重试次数, Retry , 为0 表示 出错后不重试 

10. 设定重试等待时间 Wait ,单位秒 ,建议设置为30-60秒之间 

 

多个调度 

 调度和调度之间也会有关联关系,比如后面的 任务 必须等待 前面的 调度执行完(并且成功) 以后才执行, 任务调度之间是有 依赖的

11.  依赖项 WorkerDependancy:  格式用, 分隔 , 例如 Worker01,Work02 

12.  并行调度优先级 Priority  , 数字越大 优先级越低,从 0 到 999 

 

其他通用调度项设置

13.  调度唯一标识 WorkerID

14.  调度名称,WorkerName 用哪种类型的调度, 比如 执行SSIS,  运行WebAPI

15.  调度分组 WorkerGroupID  同一个 WorkerGroupIdD 会被认为是一个整体, 也就是说 如果 WorkerGroup 有至少一个没有执行成功,那么下一个时间点就不会生成这个 WorkerGroup  的所有任务

16.  调度执行的唯一标识  DispatcherID  , 在 调度配置中可以根据不同的调度策略配置不同的调度组.比如 性能差一点的机器 我就配置 20个 Worker 调度, 性能好的机器 就配置50个 Worker 等等.

 

17.  标记业务 名称,用的是那个业务模块 ApplicationName  ,比如 "新浪微博爬虫程序"

18.  标记调度任务所有者 Owner  ,  多人协作时,谁负责的这个调度模块,出了问题找谁 ,  比如 "张三"

 

posted @ 2021-09-11 09:53  兴想事成  阅读(388)  评论(0编辑  收藏  举报