Golang中的持久性调度

时间:2016-02-05 11:19:52

标签: go

我正在写一个简单的通知服务。该服务提供了一个REST api,可以在其中发送通知,例如

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

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

解决此问题的一种方法是不断读取数据库并发送延迟已通过delayUntil的通知。

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

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

编辑:只需要一个实例。

1 个答案:

答案 0 :(得分:2)

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

  1. 在服务启动时读取数据库并将所有待处理通知放入列表中
  2. delayUntil对列表进行排序,并获取下一个(最早)通知的时间t
  3. 睡眠直至t,唤醒,将所有通知发送到他们自己的goroutine中delayUntil >= t,将其从列表和数据库中删除。
  4. 重复步骤2.
  5. 非常粗略地说cron是如何工作的。当然,您必须处理插入和其他特殊情况。看看https://github.com/robfig/cron/blob/master/cron.go即可开始使用。