使用处理资源的队列消息因消息类型而异

时间:2009-06-16 14:44:55

标签: c# .net algorithm queue message-queue

我在为异步队列使用者线程组合算法时遇到了一些麻烦,即从单个队列中读取需要调度以执行长时间运行(至少几秒)工作的项目。

基本上,队列可以如下所示:A,A,A,A,A,B,B,A,B,A,A,A,A,A,C,B,A。

IE中。 A消息比其他消息更常见。

我们的系统针对每种不同的消息类型具有不同的并发值,例如我们一次只能执行3 x A消息,但我们可以一次执行5 x B和4 x C消息。

我当前(已损坏)的算法是从队列前面读取一个线程并将每个作业调度到线程池,每个作业的主体在执行实际有效负载之前等待足够的资源可用。 / p>

这意味着如果有足够的A消息首先到达,那么它们可以“填满”线程池的队列,并且B + C消息的饥饿时间比必要的时间长得多。

到目前为止,我已经考虑过为每种消息类型设置一个单独的线程池(类型数量相当少),但是我担心保持这么多线程的效率。

关于如何改进这方面的任何建议?

3 个答案:

答案 0 :(得分:4)

为什么不让你的单一调度员调度到基于消息类型的单独队列。所以你总共有4个调度员,第一个向另外三个队列发送消息。

然后你有单独的队列读取器,它根据自己的规则将消息从队列中拉出。

答案 1 :(得分:0)

我不确定每种消息类型都有单独的线程池是不是很糟糕。你只需要这样做,看看会发生什么。

至于替代方案,您可以围绕线程池创建一个包装器并实现优先级队列(http://en.wikipedia.org/wiki/Priority_queue)。这种隐含性将为某些消息分配优先权。在您的情况下,由于C是最不常见的,它总是可以将C优先级更高。我想你明白了。

答案 2 :(得分:0)

首先,以下假设是否有效?

  • 作业实际执行的顺序无关紧要。
  • 队列只是记录要执行的作业的机制。
  • 这些工作都是独立的。
  • 总是有多个工作等待处理。

如果是这种情况,那么我认为这是作业车间调度问题的一个例子。我认为这些通常使用bin打包算法建模 - 对上述主题的谷歌搜索可以找到很多参考资料。

很可能是因为你的约束如此简单,背包打包算法更适合于垃圾箱打包,只需谷歌背包问题。