Я пытаюсь реализовать динамическую систему нескольких очередей для билетов - PullRequest
0 голосов
/ 30 декабря 2018

Я пытаюсь реализовать систему с несколькими очередями для заявок.Я использую весеннюю загрузку для асинхронного получения запросов на билеты.
Требуется, чтобы я получал много билетов с ключом определенного типа.для каждого билета, который я получаю, мне нужно поместить их в очередь в зависимости от их типа ключа.например, я получил билет с типом A, если очередь для A уже существует, я должен поместить билет в эту очередь, в противном случае я должен создать новую очередь для типа A, и если я получу другой запрос A, мне нужно подождатьпока первая заявка не закончила обработку.Я загрузил изображение, чтобы показать, что именно я пытаюсь сделать.

Я хочу знать хороший подход к этой проблеме.я знаю, как создать очередь FIFO для запросов, но мне трудно создать динамическую мульти-очередь.

динамическое изображение из нескольких очередей

1 Ответ

0 голосов
/ 31 декабря 2018

Создайте одну очередь 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 билетов в секунду, вам, вероятно, придется придумать альтернативу замку.

...