ecodeclub / ecron

大规模分布式任务调度系统(学习版)
Apache License 2.0
63 stars 21 forks source link

存储 API 设计 #2

Closed flycash closed 1 year ago

flycash commented 1 year ago

在我们的架构设计里面: 架构图

存储 API 处于一种核心地位。

总体上来说,调度核心就是不断从存储 API 里面获取“近期”要调度的任务,而后尝试分派给不同的调度节点。

在设计存储 API 的时候至少要考虑以下因素:

设计

暂时来说,如果不考虑增删改查任务的管理接口,那么调度核心和存储 API 的交互,一个方法就能解决问题:

type Storage interface {
     RunnableTasks(ctx context.Context) (<- chan Task, error)
}

那么对于调度核心来说,它的逻辑基本上就是:

tasks, err := s.RunnableTasks(ctx)
if err != nil {
    return err
}
for task := range tasks {
    schedule(task)
}

对于调度核心来说:

image

总体思路类似于此。调度核心将不会关心任何存储、查找任务相关的事情,它只需要保证一件事:能够及时取走到时间的任务,并且执行调度。

所以隐患很明显,即 channel 本身不管设置多大的容量,都有可能阻塞生产者或者消费者。事实上,阻塞消费者并没有问题,阻塞生产者则会导致任务不能及时调度。但是这本身不是 API 设计的缺陷,而应该认为是实现的缺陷。