异步任务执行框架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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
针对任务依赖的任务系统可以使用有向无环图(DAG)来表示,并且可以使用拓扑排序来解决任务之间的依赖关系。 以下是一个简单的C#代码示例,用于实现基于DAG的任务系统: ```csharp using System; using System.Collections.Generic; class Task { public string Name { get; set; } public List<Task> Dependencies { get; set; } public Action Action { get; set; } public bool IsCompleted { get; set; } public Task(string name, Action action) { Name = name; Action = action; Dependencies = new List<Task>(); IsCompleted = false; } public void AddDependency(Task dependency) { Dependencies.Add(dependency); } public void Execute() { Action(); IsCompleted = true; } } class TaskSystem { private List<Task> tasks; public TaskSystem() { tasks = new List<Task>(); } public void AddTask(Task task) { tasks.Add(task); } public void Execute() { List<Task> readyTasks = new List<Task>(); // 将没有依赖任务任务添加到 readyTasks 列表中 foreach (Task task in tasks) { if (task.Dependencies.Count == 0) { readyTasks.Add(task); } } // 不断执行 readyTasks 列表中的任务,并将其从任务列表中删除 while (readyTasks.Count > 0) { Task task = readyTasks[0]; readyTasks.RemoveAt(0); task.Execute(); // 将所有依赖于该任务任务的依赖列表中移除该任务 foreach (Task dependent in tasks) { dependent.Dependencies.Remove(task); } // 将没有依赖任务任务添加到 readyTasks 列表中 foreach (Task dependent in tasks) { if (dependent.Dependencies.Count == 0 && !dependent.IsCompleted) { readyTasks.Add(dependent); } } } } } // 示例用法 Task taskA = new Task("Task A", () => Console.WriteLine("Task A is completed.")); Task taskB = new Task("Task B", () => Console.WriteLine("Task B is completed.")); Task taskC = new Task("Task C", () => Console.WriteLine("Task C is completed.")); Task taskD = new Task("Task D", () => Console.WriteLine("Task D is completed.")); taskB.AddDependency(taskA); taskC.AddDependency(taskB); taskD.AddDependency(taskA); taskD.AddDependency(taskC); TaskSystem taskSystem = new TaskSystem(); taskSystem.AddTask(taskA); taskSystem.AddTask(taskB); taskSystem.AddTask(taskC); taskSystem.AddTask(taskD); taskSystem.Execute(); ``` 该代码示例中,我们定义了一个 Task 类来表示每个任务,其中包含任务名称、依赖任务列表、任务动作和是否已完成等属性。我们还定义了一个 TaskSystem 类作为任务系统,负责管理任务列表和执行任务。 在 Execute 方法中,我们首先将没有依赖任务任务添加到 readyTasks 列表中。然后,我们不断从 readyTasks 列表中取出任务执行,同时将所有依赖于该任务任务的依赖列表中移除该任务。最后,我们再将没有依赖任务任务添加到 readyTasks 列表中,直到任务列表中没有任务时停止执行。 在示例用法中,我们定义了四个任务,并设置它们之间的依赖关系。然后,我们将这些任务添加到任务系统中并执行。该代码输出的结果是: ``` Task A is completed. Task B is completed. Task C is completed. Task D is completed. ``` 这表明任务系统成功地按照任务依赖关系有序地执行了这些任务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值