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
封面出处:https://www.instagram.com/p/CCYJc2yBAux/
- References
[1] clock: https://github.com/ronething/clock
[2] BruceDone/clock: https://github.com/BruceDone/clock
[3] crontab: https://github.com/ronething/crontab
[4] cron: https://github.com/robfig/cron
[5] echo: https://github.com/labstack/echo
[6] mongo-go-driver: https://github.com/mongodb/mongo-go-driver
[7] go-redis: https://github.com/go-redis/redis
[8] msgpack: https://github.com/vmihailenco/msgpack