我正在写一个简单的通知服务。该服务提供了一个REST api,可以在其中发送通知,例如
{
delayUntil: '2016-02-05T18:00:00'
user: 'username',
msg: 'Hello World',
isSent: false
}
现在我想在timeDntil发送一个通知给用户,要求服务即使重新启动也应该工作,这意味着我必须保留通知。现在我正在使用BoltDB(键/值存储)。
解决此问题的一种方法是不断读取数据库并发送延迟已通过delayUntil的通知。
另一种方法是在服务启动时读取数据库,并将每个通知放在一个在delayUntil时间触发的goroutine中。邮件发送后,在DB中标记为已发送。进入API的新条目将插入到数据库中并进行计划。
是否有首选/更好/更简单的方法来实现这一目标?
编辑:只需要一个实例。
答案 0 :(得分:2)
如果您不想使用外部工具并且一个实例就足够了,您可以:
delayUntil
对列表进行排序,并获取下一个(最早)通知的时间t
。 t
,唤醒,将所有通知发送到他们自己的goroutine中delayUntil >= t
,将其从列表和数据库中删除。非常粗略地说cron是如何工作的。当然,您必须处理插入和其他特殊情况。看看https://github.com/robfig/cron/blob/master/cron.go即可开始使用。