为了账号安全,请及时绑定邮箱和手机立即绑定

Golang 中的持久调度

Golang 中的持久调度

Go
浮云间 2021-12-07 18:46:17
我正在编写一个简单的通知服务 i Go。该服务提供了一个 REST api,可以在其中放置通知,例如{   delayUntil: '2016-02-05T18:00:00'   user: 'username',   msg: 'Hello World',   isSent: false}现在我想在 delayUntil 时间向用户发送通知,要求服务即使重新启动也应该工作,这意味着我必须保留通知。现在我正在使用 BoltDB(键/值存储)。解决此问题的一种方法是持续读取数据库并在经过 delayUntil 时发送通知。另一种方法是在服务启动时读取数据库,并将每个通知放在一个 goroutine 中,该协程在 delayUntil 时间触发。消息发送后,它在 DB 中被标记为已发送。进入 API 的新条目被插入到数据库中并进行调度。有没有首选/更好/更简单的方法来实现这一目标?编辑:只需要一个实例。
查看完整描述

1 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

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

  1. 在服务启动时读取数据库并将所有挂起的通知放在列表中

  2. 对列表进行排序delayUntil并获取t下一个(最早的)通知的时间。

  3. 睡眠直到t,醒来,delayUntil >= t在他们自己的 goroutine 中发送所有通知,从列表和数据库中删除它们。

  4. 重复步骤 2。

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


查看完整回答
反对 回复 2021-12-07
  • 1 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信