Golang中的持久调度

Golang中的持久调度,go,Go,我正在编写一个简单的通知服务。例如,该服务提供了一个RESTAPI,人们可以在其中放置通知 { delayUntil: '2016-02-05T18:00:00' user: 'username', msg: 'Hello World', isSent: false } 现在,我想在time delayUntil向用户发送一个通知,要求即使服务重新启动也应该工作,这意味着我必须持久保存通知。现在我正在使用BoltDB(键/值存储) 解决此问题的一种方法是连续读取数据库,

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

{
   delayUntil: '2016-02-05T18:00:00'
   user: 'username',
   msg: 'Hello World',
   isSent: false
}
现在,我想在time delayUntil向用户发送一个通知,要求即使服务重新启动也应该工作,这意味着我必须持久保存通知。现在我正在使用BoltDB(键/值存储)

解决此问题的一种方法是连续读取数据库,并在延迟时间已过的位置发送通知

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

有没有更好更简单的方法来实现这一点


编辑:只需要一个实例。

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

  • 读取服务启动时的DB,并将所有挂起的通知放入列表中
  • delayUntil
    对列表进行排序,并获取下一个(最早)通知的时间
    t
  • 睡眠到
    t
    ,醒来,在自己的goroutine中发送所有通知,其中
    delayUntil>=t
    ,将它们从列表和数据库中删除
  • 重复步骤2
    这就是cron的大致工作原理。当然,您必须处理插入和其他特殊情况。请查看入门指南。

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

  • 读取服务启动时的DB,并将所有挂起的通知放入列表中
  • delayUntil
    对列表进行排序,并获取下一个(最早)通知的时间
    t
  • 睡眠到
    t
    ,醒来,在自己的goroutine中发送所有通知,其中
    delayUntil>=t
    ,将它们从列表和数据库中删除
  • 重复步骤2
    这就是cron的大致工作原理。当然,您必须处理插入和其他特殊情况。请看一下入门指南。

    如果您想要扩展到多个实例,您将遇到一致性问题:哪个实例将处理哪个通知,等等。可能更好的方法是使用针对RabbitMQ等问题而设计的消息队列。这是非常正确的,我不知道延迟消息插件。但是,我仍然对一个实例就足够的情况下的答案感兴趣。请记住,RabbitMQ不能像许多其他数据存储一样正确处理一致性。如果您想要扩展到多个实例,您将遇到一致性问题:哪个实例将处理哪个通知,等等。可能更好的方法是使用针对RabbitMQ等问题设计的消息队列。这是非常正确的,我不知道延迟消息插件。但是,我仍然对一个实例就足够的情况下的答案感兴趣。请记住,RabbitMQ不能像许多其他数据存储一样正确处理一致性。