C# 共享优先级队列的负载平衡

C# 共享优先级队列的负载平衡,c#,priority-queue,c5,C#,Priority Queue,C5,我目前正在尝试实现一个负载平衡器,但遇到了一点减速。情况如下(简化) 我有一个请求队列队列a,由工作者a处理 还有第二个请求队列queue_b,由worker_b处理 我还有第三个请求队列queue_c,可以发送给任何一个工作人员 这种设置的原因是,每个工作者都有唯一的请求,只有它可以处理,但也有一般的请求,任何人都可以处理 我打算使用IntervalHeap的3个实例来实现这一点。每个工人都可以访问其本地队列+其所属的共享队列(例如,工人a可以看到队列a和队列c) 这种想法的问题在于,如果

我目前正在尝试实现一个负载平衡器,但遇到了一点减速。情况如下(简化)

  • 我有一个请求队列队列a,由工作者a处理
  • 还有第二个请求队列queue_b,由worker_b处理
  • 我还有第三个请求队列queue_c,可以发送给任何一个工作人员
这种设置的原因是,每个工作者都有唯一的请求,只有它可以处理,但也有一般的请求,任何人都可以处理

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

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

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

我希望最大限度地减少队列间的锁定,因为这将具有相对较高的吞吐量和时间敏感性,但目前我能想到的唯一方法将涉及更复杂的问题,即删除第三个队列,并将共享请求放入队列a和队列b中。当请求被吸出时,它将知道它是一个共享请求,并且必须将其从其他队列中删除


希望解释得足够清楚

看来,你最终只会把泡沫推来推去——不管你怎么安排,在最坏的情况下,你只有两个工人来执行三件同等优先的事情。为了选择从哪个队列中提取下一个任务,除了优先级之外,您可以应用什么样的打破平局的标准

这里有两个想法:

  • 随机挑选队列。所有的优先权都是平等的,所以选择哪一个并不重要。平均而言,在最坏的情况下,所有队列将以大致相同的速率提供服务

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


  • HTH

    同步您的工作人员可以共享相同的资源池及其专用队列。对于worker 1,队列中有1个可用项,而共享队列中有1个可用项,如果worker 1首先拾取共享队列中的项,那将很遗憾,因为这将限制并行运行。相反,您希望worker 1首先拾取私有项,但这会导致新的警告,其中之一是worker 1和worker 2都忙于处理私有项,因此不会拾取旧的共享项

    在试图降低复杂性的同时,找到解决这些问题的解决方案将非常困难。一个简单的实现只是在私有队列为空时处理共享项。这并不能解决高负载场景中优先级处理不正确的问题。(例如,由于专用队列总是满的,因此无法处理共享队列)。为了平衡这一点,您可能希望首先处理专用队列,但前提是其他工作人员专用队列为空。这仍然不是一个完美的解决方案,因为与共享项目相比,它仍然更喜欢私有队列项目。再次解决这个问题可以通过制定多种策略来实现,但这带来了更大的复杂性


    这完全取决于您的需求。

    看看TPL数据流,它为您所述的问题提供了通用解决方案。在这种情况下,你可能不得不停止使用C5。你有更多的信息吗?e、 例如,我如何在这种情况下使用TPL?我在谷歌上搜索了一下,但不清楚如何在我的情况下使用它。是的,每个解决方案似乎都有局限性。我曾经想到过一种方法,共享队列在其他队列中插入一种令牌来表示可用的工作。当工作者在其本地队列中看到这些令牌时,他们会尝试从共享队列获取请求。如果它不存在了,他们就继续。否则将正常处理。如果您在大量其他队列中共享队列,这只会带来开销,因为每个队列都需要检查每个共享队列请求。我不同意这个答案。私有项目和共享项目之间当然存在优先级差异。这完全取决于不同队列的状态。见我的答案。@Polity OP明确表示队列前面的项目优先级相等。说私有队列具有更高的优先级可能是解决问题的一种完全有效的方法,但这并不是原始问题所支持的价值判断。原始问题本质上可以归结为:我有两个同等优先级的事情要做,但只有一个工人——它应该选择哪一个?需要有一些打破僵局的机制,在众多的选择中,选择私有队列并不比随机选择或选择最长的队列更有效。我目前已经实现了它,因此共享队列不是一个队列,而是一个查找列表。当共享队列接收到工作时,它会将该工作放入所有底层队列中,并使用一个特殊标志指示它是共享工作。当工作人员收到带有这些特殊标志的工作负载时,它会根据共享队列进行检查,以确保仍然需要完成工作。如果它不再有效,它将丢弃并获取其队列中的下一项。如果有效,它将继续处理它。这会导致发生一些额外的检查,但是