Go 构建基础的事件调度器

本文介绍了如何使用Go构建一个基本的事件调度器,该调度器依赖PostgreSQL数据库存储事件并在特定时间执行。调度器包括事件的添加、定期检查过期任务并执行,以及删除已完成的任务。通过轮询数据库和使用time.Ticker,实现了简单的时间间隔任务调度。文章展示了核心代码实现和程序运行示例。
摘要由CSDN通过智能技术生成

👇我在这儿 

当我们需要在一段时间后的特定时间或间隔运行任务时,我们需要使用任务调度系统来运行任务:例如发送电子邮件、推送通知、午夜关闭账户、清空表格等。

在本文中,我们将构建一个基本的事件调度程序,使用数据库作为持久层来调度事件在特定时间段运行,这将使我们了解事件调度系统的工作原理。

基本的工作机制是:

每当我们需要调度事件时,计划作业就会添加到数据库中以在特定时间运行。

另一个任务始终定期运行以检查数据库中的某些任务是否已过期, 如果在数据库中发现已过期任务(轮询)则运行计划作业。

efa3163124daae54f09d1240fe4b0290.png

让我们从创建用于存储事件的数据库(在 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实例和初始侦听器传递给调度程序来创建新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值