go - Golang 中的持久化调度

标签 go

我正在编写一个简单的通知服务 i Go。该服务提供了一个 REST API,例如可以在其中放置通知

{
   delayUntil: '2016-02-05T18:00:00'
   user: 'username',
   msg: 'Hello World',
   isSent: false
}

现在我想在 delayUntil 时间向用户发送通知,要求服务即使重新启动也应该工作,这意味着我必须保留通知。现在我正在使用 BoltDB(键/值存储)。

解决此问题的一种方法是持续读取数据库并在 delayUntil 已过时发送通知。

另一种方法是在服务启动时读取数据库,并将每个通知放入一个 goroutine 中,该 goroutine 在 delayUntil 时间触发。消息发送后,在数据库中标记为已发送。进入 API 的新条目被插入到数据库中并进行调度。

是否有首选/更好/更简单的方法来实现这一目标?

编辑:只需要一个实例。

最佳答案

如果您不想使用外部工具并且一个实例就足够了,您可以:

  1. 在服务启动时读取数据库并将所有未决通知放入列表
  2. delayUntil 对列表进行排序,并获取下一次(最早)通知的时间t
  3. 休眠到 t,醒来,发送所有在自己的 goroutine 中 delayUntil >= t 的通知,从列表和数据库中删除它们。
  4. 重复第 2 步。

这就是 cron 的大致工作方式。当然,您必须处理插入和其他特殊情况。看看https://github.com/robfig/cron/blob/master/cron.go开始。

关于go - Golang 中的持久化调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222853/

相关文章:

Cgo:如何将双数组从 C 返回到 Go

postgresql - 如何在go中模拟sql更新

string - 查找、解析和验证电子邮件地址

go - 尝试从 Golang 执行 python 2.7 代码时出现 EOF 错误

arrays - 戈朗 : unsafe dynamic byte array

go - 如何设置EXE文件PE头中的 "file version"字段?

dictionary - 为什么我不能在 Go 中使用 new() 初始化 map ?

regex - golang regexp ReplaceAllStrings with backreference不太管用

go - 在go gin中将原始字符串解析为golang结构

go - 从源代码构建 runc 时出错