我正在尝试实现负载均衡器,并且已经达到了一点速度。情况如下(简化),
这种设置的原因是每个工作人员都有唯一的请求,只有它可以处理,但也有一些人可以处理的一般请求。
我打算基本上使用C5 IntervalHeap的3个实例来实现它。每个工作人员都可以访问其本地队列+它所属的共享队列(例如,worker_a可以看到queue_a& queue_c)。
这个想法的问题是,如果本地队列中有请求并且共享队列中的请求具有相同的优先级,则不可能知道应该首先处理哪一个(IntervalHeap通常是第一个)当发生这种情况时先收到服务。)
编辑:我发现IntervalHeap似乎不是具有相同优先级请求的先来先服务器!
我希望尽量减少队列中的锁定,因为它的吞吐量和时间相对较高,但我现在能想到的唯一方法是在删除第三个队列并且共享请求是放入queue_a和queue_b。当请求被提升时,它会知道它是一个共享请求,并且必须将其从其他队列中删除。
希望能够清楚地解释清楚!
答案 0 :(得分:1)
看起来你最终只会推动泡沫 - 无论你如何安排它,在最坏的情况下,你只有两个同样优先执行的事情只有两个工人。您可以优先应用哪种打破平局标准,以便选择从哪个队列中提取下一个任务?
以下是两个想法:
随机选择队列。所有优先事项都是平等的,因此选择哪一个并不重要。在最坏的情况下,平均而言,所有队列的服务速度大致相同。
通过从具有最大元素数的队列中获取最小化队列长度。如果一个队列的填充率始终高于其他队列,这可能会导致其他队列的一些饥饿。
HTH
答案 1 :(得分:1)
同步您的员工可以共享相同的资源池以及他们的专用队列。在工作组1的队列中有1个可用项,在共享队列中有1项可用,如果工作者1首先获取共享队列的项,那将是一种耻辱,因为这将限制并行运行。相反,你希望工人1首先拿起私人物品,但这会产生新的警告,其中一个是工人1和工人2都忙于处理私人物品,因此旧的共享物品将不会被拿起。
在尝试降低复杂性时,找到解决这些问题的解决方案将非常困难。一个简单的实现只是在私有队列为空时处理共享项。这并不能解决在高负载情况下未正确处理优先级的部分。 (例如,由于私有队列总是满的,因此不会处理共享队列)。为了平衡这一点,您可能希望首先处理专用队列,仅当其他工作者专用队列为空时。这仍然不是一个完美的解决方案,因为这仍然会优先于共享项目的私有队列项目。再次解决这个问题可以通过设置多个策略来实现,但这里的复杂程度更高。
这完全取决于您的要求。