我们有成千上万的任务需要以各种任意间隔运行,有些是每小时,有些是每天,等等.这些任务是资源密集型的,需要分布在许多机器上.
现在,任务存储在具有"此时执行"时间戳的数据库中.要查找需要执行的任务,我们在数据库中查询将要执行的作业,然后在任务完成时更新时间戳.当然,这会导致数据库的大量写入负载.
据我所知,我们正在寻找一些东西,以设定的间隔将任务释放到队列中.(然后工人可以从该队列中请求任务.)
大规模安排重复任务的最佳方法是什么?
尽管使用其他语言编写的组件(RabbitMQ?)没有问题,但我们在很大程度上使用Python是值得的.
更新:现在我们有大约350,000个任务,每半小时左右运行一次,有一些变化.350,000个任务*每天48次,每天执行16,800,000个任务.
更新2:没有依赖关系.任务不必按顺序执行,也不依赖于以前的结果.
由于不需要ACID,并且您可以使用可能运行两次的任务,我根本不会在数据库中保留时间戳.对于每个任务,创建[timestamp_of_next_run,task_id]列表并使用最小堆来存储所有列表.Python的heapq模块可以为您维护堆.您将能够以最快的时间戳非常有效地弹出任务.当您需要运行任务时,使用其task_id在数据库中查找任务需要执行的操作.任务完成后,更新时间戳并将其放回堆中.(注意不要更改当前堆中的项目,因为这会破坏堆属性).
仅使用数据库存储在崩溃和重新引导后仍将关注的信息.如果重启后不需要这些信息,请不要花时间写入磁盘.您仍然需要进行大量的数据库读取操作来加载有关需要运行的任务的信息,但读取比写入要便宜得多.
如果没有足够的RAM同时将所有任务存储在内存中,您可以使用混合设置,在接下来的24小时内(例如)将任务保留在RAM中,其他所有内容都保留在内存中.数据库.或者,你可以用C或C++重写代码,这些内存需要更少的内存.
| 归档时间: |
|
| 查看次数: |
1384 次 |
| 最近记录: |