【问题标题】:Scalable job queue system for large scale task scheduling [closed]用于大规模任务调度的可扩展作业队列系统[关闭]
【发布时间】:2014-05-12 05:43:05
【问题描述】:

场景:

TL;DR - 我需要一个队列系统来根据未来时间戳而不是插入顺序来触发作业

我有一个 MySQL 条目数据库,其中详细说明了需要根据时间戳以精确顺序执行的特定事件(主要包括一系列算术计算和数据库插入/更新)。插入条目的时间和“执行”事件的时间没有相关性,由外部因素决定。该表还包含第二列毫秒,可提高计时精度。

此表是作业“队列”的一部分,其中包含设置为在未来几秒到几天之间执行的条目,并且每秒可能添加多达数千个条目。需要不断地解析队列(每秒?) - 可能通过选择在这一秒内过期的所有时间戳并按毫秒排序,然后执行条目详细说明的每个事件。

问题

目前,后端完全用 PHP 编写在带有 MySQL 的 apache 服务器上(即标准 LAMP 架构)。现在,我能想到的实现我指定的唯一方法是编写一个自定义的 PHP 作业队列脚本,该脚本将进行解析和执行,使用 this method 每秒循环一次。据我所知,没有其他作业系统可以根据指定的时间戳/毫秒而不是进入时间对作业进行排队。

然而,即使在纸面上,这种方法在 CPU 方面听起来也相当不可行——我必须每秒执行一次巨大的 MySQL 查询,并为检索到的每一行执行某种函数,它有可能运行超过一秒的执行时间,这将开始为解析时间引入延迟并弄乱循环脚本。

当然,我正在尝试创建一个可扩展的解决方案,以应对系统上的大量流量,该解决方案惨遭失败,因为随着条目数量的增加,它将继续落后。

问题

我更愿意坚持标准的 LAMP 架构,但有没有其他技术可以很好地集成到堆栈中,以便更好地处理我在这里尝试做的事情?

是否有另一种方法可以完全准确地在指定的未来日期触发事件,而无需对不断的队列检查进行混乱的摆弄?

如果以上选项都不合适,有没有更好的方法在后台循环 PHP 脚本?在最坏的情况下,我可以接受较长的执行时间并将任务分配给多个“工人”。

更新

RabbitMQ 是一个很好的建议,但不幸的是,它不会在“过期”后立即执行任务 - 它必须首先通过队列并等待前面所有尚未过期的任务。过期时间范围很广,从几秒到几天不等,每次添加新事件时都需要对队列进行排序,因此过期时间在队列中始终是有序的。据我所知,这在 RabbitMQ 中是不可能的,而且听起来也不是很有效。是否有替代方案或程序化修复?

【问题讨论】:

    标签: php queue rabbitmq scalability jobs


    【解决方案1】:

    有时,将方形钉子放入圆孔中需要花费太多精力。虽然使用 MySQL 创建队列可能很有效,但扩展起来却变得更加棘手。我建议这可能是RabbitMQ 的机会。

    基本上,您将设置一个可以将事件放入的消息队列。然后,您将拥有一个“扇出”架构,您的工作人员处理每个队列。每个工作人员都会监听队列并检查是否需要处理特定事件。我想 "Work Queues" 和 Rabbit 中可用的 "Routing" 技术的组合将以可扩展且可靠的方式实现您所寻找的。​​p>

    我会设想一个像这样工作的系统:

    1. 派生工作人员来监听队列,使用路由键来减少他们收到的消息数量
    2. 每个工作人员都会检查消息以查看它们是否要立即执行
    3. 如果要执行消息,请执行并确认 - 否则,重新发送消息以供将来处理。有一些 simple techniques 可用于此。

    随着您需要更大的规模,您需要添加更多的工人。当您最终限制队列服务器时,RabbitMQ 非常健壮且易于集群。还有其他基于云的排队系统,例如Iron.IOStormMQ

    【讨论】:

    • 我对 RabbitMQ 做了一些研究,它看起来很有希望,直到我遇到这个:rabbitmq.com/ttl.html(警告)。我需要设置每条消息的 TTL 来定义执行任务的时间,但就像我提到的,它的范围可以从几秒到几天。我需要在计时器到期后立即执行任务,但看起来 rabbitMQ 会等待队列的头部首先弹出。我需要一些方法来对队列进行排序,以便首先到期的任务位于队列的头部并按顺序弹出。有解决办法吗?
    • 可能不是,不过我会尝试处理它:让消息本身具有执行时间。收到消息的作业可以立即确认,读取时间,如果是现在或过去,执行。如果是在未来,请在同一时间重新派送,以便其他工作可以接手。我会让所有工作人员在抓取和重新调度之间睡一小段时间(1-100 毫秒),这样你就不会忙着等待队列服务器。
    猜你喜欢
    • 2014-11-21
    • 2015-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2015-06-16
    • 2014-04-19
    • 1970-01-01
    相关资源
    最近更新 更多