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

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

Author: ronething
Link: https://blog.ronething.cn/20200727-clock.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.