Создайте одну очередь Queue<TicketType>
.Назовите эту главную очередь.
Создайте Map<TicketType, Queue>
с ключом типа заявки, а значением будет очередь билетов для этого типа.
Создайте пул потребителей, которые отслеживаютглавная очередь и обработка заданий по мере их поступления.
при поступлении нового запроса
if map contains entry for that ticket type
add new ticket to queue for that ticket type
else
create new map entry and add queue
add new ticket to the queue for that ticket type
add ticket type to master queue
когда потребитель получает запись от мастераочередь
look up ticket type in map
pull next ticket from the corresponding queue
process ticket
// After ticket is processed:
if queue for that ticket type in map is empty
remove from map
else
add ticket type to master queue
Идея состоит в том, что карта содержит одну очередь для каждого отдельного типа заявки.Каждая очередь в этой карте содержит все входящие билеты для этого типа.
Основная очередь содержит одну запись для каждого типа билетов, который в настоящее время существует на карте.Билет типа A никогда не может иметь более одной записи в главной очереди в любое время.
При работе с очередями карты необходимо соблюдать осторожность при синхронизации.Вы не хотите случайно удалить, например, очередь с билетами.Вероятно, лучше заблокировать карту всякий раз, когда вы добавляете заявку, или когда вы проверяете, есть ли в очереди больше билетов после того, как вы закончили обработку заявки.Обе эти операции выполняются быстро, поэтому вы не должны сталкиваться с проблемами производительности при пакетах по 50 билетов в секунду.Если вы говорите о 1000 билетов в секунду, вам, вероятно, придется придумать альтернативу замку.