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
- [1] clock: github.com/ronething/c…
- [2] BruceDone/clock: github.com/BruceDone/c…
- [3] crontab: github.com/ronething/c…
- [4] cron: github.com/robfig/cron
- [5] echo: github.com/labstack/ec…
- [6] mongo-go-driver: github.com/mongodb/mon…
- [7] go-redis: github.com/go-redis/re…
- [8] msgpack: github.com/vmihailenco…