GO 语言实现简单的分布式任务调度系统

4,480 阅读2分钟

0x00

时间过的真快,几个月又过去了。

问题不大,想不到我又回来了。

0x01

这次主要是想介绍一下如何用 redis 和 mongodb 实现简单的分布式任务调度系统 clock[1],参考了一个开源项目 BruceDone/clock[2] 不过改动很大

之前跟着小鱼儿老师实现了一个基于 etcd 的任务调度系统 crontab[3]

这次是由于某些原因,所以采用了 redis

架构设计

分为 master 和 worker

  • master

1、对任务进行增删查改,并 publish 发布对应事件到 redis

2、日志接口

  • worker

1、sub 订阅 redis 对应 channel,接收 master 发过来的事件消息并进行调度器中任务增删

2、执行 task 任务,使用 redis 分布式锁以及续租,保证同一时刻同一任务只有一个 worker 在执行

3、使用 mongodb 对 task 和 tasklog 进行存储

4、worker 每次启动会将数据库中的 task 进行判断是否需要加入调度器

优缺点

  • 架构相对简单,实现不会很复杂,支持多 master 多 worker 实现高可用
  • worker 中调度器和执行器放在一起,有好有坏,多 worker 不需要担心只有一个调度器的单点问题,但是多个 worker 会一起调度,虽然使用了分布式锁进行问题解决,但是也会造成资源的浪费
  • 分布式任务调度有很多实现方案,这只是初级方向,还要多优化多踩坑

相关组件/模块

  • cron[4] - 定时调度器
  • echo[5] - web 框架
  • mongo-go-driver[6] - mongo 驱动
  • go-redis[7] - redis 客户端
  • msgpack[8] - redis 信息传输序列化

0x02 References