想象一下一个基于云的闹钟项目,它允许用户为自己选择的日期和时间安排一个不重复的“叫醒电话”。这个系统需要扩展到非常大的数量。不要担心电话线的数量等事情。
问:你将如何查询数据来知道现在需要打电话给谁。计划的作业是最好的方法吗?如果是这样的话,每个计划的呼叫有一个作业吗?还是有一个作业定期唤醒并执行“全部捕获”查询?如果工作不是最好的,那你会怎么做?
注意:我不是在找代码。我想知道怎样的架构策略才能最好地解决这个问题。
谢谢!
最佳答案
如果您的硬件不是无限快的,那么您必须接受不准确的可能性,这意味着想要在12:00醒来的用户实际上可能在12:00:00.002醒来。他们不应该介意。
基于这个前提,您不需要每次计划调用一个作业(您将需要无限多这样的作业,而且规模不会很好,)也不需要定期唤醒并执行全部捕获查询的作业。(那将是非常糟糕的。)
你只需要一个定时器。
从所有的警报中,你忽略了过去的那些警报,而从其他警报中你选择了最接近“现在”的警报。就所有实际用途而言,这是所有等待触发的警报中的下一个触发警报。所以,你设置了你的定时器来触发警报。
如果在计时器触发之前创建了新的警报,则可以查看它是否更接近现在,如果是,则可以修改计时器,以便计时器始终设置为在下次警报时触发。
一旦计时器启动,就会唤醒用户。如果您没有无限高的时间分辨率(这意味着可能需要同时唤醒多个用户,)则会唤醒所有应该唤醒的用户。
然后,重复查找最接近“now”的未来警报的查询,重新初始化计时器,然后等待下一个警报。
关于mysql - 计划的数据库作业的可伸缩性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44141950/