perl – 自行重新排列作业队列的方法

perl – 自行重新排列作业队列的方法,第1张

概述我有一个作业队列(使用Amazon SQS),它将作业交给许多机器,用于通过HTTP获取和处理各种文档.有数百个不同的主机被访问,并且没有可预测的作业顺序. 为了礼貌,我不希望我的系统在一台主机上反复敲击.因此,如果我得到一份工作#123从example.com获取某些内容,但我发现我在过去的X秒内刚刚从example.com获取了另一件事,我应该转向其他内容并保存作业#123 for后来. 问题 我有一个作业队列(使用Amazon SQS),它将作业交给许多机器,用于通过http获取和处理各种文档.有数百个不同的主机被访问,并且没有可预测的作业顺序.

为了礼貌,我不希望我的系统在一台主机上反复敲击.因此,如果我得到一份工作#123从example.com获取某些内容,但我发现我在过去的X秒内刚刚从example.com获取了另一件事,我应该转向其他内容并保存作业#123 for后来.

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

似乎第一步是让作业运行者在所有域的某个位置保留一个列表,并且最后一次访问该域上的某些内容.我想这可能是一个简单的数据库表.

如果消息处理器获得必须延迟的作业,则有许多可能的选项可用于执行 *** 作.

>只需将消息的副本推送到队列的末尾,然后将其丢弃而不执行它.希望在下一次出现时,足够的时间过去了.这可能会导致大量冗余SQS消息,尤其是在同一域的大型作业集群同时通过的情况下.
>在礼貌要求可以执行工作之前,需要休息几秒钟.这可能导致许多队列处理器同时无所事事.
>接受作业,但将其保存在每个队列处理器上的某个本地队列中.我想每个处理器都可以通过这种方式“声称”一些工作,然后选择以任何顺序处理它们以达到最大程度的礼貌.这仍然是不可预测的,因为每个队列处理器需要知道被其他所有域击中的域.
>为每个域建立单独的队列,并为每个队列分配一个进程.每个进程都必须在执行每个作业之间暂停X秒,因此会有很多睡眠进程开销,但这可能不是一件坏事.

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

解决方法 为每个域和域队列分隔队列.

每个处理器应该:

>从域队列中选择一个域.
>如果最近未更新域,请从域队列中选择顶级任务.
>将域放回到域队列的末尾.
>如果我们要执行任务,请执行此 *** 作.
>睡眠,直到检查域队列头或域队列更新为止.

如果将域队列组织为时间优先级队列,则可能会有所帮助 – 按照下一个更新时间的顺序存储域.

总结

以上是内存溢出为你收集整理的perl – 自行重新排列作业队列的方法全部内容,希望文章能够帮你解决perl – 自行重新排列作业队列的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1271265.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存