我有一个作业队列(使用 Amazon SQS),它将作业交给多台机器以通过 HTTP 获取和处理各种文档。有数百个不同的主机被访问,并且没有可预测的作业顺序。
为了礼貌起见,我不希望我的系统在单个主机上反复锤击。因此,如果我得到一份工作 #123 从 example.com 获取一些东西,但我看到我刚刚在过去 X 秒内从 example.com 获取了另一件事,我应该继续做其他事情并保存工作 #123之后。
问题是,实现这种模式的好方法是什么?
似乎第一步是让作业运行者在所有域的某处保留一个列表,以及该域上的某些内容最后一次被访问的时间。我想这可能是一个简单的数据库表。
如果消息处理器获得必须推迟的工作,则有许多可能的选择。
你有设计这种东西的经验吗?你会推荐什么策略?
最佳答案
每个域的单独队列和域队列。
每个处理器应该:
如果您将域队列组织为时间优先队列可能会有所帮助 - 按照下一次更新时间的顺序存储域。
关于perl - 自重排作业队列的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577204/