我拥有对Ubuntu服务器的root访问权限,并将其用作Android应用程序(游戏)的中央系统。该应用的用户可以订购需要(实际)时间进行虚拟交付的物品。现在当玩家订购虚拟物品时发生的事情是服务器安排了一个cron任务。虚拟交付必须发生的那一刻,执行cron任务并相应地更新系统。
我被告知安排许多像这样的工作不适合cron(虽然它在小规模测试时效果很好),因为cron是为定期做事而做的。这不是我的应用程序所需要的。我需要在特定时间只执行一次任务的东西。许多用户将使用此系统,因此将安排许多任务。像Farmville这样的其他应用程序有一个类似的系统,完全符合我的需要。我想知道他们使用什么或者最好的办法是我处理这个问题。
我使用的是PostgreSQL数据库,因此使用内置的数据库调度程序是一个选项,但我再次被告知,对于许多任务来说,这可能会变得很慢。轮询是另一种不可行的选择。任何帮助将不胜感激。
答案 0 :(得分:1)
我不会为每次投递安排cron
(或at
)工作,因为这可能会成为监控的噩梦。相反,我有一个单 cron
工作,定期运行,每N
分钟(其中N
是"分辨率&#34 ;你需要交货)。
然后它将启动并处理所有过期的可交付成果。
所以,让我们说你的决议是一分钟,并且有一千个不同的人在接下来的六十秒内完成订单。所有这些订单都将存储在某些描述的数据存储中(数据库,平面文件或您选择的任何其他方案),而单个cron
作业将被唤醒,而不是一千个单独的cron
个作业。处理它们。
因此,您只需将cron
作业设置为:
您订购商品的流程将成为将订单添加到数据存储的简单操作,而不是试图安排大量单个工作。
如果你需要小于的分辨率,那么cron
并不适合这项工作。它主要用于安排分辨率高于该阈值的周期性任务。
在这种情况下,您可以做的一件事是安排一个每分钟运行但在整个一分钟内保持活动状态的工作,检查(比如每秒)是否需要交付并执行该操作。
但是,如果您没有真正将cron
用于其预期用途,我会考虑完全绕过日程安排,并且只是连续运行您的投放脚本。
当然,对于添加的备份,您可以每分钟运行一次cron
作业,以检测您的长时间运行的脚本是否因某种原因退出,如果有则重新启动它(并且可能会引发警报你可以调查它失败的原因。)
通过这种方式,您可以获得两全其美的产品,即使出现问题,还可以通过经过充分测试的方法获得并延迟运行。