猿问

Golang 中的持久调度

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


{

   delayUntil: '2016-02-05T18:00:00'

   user: 'username',

   msg: 'Hello World',

   isSent: false

}

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


解决此问题的一种方法是持续读取数据库并在经过 delayUntil 时发送通知。


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


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


编辑:只需要一个实例。


浮云间
浏览 150回答 1
1回答

月关宝盒

如果您不想使用外部工具并且一个实例就足够了,您可以:在服务启动时读取数据库并将所有挂起的通知放在列表中对列表进行排序delayUntil并获取t下一个(最早的)通知的时间。睡眠直到t,醒来,delayUntil >= t在他们自己的 goroutine 中发送所有通知,从列表和数据库中删除它们。重复步骤 2。这就是 cron 的工作原理。当然,您必须处理插入和其他特殊情况。看看https://github.com/robfig/cron/blob/master/cron.go开始吧。
随时随地看视频慕课网APP

相关分类

Go
我要回答