Sidekiq:分配权重会导致优先级队列语义吗?

Eri*_*sen 5 priority-queue sidekiq

在我的 Sidekiq Pro 设置中,我有大约 10 个不同权重的队列。我的目的是使用权重来指示队列的优先级。

前几天我遇到了一个事件,导致一批低权重作业产生大量,并且似乎对高权重作业也存在竞争效应。

在文档的这一部分中,我阅读了以下内容:

每个队列都可以配置一个可选的权重。权重为 2 的队列的检查频率是权重为 1 的队列的两倍

这让我有点困惑。我可以期望权重产生优先级队列语义吗?

And*_*zlo 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.

从吞吐量分配的角度考虑加权队列似乎是获得直觉的最正确方法。这意味着:

  • 权重对应于分配给每个队列的吞吐量比例(当没有队列为空时)。
  • 并不意味着您已将一定比例的CPU时间或线程分配给某个队列。
  • 如果大批量低优先级作业的延迟高于高优先级作业,则可能会降低总体吞吐量并对其他队列产生不成比例的影响。
  • 如果其他队列上的作业速度较慢,则为延迟敏感队列分配高权重不足以保证该队列的高吞吐量。
  • 如果您需要优先级语义,请使用未加权队列。
  • 如果您需要优先级语义保证所有队列上的作业都得到处理,您需要进行一些认真的容量规划。对于事件,您可能还需要确保在排队作业意外激增时限制作业,或者在作业开始超时时确保有断路器。