У меня возникли некоторые проблемы при составлении алгоритма для потока потребителя асинхронной очереди, который считывает элементы из одной очереди, которые необходимо отправить для выполнения некоторой длительной (по крайней мере, нескольких секунд) работы.
В основном очередь может выглядеть следующим образом: A, A, A, A, A, B, B, A, B, A, A, A, A, A, C, B, A.
Т.е.. Сообщения A встречаются гораздо чаще, чем другие сообщения.
Наша система имеет разные значения параллелизма для каждого из типов сообщений, например, мы можем выполнить только 3 сообщения A одновременно, но мы можем выполнить 5 сообщений B и 4 сообщения C одновременно.
Мой текущий (неработающий) алгоритм состоит в том, чтобы один поток считывал данные с начала очереди и отправлял в пул потоков каждое задание, причем тело каждого задания ожидает достаточного количества ресурса, чтобы стать доступным, прежде чем выполнять фактическую полезную нагрузку.
Это означает, что если сначала поступит достаточное количество сообщений A, то они могут «заполнить» очередь пула потоков, а сообщения B + C будут голодать гораздо дольше, чем необходимо.
До сих пор я думал о том, чтобы иметь отдельный пул потоков для каждого типа сообщений (довольно небольшое количество типов), но меня беспокоит эффективность сохранения такого количества потоков.
Любые предложения о том, как я могу улучшить это?