👇我在这儿
当我们需要在一段时间后的特定时间或间隔运行任务时,我们需要使用任务调度系统来运行任务:例如发送电子邮件、推送通知、午夜关闭账户、清空表格等。
在本文中,我们将构建一个基本的事件调度程序,使用数据库作为持久层来调度事件在特定时间段运行,这将使我们了解事件调度系统的工作原理。
基本的工作机制是:
每当我们需要调度事件时,计划作业就会添加到数据库中以在特定时间运行。
另一个任务始终定期运行以检查数据库中的某些任务是否已过期, 如果在数据库中发现已过期任务(轮询)则运行计划作业。
让我们从创建用于存储事件的数据库(在 postgresql 中)开始:
CREATE TABLE IF NOT EXISTS "public"."jobs" (
"id" SERIAL PRIMARY KEY,
"name" varchar(50) NOT NULL,
"payload" text,
"runAt" TIMESTAMP NOT NULL
)
现在,我们来定义数据结构:
Event
: 调度事件Listeners
: 事件监听器列表ListenFunc:
触发事件时调用的函数
// Listeners has attached event listeners
type Listeners map[string]ListenFunc
// ListenFunc function that listens to events
type ListenFunc func(string)
// Event structure
type Event struct {
ID uint
Name string
Payload string
}
还需要定义 Scheduler
结构,用于调度事件和运行侦听器:
// Scheduler data structure
type Scheduler struct {
db *sql.DB
listeners Listeners
}
// NewScheduler creates a new scheduler
func NewScheduler(db *sql.DB, listeners Listeners) Scheduler {
return Scheduler{
db: db,
listeners: listeners,
}
}
在第 8 行到第 13 行中,我们通过将sql.DB实例和初始侦听器传递给调度程序来创建新