如何在 Go 项目中维护多个独立的定时任务

date
Apr 11, 2023
slug
go-multi-version-timer
status
Published
tags
Code
Go
summary
errgroupcontext + locker
type
Post
Created Time
Oct 28, 2023 01:45 PM
Updated Time
Oct 28, 2023 01:45 PM
AI summary
Status
项目中有时会需要用定时任务完成一些特定的工作,我之前曾经尝试过用 Linux crontab 定期执行程序,但这样的方式,非常不优雅且难以维护,经过实践,我发现两种有两种比较优雅的方式,一是 errgroup ,二是 context + 分布式锁。

errgroup

errgroup 是 Go 语言中一个用于将多个 goroutine 同步的工具包,它提供了类似于 sync.WaitGroup 的功能,但是可以在 goroutine 中处理错误。
使用 errgroup 管理多个相互独立的定时任务的代码实例如下:

context + 分布式锁

如果是独立的小项目,用上面的方式进行管理就可以了。但如果是资源共享的多个项目,为了防止数据竞争和冲突,就需要用分布式锁进行控制和管理了。
首先分别了解下 context 和分布式锁的概念:
  • context 是 Go 语言中一个用于跨 API 和进程传递请求范围数据、取消信号以及截止时间的标准包。它通常在多个 goroutine 之间传递,以便在整个进程范围内确保请求特定的数据和状态。
  • 分布式锁是一种用于分布式系统中协调多个进程/线程访问共享资源的机制。它可以确保在任何时刻,只有一个进程/线程可以访问共享资源,从而防止数据竞争和冲突。
使用 contextredis 分布式锁进行管理多个独立的定时任务的代码实例如下:

最后

除了使用 errgroupcontext + 分布式锁,还有以下几种方式可以在项目中管理多个独立的定时任务:
  • 使用 cron 表达式来控制定时任务的执行时间。
  • 使用第三方库,如 github.com/robfig/crongithub.com/robfig/cron/v3github.com/robfig/cron/v4
  • 使用操作系统的计划任务来控制定时任务的执行时间。
  • 使用消息队列来控制定时任务的执行时间,如 RabbitMQApache Kafka

© 孙东辉 2022 - 2025