Golang中的持久调度
我正在编写一个简单的通知服务。例如,该服务提供了一个RESTAPI,人们可以在其中放置通知Golang中的持久调度,go,Go,我正在编写一个简单的通知服务。例如,该服务提供了一个RESTAPI,人们可以在其中放置通知 { delayUntil: '2016-02-05T18:00:00' user: 'username', msg: 'Hello World', isSent: false } 现在,我想在time delayUntil向用户发送一个通知,要求即使服务重新启动也应该工作,这意味着我必须持久保存通知。现在我正在使用BoltDB(键/值存储) 解决此问题的一种方法是连续读取数据库,
{
delayUntil: '2016-02-05T18:00:00'
user: 'username',
msg: 'Hello World',
isSent: false
}
现在,我想在time delayUntil向用户发送一个通知,要求即使服务重新启动也应该工作,这意味着我必须持久保存通知。现在我正在使用BoltDB(键/值存储)
解决此问题的一种方法是连续读取数据库,并在延迟时间已过的位置发送通知
另一种方法是在服务启动时读取DB,并将每个通知放在一个goroutine中,该goroutine在延迟时间触发。消息发送后,在数据库中将其标记为已发送。API中的新条目将插入数据库并进行调度
有没有更好更简单的方法来实现这一点
编辑:只需要一个实例。如果您不想使用外部工具,一个实例就足够了,您可以:
delayUntil
对列表进行排序,并获取下一个(最早)通知的时间t
李>
t
,醒来,在自己的goroutine中发送所有通知,其中delayUntil>=t
,将它们从列表和数据库中删除这就是cron的大致工作原理。当然,您必须处理插入和其他特殊情况。请查看入门指南。如果您不想使用外部工具,一个实例就足够了,您可以:
delayUntil
对列表进行排序,并获取下一个(最早)通知的时间t
李>
t
,醒来,在自己的goroutine中发送所有通知,其中delayUntil>=t
,将它们从列表和数据库中删除这就是cron的大致工作原理。当然,您必须处理插入和其他特殊情况。请看一下入门指南。如果您想要扩展到多个实例,您将遇到一致性问题:哪个实例将处理哪个通知,等等。可能更好的方法是使用针对RabbitMQ等问题而设计的消息队列。这是非常正确的,我不知道延迟消息插件。但是,我仍然对一个实例就足够的情况下的答案感兴趣。请记住,RabbitMQ不能像许多其他数据存储一样正确处理一致性。如果您想要扩展到多个实例,您将遇到一致性问题:哪个实例将处理哪个通知,等等。可能更好的方法是使用针对RabbitMQ等问题设计的消息队列。这是非常正确的,我不知道延迟消息插件。但是,我仍然对一个实例就足够的情况下的答案感兴趣。请记住,RabbitMQ不能像许多其他数据存储一样正确处理一致性。