在 Debian 服务器上使用什么来安排许多任务?
What to use to schedule many tasks on a Debian server?
我拥有 Ubuntu 服务器的根访问权限,并将其用作 Android 应用程序(游戏)的中央系统。该应用程序的用户可以订购需要(实时)时间才能虚拟交付的商品。当玩家订购虚拟物品时,服务器会安排一个 cron 任务。在必须进行虚拟交付的那一刻,将执行 cron 任务并相应地更新系统。
有人告诉我,安排许多像这样的工作不适合 cron(尽管在我小规模测试时它工作得很好)因为 cron 是为定期做事而设计的。这不是我的应用程序所需要的。我需要在特定时间只执行一次任务的东西。许多用户会使用这个系统,因此会安排很多任务。 Farmville 等其他应用程序具有类似的系统,可以完美满足我的需求。我想知道他们使用什么或者我处理这个问题的最佳方法是什么。
我使用的是 PostgreSQL 数据库,因此可以选择使用内置的数据库调度程序,但我再次被告知这对于许多任务来说可能会变得非常慢。轮询是另一个不可行的选择。任何帮助将不胜感激。
我不会为每次交付安排 cron
(或 at
)作业,因为这可能会成为监控的噩梦。相反,我有一个单 cron
工作运行 定期,每 N
分钟(其中 N
是 "resolution" 你需要送货)。
然后它会启动并处理 所有 的逾期交付物。
所以,假设您的解决方案是一分钟,然后 1000 个不同的人的订单将在接下来的 60 秒内到期。而不是一千个单独的 cron
作业,所有这些订单都将存储在某种描述的数据存储中(数据库、平面文件或您选择的任何其他方案),并且单个 cron
作业将被唤醒并全部处理。
所以您刚刚将 cron
作业设置为:
- 从数据存储中检索在此期间到期的所有项目;
- 将它们交付给用户;
- 在数据存储中将它们标记为完整(或从中删除它们)。
然后,您订购商品的过程就变成了将订单添加到数据存储的简单操作,而无需尝试安排大量单独的作业。
如果您需要 小于 一分钟的分辨率,那么 cron
不太适合这项工作。它主要用于安排分辨率高于该阈值的周期性任务。
在这种情况下,您可以做的一件事是安排一项工作,该工作每分钟 运行 但整分钟都保持活动状态,检查(比如每秒)是否需要交付并采取行动。
但是,鉴于您并没有真正将 cron
用于其预期目的,我会考虑完全绕过计划,只是连续地 运行 设置您的交付脚本。
当然,为了增加备份,你可以每分钟有一个 cron
作业 运行 来检测你的 long-运行ning 脚本是否由于某种原因退出,重新启动如果它有(并且可能会发出警报,以便您可以调查它为什么下降)。
这样一来,您就可以两全其美,通过经过良好测试的方法启动您的项目并在出现问题时再次 运行 重新启动您的项目的低延迟交付。
我拥有 Ubuntu 服务器的根访问权限,并将其用作 Android 应用程序(游戏)的中央系统。该应用程序的用户可以订购需要(实时)时间才能虚拟交付的商品。当玩家订购虚拟物品时,服务器会安排一个 cron 任务。在必须进行虚拟交付的那一刻,将执行 cron 任务并相应地更新系统。
有人告诉我,安排许多像这样的工作不适合 cron(尽管在我小规模测试时它工作得很好)因为 cron 是为定期做事而设计的。这不是我的应用程序所需要的。我需要在特定时间只执行一次任务的东西。许多用户会使用这个系统,因此会安排很多任务。 Farmville 等其他应用程序具有类似的系统,可以完美满足我的需求。我想知道他们使用什么或者我处理这个问题的最佳方法是什么。
我使用的是 PostgreSQL 数据库,因此可以选择使用内置的数据库调度程序,但我再次被告知这对于许多任务来说可能会变得非常慢。轮询是另一个不可行的选择。任何帮助将不胜感激。
我不会为每次交付安排 cron
(或 at
)作业,因为这可能会成为监控的噩梦。相反,我有一个单 cron
工作运行 定期,每 N
分钟(其中 N
是 "resolution" 你需要送货)。
然后它会启动并处理 所有 的逾期交付物。
所以,假设您的解决方案是一分钟,然后 1000 个不同的人的订单将在接下来的 60 秒内到期。而不是一千个单独的 cron
作业,所有这些订单都将存储在某种描述的数据存储中(数据库、平面文件或您选择的任何其他方案),并且单个 cron
作业将被唤醒并全部处理。
所以您刚刚将 cron
作业设置为:
- 从数据存储中检索在此期间到期的所有项目;
- 将它们交付给用户;
- 在数据存储中将它们标记为完整(或从中删除它们)。
然后,您订购商品的过程就变成了将订单添加到数据存储的简单操作,而无需尝试安排大量单独的作业。
如果您需要 小于 一分钟的分辨率,那么 cron
不太适合这项工作。它主要用于安排分辨率高于该阈值的周期性任务。
在这种情况下,您可以做的一件事是安排一项工作,该工作每分钟 运行 但整分钟都保持活动状态,检查(比如每秒)是否需要交付并采取行动。
但是,鉴于您并没有真正将 cron
用于其预期目的,我会考虑完全绕过计划,只是连续地 运行 设置您的交付脚本。
当然,为了增加备份,你可以每分钟有一个 cron
作业 运行 来检测你的 long-运行ning 脚本是否由于某种原因退出,重新启动如果它有(并且可能会发出警报,以便您可以调查它为什么下降)。
这样一来,您就可以两全其美,通过经过良好测试的方法启动您的项目并在出现问题时再次 运行 重新启动您的项目的低延迟交付。