0

我目前正在尝试实施负载平衡器,并且遇到了一些减速带。情况如下(简化),

  • 我有一个由 worker_a 处理的请求队列queue_a
  • 有第二个请求队列queue_bworker_b处理
  • 我有第三个请求队列queue_c可以去任何一个工人

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

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

这个想法的问题在于,如果本地队列中有一个请求,而共享队列中有一个优先级相同的请求,则无法知道应该先处理哪个请求(IntervalHeap 通常是先来的-发生这种情况时先发球)。

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

我想尽量减少跨队列的锁定,因为它会相对较高的吞吐量和时间敏感,但目前我能想到的唯一方法将涉及更多的复杂性,即删除第三个队列并将共享请求放入两者queue_a 和 queue_b。当请求被吸收时,它会知道这是一个共享请求,并且必须将其从其他队列中删除。

希望足够清楚地解释它!

4

2 回答 2

1

看起来你最终只会推动泡沫——无论你如何安排它,在最坏的情况下,你将只有两个工人来执行三件同等优先级的事情。为了选择从哪个队列中提取下一个任务,您可以应用什么样的打破规则来超越优先级?

这里有两个想法:

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

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

高温高压

于 2012-07-10T06:49:47.853 回答
1

同步您的工作人员可以共享相同的资源池以及他们的私有队列。在工作人员 1 的队列中有 1 个可用项目和共享队列中有 1 个可用项目中,如果工作人员 1 首先拿起共享队列的项目,那将是一种耻辱,因为这将限制并行运行。相反,您希望工人 1 首先拿起私人物品,但这会导致新的警告,即工人 1 和工人 2 都忙于处理私人物品,因此不会拿起旧的共享物品。

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

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

于 2012-07-11T02:50:02.540 回答