繁体   English   中英

使用共享优先级队列进行负载均衡

[英]Load balancing with shared priority queues

我正在尝试实现负载平衡器,并且已经达到了一点速度。 情况如下(简化),

  • 我有一个请求queue_a队列,由worker_a处理
  • 请求queue_b的第二个队列由worker_b处理
  • 我有queue_c的请求的3队列可到该工人

这种设置的原因是每个工作者都有唯一的请求,只有它可以处理,但也有任何人可以处理的一般请求。

我基本上使用C5 IntervalHeap的3个实例来实现它。 每个工作者都可以访问其本地队列+它所属的共享队列(例如,worker_a可以看到queue_a和queue_c)。

这个想法的问题是,如果本地队列中有请求,并且共享队列中的请求具有相同的优先级,则不可能知道应该首先处理哪一个(IntervalHeap通常是先来的 - 发生这种情况时的首发服务)。

编辑:我发现IntervalHeap似乎不是具有相同优先级请求的先来先服务器!

我希望最小化队列中的锁定,因为它将具有相对较高的吞吐量和时间敏感性,但是我现在能够想到的唯一方法将涉及更多的复杂性,其中第三个队列被移除并且共享请求被置于两者中queue_a和queue_b。 当请求被提升时,它会知道它是一个共享请求,并且必须将其从其他队列中删除。

希望能够清楚地解释清楚!

看起来你只是最终推动泡沫 - 无论你如何安排它,在最坏的情况下,你将有三个同样优先的事情,只有两个工人执行。 您可以优先应用哪种打破平局标准,以便选择从哪个队列中提取下一个任务?

这有两个想法:

  1. 随机选择队列。 所有优先事项都是平等的,因此选择哪一个并不重要。 在最坏的情况下,平均而言,所有队列将以大致相同的速率进行服务。

  2. 通过从具有最大元素数量的队列中获取最小化队列长度。 如果一个队列的填充率始终高于其他队列,这可能会导致其他队列的一些饥饿。

HTH

同步您的工作人员可以共享相同的资源池以及其专用队列。 在工作组1的队列中有1个可用项,在共享队列中有1项可用,如果工作者1首先获取共享队列的项,那将是一种耻辱,因为这将限制并行运行。 相反,您希望工作人员1首先获取私人物品,但这会产生新的警告,其中一个是工人1和工人2都忙于处理私人物品,因此旧的共享物品将不会被拾取。

在尝试降低复杂性时,找到解决这些问题的解决方案将非常困难。 一个简单的实现只是在私有队列为空时处理共享项。 这并不能解决在高负载情况下未正确处理优先级的部分。 (例如,由于私有队列总是满的,因此不会处理共享队列)。 为了平衡这一点,您可能希望首先处理专用队列,仅当其他工作者专用队列为空时。 这仍然不是一个完美的解决方案,因为这仍然会优先于共享项目的私有队列项目。 再次解决这个问题可以通过设置多个策略来实现,但这里的复杂性更高。

这一切都取决于您的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM