我正在编写一个简单的通知服务 i Go。该服务提供了一个 REST API,例如可以在其中放置通知
{
delayUntil: '2016-02-05T18:00:00'
user: 'username',
msg: 'Hello World',
isSent: false
}
现在我想在 delayUntil 时间向用户发送通知,要求服务即使重新启动也应该工作,这意味着我必须保留通知。现在我正在使用 BoltDB(键/值存储)。
解决此问题的一种方法是持续读取数据库并在 delayUntil 已过时发送通知。
另一种方法是在服务启动时读取数据库,并将每个通知放入一个 goroutine 中,该 goroutine 在 delayUntil 时间触发。消息发送后,在数据库中标记为已发送。进入 API 的新条目被插入到数据库中并进行调度。
是否有首选/更好/更简单的方法来实现这一目标?
编辑:只需要一个实例。
最佳答案
如果您不想使用外部工具并且一个实例就足够了,您可以:
- 在服务启动时读取数据库并将所有未决通知放入列表
- 按
delayUntil
对列表进行排序,并获取下一次(最早)通知的时间t
。 - 休眠到
t
,醒来,发送所有在自己的 goroutine 中delayUntil >= t
的通知,从列表和数据库中删除它们。 - 重复第 2 步。
这就是 cron 的大致工作方式。当然,您必须处理插入和其他特殊情况。看看https://github.com/robfig/cron/blob/master/cron.go开始。
关于go - Golang 中的持久化调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35222853/