我试图设计一种最好的方式,向用户发送他们注册的事件的提醒:
这是一个带有Sidekiq和Redis的Rails应用程序(现在我们只是在注册时发送一个通知,这是没有计划的)。
我认为至少有两种方法可以解决这个问题:
这应涵盖以下情况:
缺点:
的轮询
基本上每隔X分钟就有一个后台任务(可以用Unix或sidekiq的cron扩展来完成)检查"events“表,检查离事件是否有72小时、48小时或24小时的时间,并在每个注册时排队一个即时作业。
这有几个缺点:
我倾向于“提前安排”的做法。没有外部cron配置,我不需要每隔X分钟强调DB,如果有数百个用户注册了数百个事件,查询可能会变得很重,而且我可以监视Sidekiq web仪表板上发生的事情。
轮询似乎是最容易的,因为火和忘记自然,但它不可能是棘手的优化路线。轮询的一个巨大优点是它不需要配置有持久性的Redis。如果机器(或Redis)被重新启动,下一个cron迭代将主要是拾取它停止的地方。
调度解决方案需要配置具有持久性的Redis,因为如果机器重新启动,它将失去所有计划的作业,但这可能是一个一般的问题,所以这只是一个一般的需求。
有什么想法吗?我是不是遗漏了什么?
发布于 2017-04-19 10:48:06
理想的设计可能是A,简单的修改就是在用户注销时删除队列中的任何相关通知。这一修改将解决所列的两个缺点。
然而,这两种设计都是可以接受的。如果实际考虑使这更容易实现,则可以使用B。
https://softwareengineering.stackexchange.com/questions/347395
复制相似问题