异步任务执行框架taskd

为什么叫taskd

因为是异步执行的任务啊。
希望把任务的 发送 - 调度 - 执行 解耦开来,taskd主要解决的就是调度部分。不仅可以按时回调(提醒)客户端服务,并且提供足够的信息用于客户端服务执行任务。同时还提供很多方便常用的功能,比如任务取消,任务监控。为任务的调度提供足够的灵活性。

为什么要开发这个框架

在业务开发过程中经常有定时执行的需求,比如用户设置了下午三点要开会,那我就需要两点半给他发送一个提醒的短信。当前有类似的框架可以处理这类延迟请求,比如ruby on rails有个active job,python有个celery,他们都挺好用的,但是都不够通用,因为他们都是绑定语言的。我需要有一个跨语言和框架的实现。另外,还要提供查询,管理,监控等一站式功能。

适用场景

需要执行定时任务,当前的框架又不够reliable和transparent。需要的不仅仅是正常情况下可用,还要在出错的情况下提供足够的信息快速排查错误。

集成

服务端提供web管理和数据存储服务,客户端提供client

1, 通过消息队列异步请求/回调

发布延迟回调请求
订阅回调请求
消费
发送回调
客户端
消息队列
服务器

客户端发送回调请求至消息队列,服务器接收请求,等到预定时间,发送回调请求至消息队列,客户端执行定时任务。好处是客户端和服务端完全解耦。

2,同步请求/回调

发布延迟回调请求
回调请求
客户端
服务器

客户端和服务器端通过http请求通信,好处是省掉了消息队列的依赖,但是缺点也很明显,需要服务器和客户端网络互通并且客户端还要提供一个http端点。

管理

server提供web界面,在页面上可以执行如下操作
1,展示 configurations
2,crud tasks,包括每个task的生命周期
3,backfill 部分tasks
4,暂停执行部分tasks
5,限流,黑白名单
6,配置metrics
7,系统当前状态,比如依赖的redis或者database是否正常,最近的错误是什么

客户端能力

1,发送定时请求
2,取消定时请求
3,update or create 定时任务

定制化能力

关于task所有变更数据都会发送到es
定制metrics发送到statsd

task 生命周期

1, pending
2, running
3, done
4, dead
5,cancelled
6,blocked
7,backfilling

task一旦创建,就处于pending状态,当预定运行时间到的时候,就会处于running状态,此时就会执行回调逻辑(写入kafka或者回调http callback服务),如果成功,就会处于done状态,如果失败5次,就会处于dead状态。用户可以通过web管理界面cancel或者block一个或者多个pending task,使task处于cancelled或者blocked状态(意味着不会再被运行)。当一个cancelled或者dead的task正处于backfilling的时候,它的回调逻辑会被重新执行。当用户取消定时请求或者update or create 定时任务的时候也会使之前的任务处于cancelled状态

road map

第一期,client实现异步发送和回调(kafka)

  1. 定义客户端和服务器端通信的protobuf
  2. 根据protobuf生成可供调用的java代码
  3. 实现客户端发送和接收消息
  4. 服务器端实现简单回调,没有储存功能,并且是单线程,简单sleep 5s后发送消息至kafka
  5. 完善客户端sdk,增加example(使用ConditionalOnProperty和命令行参数)

第二期, client实现同步发送和回调(http)

  1. server端实现post接口,依然没有存储功能,只是简单sleep 5s后回调客户端提供的接口
  2. 客户端实现发送和回调(需要一个http端口)
  3. 完善客户端sdk,增加example(使用ConditionalOnProperty和命令行参数)

第三期,server实现存储功能

  • server将数据写入db
  • 实现cancel的请求
  • 实现update or create 请求
  • 记录记录回调日志
  • 同步task生命周期至es, index名字可以设置为taskd -【service】-【date】
  • 接入redis实现task的按时间排名
  • 多进程安全,平滑扩容

第四期,接入statsd

  • server自己的metrics,围绕task的生命周期,提供宏观的数据并且图表和报警模板
  • 允许用户自定义metrics并且发送到statsd

第m-n期,实现admin管理功能

TODO

你可能感兴趣的:(taskd)