非同期キュー コンシューマー スレッドのアルゴリズムをまとめるのに問題があります。これは、長時間実行する (少なくとも数秒) 作業を行うためにディスパッチする必要がある単一のキューからアイテムを読み取るものです。
基本的に、キューは次のようになります: A、A、A、A、A、B、B、A、B、A、A、A、A、A、C、B、A。
すなわち。A メッセージは、他のメッセージよりもはるかに一般的です。
私たちのシステムでは、異なるメッセージ タイプごとに異なる同時実行値があります。たとえば、一度に実行できるのは 3 x A メッセージのみですが、5 x B および 4 x C メッセージを一度に実行できます。
私の現在の (壊れた) アルゴリズムは、実際のペイロードを実行する前に、各ジョブの本体が十分なリソースが利用可能になるのを待って、キューの先頭から読み取り、各ジョブをスレッドプールにディスパッチする単一のスレッドを持つことです。
これは、十分な量の A メッセージが最初に到着すると、スレッド プールのキューが「いっぱいになる」可能性があり、B+C メッセージは必要以上に長く枯渇することを意味します。
これまでのところ、メッセージの種類ごとに個別のスレッド プールを用意することを考えてきました (種類の数はかなり少ない) が、それだけ多くのスレッドを保持することの効率が心配です。
これを改善する方法について何か提案はありますか?