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

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

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

解决此问题的一种方法是连续读取DB并在delayUntil过去时发送通知。

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

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

编辑:只需一个实例。

最佳答案

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

  • 在服务启动时阅读数据库,并将所有待处理的通知放入列表
  • delayUntil对列表进行排序,并获取下一个(最早)通知的时间t
  • 休眠直到t,醒来,将所有通知发送到delayUntil >= t自己的goroutine中,将其从列表和数据库中删除。
  • 重复步骤2。

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

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

    10-11 07:44