【问题标题】:Method for self-rearranging job queue自重排作业队列的方法
【发布时间】:2011-06-02 09:49:08
【问题描述】:

我有一个作业队列(使用 Amazon SQS),它将作业交给许多机器,以通过 HTTP 获取和处理各种文档。有数百个不同的主机被访问,并且这些作业没有可预测的顺序。

为了礼貌,我不希望我的系统反复敲击单个主机。因此,如果我得到一个作业 #123 从 example.com 获取一些东西,但我发现我刚刚在过去 X 秒内从 example.com 获取了另一个东西,我应该继续做其他事情并将作业 #123 保存为稍后。

问题是,实现这种模式的好方法是什么?

似乎第一步是让作业运行者在某处保留所有域的列表,以及该域上的某些内容最后一次被访问的时间。我想这可能是一个简单的数据库表。

如果消息处理器得到一个必须推迟的工作,那么有很多可能的选择。

  1. 只需将消息的副本推送到队列的末尾,然后将其丢弃而不执行。希望下次它出现时,已经有足够的时间过去了。这可能会导致大量冗余 SQS 消息,尤其是在同一域的大型作业集群同时通过时。

  2. 在礼貌要求可以执行作业之前,无论多长时间都需要睡眠。这可能会导致许多队列处理器同时无所事事。

  3. 接受作业,但将其保存在每个队列处理器上某处的本地队列中。我想每个处理器都可以通过这种方式“声称”一些工作,然后选择以任何顺序处理它们以达到最大的礼貌。这仍然是不可预测的,因为每个队列处理器都需要了解所有其他队列处理器所命中的域。

  4. 为每个域建立单独的队列,并为每个队列设置一个专用进程。每个进程在执行每个作业之间都必须暂停 X 秒,因此有很多休眠进程开销,但这也许不是一件坏事。

你有设计这种东西的经验吗?你会推荐什么策略?

【问题讨论】:

  • 您是否 100% 卡在 SQS 上?有一些好的设计不会强迫您进入每个域的队列解决方案,但它们要求您直接控制我假设 SQS 不提供的队列(准确地说,能够“浏览”队列而不占据顶部元素,以及获取第 N 个元素而不是顶部元素的能力 - 基本上,将队列视为没有插入的双向链表,而不是纯队列)。

标签: perl design-patterns parallel-processing amazon-sqs job-queue


【解决方案1】:

我建议为每个域设置一个队列,每个队列一个处理器。

大多数服务器对于连续发出的请求应该没有问题,只要您注意总传输量(例如,您应该避免索引超过几百 KB 的文件,除非您有真正需要为了它)。

我假设您也遵守 robots.txt 规则。

【讨论】:

    【解决方案2】:

    每个域的单独队列和域队列。

    每个处理器应该:

    1. 从域队列中选择一个域。
    2. 如果域最近没有更新,请从域队列中选择顶部任务。
    3. 将域放回域队列的末尾。
    4. 如果我们有任务要执行,那就去做吧。
    5. 休眠直到检查域队列头或域队列更新。

    如果您将域队列组织为时间优先队列可能会有所帮助——按照下一次更新时间的顺序存储域。

    【讨论】:

    • 如果您有足够数量的不同域,并且您预计域队列会发生争用,您可以让处理器将域放回自己的 local 队列.然后将步骤 1 修改为“如果 local_queue_size
    • @j_random_hacker:不确定这是个好主意。本地队列使数据流复杂化,其好处值得怀疑。如果您没有足够的处理器,请添加更多。如果您的域队列太大,请添加一些分片。
    • @Alex:如果我理解您所说的“分片”是什么意思,我的建议将引入的唯一数据流复杂化——即本地域返回到全局队列——将发生在普通分片使一个或多个处理器空闲。它实际上是“自动分片”加上恢复机制。当然,您可以省略恢复机制以获得更简单的实现,该实现具有分片的所有好处(和低效率),而无需先验地定义分片。
    • @j_random_hacker:如果处理器将域窃取到私有队列并且之后会过载怎么办?谁会从它那里窃取域名?太复杂。无论如何,我会把它留到以后——现在它看起来像一个过早的优化。
    • @Alex:没错,但我认为分片容易受到同样的过载问题的影响——对吧?我假设“分片”是指“预先在处理器之间划分域”。如果不能请你解释一下?谢谢。
    猜你喜欢
    • 2018-11-30
    • 2015-11-03
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多