这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
分布式调度任务
当前软件的架构已经开始向分布式架构转变,将单体结构拆分为若干服务,服务之间通过网络交互来完成业务处理。在分布式架构下,一个服务往往会部署多个实例来运行我们的业务,如果在这种分布式系统环境下运行任务调度,我们称之为分布式任务调度。
Asynq 是一个 Go 库,用于排队任务并与 worker 异步处理它们。它由 Redis 提供支持,旨在实现可扩展且易于上手。
Asynq 工作原理的高级概述:
- 客户端将任务放入队列
- 服务器从队列中拉取任务并为每个任务启动一个工作协程
- 任务由多个worker同时处理
任务队列用作跨多台机器分配工作的机制。一个系统可以由多个工作服务器和代理组成,使其具有高可用性和水平扩展特性。
Asynq有很多易用的特性,下面简单列举几个:
- 任务调度
- 保证任务至少执行一次
- 失败任务重试
- 自动恢复
- 优先级队列
- 使用唯一选项对任务进行重复数据删除
- 周期性任务
- 可视化的管理界面
- 支持Redis集群和哨兵模式 golang分布式任务主要分为
master 服务端 主要提供后台操作的api,添加定时任务和一次性任务到etcd中,对任务进行增删改查 日志 服务发现 服务注册等功能
worker 客户端 主要监听etcd中的任务(与自己服务器ip相关的任务) 一次性任务立即执行即可,定时任务解析表达式后,放入内存中,定时执行 ** master:**
主要负责接收后台对任务的管理 提供api接口
go run .\master\main\master.go -config= .\master\main\master.json
** worker:**
监听任务,执行任务,任务调度