0

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

基本上队列可以如下所示: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 消息。

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

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

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

关于如何改进这一点的任何建议?

4

3 回答 3

4

为什么不让您的单个调度员根据消息的类型分派到单独的队列。因此,您总共有 4 个调度程序,第一个将消息发送到其他三个队列。

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

于 2009-06-16T14:48:50.940 回答
0

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

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

如果是这种情况,那么我认为这是作业车间调度问题的一个示例。我认为这些通常是使用装箱算法建模的——谷歌搜索上述主题应该会找到很多参考资料。

很可能是因为您的约束非常简单,所以背包打包算法比 bin 打包更适合,只需为背包问题做一个谷歌。

于 2009-06-16T15:05:28.567 回答
0

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

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

于 2009-06-16T14:50:15.540 回答