飞道的博客

Python 全栈系列94 - 数据任务化

241人阅读  评论(0)

说明

假设我们已经通过交互式表格,将数据存入了数据库,下一步我们需要让数据变成任务执行起来。本篇讨论将一条普通的数据变为任务需要怎么做。

内容

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=0is_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
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场