说明
假设我们已经通过交互式表格,将数据存入了数据库,下一步我们需要让数据变成任务执行起来。本篇讨论将一条普通的数据变为任务需要怎么做。
内容
1 必要的字段
要发布为任务,数据本身需要包含足够的信息,然后端能够依据信息发布任务。有可能数据字段的命名是比较随意的,因此要首先确认后端认可的字段,然后为每个场景建立一套映射。
必要的字段:
字段 | 作用 |
---|---|
task_id | 辨识任务的唯一id |
task_type | 任务类型 |
task_para | 任务实例化的参数,可以是一个离散值,或者是一个哈希值(真实的值放在para_dict里) |
execute_type | 执行类型。是一次性的或者是周期性的,又或者是run_until_success的。 |
cron_para | 一个无歧义的文字规范,背后对应的是预先尺寸好的cron参数 |
is_active | 用于交互任务的状态, 1代表用户激活, 0代表用户去激活, -1代表任务执行异常(错误) |
可选的字段:
字段 | 作用 |
---|---|
start_time | 任务的开始时间 |
end_time | 任务的结束时间 |
ttl | 超时秒数 |
max_retries | 最大重试次数 |
2 转换为任务 - 巡查任务(worker)
首先需要一个基础的巡查任务来了解当前任务系统的状态,巡查任务要判断:
- 1 检查是否有新来的任务。(is_active=1, is_claimed not exist)
- 2 检查已有的任务是否要删除。(is_active =0, is_claimed = 1, is_done = 0)
2.1 新任务的发布
对必要的任务字段进行检查,判断这是否是一个可以发布的任务。如果is_active=1
,并且is_claimed
字段不存在,那么这就是一个新的任务。巡查任务会把这条任务增加is_claimed=0
,从而将任务发布为定时任务。
2.2 任务的删除
如果发现is_active=0
且is_claimed = 1, is_done = 0
, 意味着用户要求删掉任务,并且该任务属于被认领未完成的状态(还在任务队列中)。这时巡查任务会把任务从活动的列表中删掉。
2.3 任务的再确认
这个模式主要应用于服务挂掉重启的情况。任务会检查所有已发布未完成的任务处于任务列表中is_active =1, is_claimed = 1, is_done = 0
3 任务类型
任务类型可以分为两种:
- 1 定时任务
- 2 通用计算任务
定时任务强调的是在某个时间执行,或者按照一定规则重复的执行;通用计算任务则是不带时间属性,ASAP的执行(通用计算任务可能是扁平的,也可以是层级式的)。
一般来说,定时任务是比较「轻」的任务,主要是进行IO或者简单的分析,scheduler
主要是进行单进程的异步处理。如果定时任务比较重,那么就定时任务就变为了一个发布通用计算任务的任务。总之不要把太占cpu的任务给到定时任务。
通用计算任务可以放在队列或者数据库里,由多个worker(多核,甚至多机)去执行。
这里暂时只讨论定时任务。
4 实现
我基于表格式交互、动态任务系统做了一个可以定时的memos服务,实测好用。通过前端的表格可以直接编辑和控制,管理可定时执行并获取的反馈的任务。
4.1 表格式交互
交互式表格的前端使用datatables
,后端使用mongo
, 连接使用jquery
。
4.2 任务类型
通过4个巡查任务和一个实际的任务(period_remind
)来实现这个功能。
4.2.1 巡查任务1:处理用户提交的变动
当用户提交变动时,会为对应的memo记录设置is_fetched=0
, 这个巡查任务就是提取这样的数据,送到具体的任务表中time_task
中,然后将is_fetched
置为1。特别地,当用户提交的is_active=0
时,该巡查任务会把对应任务表中的is_enable置为0
4.2.2 巡查任务2:发布新任务
周期性检查当前任务表time_task
中未被认领(is_claimed=0
) 且状态为有效(is_enable=1
)的任务, 将提交发布实际的处理和通知任务。
4.2.3 巡查任务3:删除任务
周期性检查当前任务表time_task
中被置为无效的任务(is_enable=0
),将记录删除。
4.2.4 巡查任务4:确保任务(特别是重启时)
周期检查应当在实际活动列表中的任务(is_claimed=1
并且is_enable=1
),如果不在的画就将该条记录的is_claim置为0
,这样巡查任务2就可以在下一个周期发现并执行。
4.2.5 实际任务:处理和通知
对每种任务A,B, C,D,E
进行对应的处理,并根据指定通信方式email, msg
进行邮件或者短信通知。
转载:https://blog.csdn.net/yukai08008/article/details/115656620