Skip to content

EasyGraph: 支持配置化的高并发多策略的动态DAG引擎

Notifications You must be signed in to change notification settings

Aur1anna/EasyGraph

Repository files navigation

EasyGraph: 支持配置化的高并发多策略的动态DAG引擎

实现思路

第一步 实现Kahn方法:

  1. 实现一个基于入度的拓扑排序方法,最小堆
  2. 实现一个就绪队列ReadyQueue,用于将入度为0放入其中

第二步 实现调度逻辑

  1. 实现线程池
  2. 从 ReadyQueue 取出一个 node id交给线程池执行: node.process()、执行完成时通知其所有下游节点 indeg–-、如果 indeg=0 则将其入队 ReadyQueue
  3. 主线程等待所有任务执行完成

第三步 一个支持配置化的单请求单策略DAG引擎

  1. graph添加add_node方法,支持指定新node的前序依赖和后续依赖
  2. 创建一个新文件,主要实现json处理类完成引擎dag可配置化,支持将node、dag、strategy配置等配置为json,通过解析json文件完成graph的初始化。
  3. 模拟请求走单策略单图。

第四步 实现多请求并发执行,可以支持多策略多图

  1. DAG拓扑结构共享
  • 全局缓存所有 JSON 配置的 DAG 拓扑,避免重复解析。
  • 每个请求只拷贝 indeg + ReadyQueue + 调度上下文。
  1. 每个请求的ReqContext独立调度上下文,实现并发执行dag
  • 新增一个ReqContext.h,实现ReqContext类,每个请求维护一个ReqContext,内部维护自己的调度器DAGScheduler,从而能多请求并行执行单DAG实例。
  • 保证indeg的修改请求间互不影响。
  • 主线程不断接受请求,创建ReqContext,使用ReqContext中的DAGScheduler调度执行。每个请求的调度策略按照第三步实现的单请求单策略执行。
  1. TaskManager池化调度器
  • 为了性能,考虑实现复用调度器对象,而不是每个请求都new/delete。
  • 实现TaskManagerPool类,请求进来时从TaskManager池里取一个调度器对象(调度上下文 + indeg 副本),执行后重置并归还。

第五步 实现算子间输入输出链接,目前优先考虑使用req_context作为上下文传递

第六步 实现根据输入输出上下文动态图调度

第七步 完善:调度策略可配置、支持异步日志、支持配置算子超时、支持全局配置以模拟tcc和降级策略

1.调度策略可插拔

  • DAGScheduler不直接依赖FIFO,就绪队列是接口化的 IReadyQueue。
  • 可以配置 Priority、Deadline、Weighted round robin 等不同调度策略。
  1. 异步日志

第八步 协程化改造:支持协程

使用说明:

  1. DAG配置

  2. 算子开发

  3. 引擎参数

快速开始

编译

g++ main.cpp -std=c++20 -o a

./a

About

EasyGraph: 支持配置化的高并发多策略的动态DAG引擎

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published