Eri*_*sen 5 priority-queue sidekiq
在我的 Sidekiq Pro 设置中,我有大约 10 个不同权重的队列。我的目的是使用权重来指示队列的优先级。
前几天我遇到了一个事件,导致一批低权重作业产生大量,并且似乎对高权重作业也存在竞争效应。
在文档的这一部分中,我阅读了以下内容:
每个队列都可以配置一个可选的权重。权重为 2 的队列的检查频率是权重为 1 的队列的两倍
这让我有点困惑。我可以期望权重产生优先级队列语义吗?
虽然我同意埃里克的大部分回答,但我不认为下面引用的结论是正确的:
当考虑大量排队作业时(由于队列选择的随机性),优先级队列语义是使用权重来实现的
我不确定我们是否不同意 Sidekiq 的工作方式或“优先级队列语义”在这种情况下的含义。我将使用维基百科对优先级队列的定义:
优先级队列中的每个元素都有一个关联的优先级。在优先级队列中,优先级高的元素先于优先级低的元素被服务。
我对此的解释是,优先级与权重相同,权重越大,优先级越高。这意味着只要队列中存在权重最高的作业,它们就应该在权重较低的队列中的作业之前得到服务。在 Sidekiq 中使用权重时,情况并非如此。对于按顺序定义的没有权重的队列来说就是这种情况,那么队列的顺序就是优先级。
我可以期望权重产生优先级队列语义吗?
为了让自己相信加权队列不会导致优先级语义,只需考虑以下反例。有两个队列,都有积压。队列 A 的权重为 9,队列 B 的权重为 1。当 Sidekiq 从加权队列中获取下一个作业时,会以 概率 随机选取队列weight/total weight,因此每次选取新作业时,有 1/10 的机会从队列中选取作业B 被选中。
这不是优先级队列语义,因为队列 B 中优先级低得多的作业仍有 10% 的时间领先于队列 A 上的作业。
不仅如此,根据前面的示例认为它是“90% 优先级队列语义”也可能是一个错误。例如,这并不意味着90% 的可用资源将分配给上一个示例中的队列 A。是的,90% 的吞吐量将来自队列 A 中的作业,但如果队列 B 上的作业比队列 A 上的作业花费的时间长 10 倍 - 超过一半 (~53%) 的 Sidekiq 线程实际上将处理队列中优先级较低的作业B.
从吞吐量分配的角度考虑加权队列似乎是获得直觉的最正确方法。这意味着:
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |