我在为异步队列消费者线程组合算法时遇到了一些麻烦,即从单个队列中读取需要分派以执行长时间运行(至少几秒钟)工作的项目。
基本上队列可以如下所示: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 消息的饥饿时间比需要的时间长得多。
到目前为止,我已经考虑为每种消息类型(类型数量相当少)设置一个单独的线程池,但我担心保留这么多线程的效率。
关于如何改进这一点的任何建议?