Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Партиции воркеров

Одна подписка читает свою очередь через одну принимающую связь и одну задачу приёма, а workers(n, by_key) раскладывает доставки по партициям воркеров по ключу из group-id.

Диспетчеризация одной подписки: очередь, принимающая связь, задача приёма, один поток и две партиции воркеров с ключом из group-idОчередь ordersна брокереПринимающая связькредит 256: насколько брокер отправляет вперёдЗадача приёмаурегулирует, пока доставка ждёт местаПоток AmqpSubscriberканал глубиной в кредитworkers(2, by_key)партиция = хеш group-idПартиция воркеров 1группы a и c,каждая по порядкуПартиция воркеров 2группа b, по порядкуДругие реплики конкурируют за очередь, а группы сообщенийArtemis держат один group-id на одном получателе
Схема текстом
  1. Очередь orders на брокере → Принимающая связь кредит 256: насколько брокер отправляет вперёд: передачи
  2. Принимающая связь кредит 256: насколько брокер отправляет вперёд → Задача приёма урегулирует, пока доставка ждёт места: приняты
  3. Задача приёма урегулирует, пока доставка ждёт места → Поток AmqpSubscriber канал глубиной в кредит: переданы
  4. Поток AmqpSubscriber канал глубиной в кредит → workers(2, by_key) партиция = хеш group-id: по одной
  5. workers(2, by_key) партиция = хеш group-id → Партиция воркеров 1 группы a и c, каждая по порядку
  6. workers(2, by_key) партиция = хеш group-id → Партиция воркеров 2 группа b, по порядку
  7. Другие реплики конкурируют за очередь, а группы сообщений Artemis держат один group-id на одном получателе

Брокер отправляет передачи в счёт кредита связи, по умолчанию 256 передач, а клиент выдаёт новый кредит по мере того, как сервис урегулирует доставки. Задача приёма передаёт каждую доставку в канал глубиной в кредит, поэтому обработчика ждут не больше доставок, чем умещается в один кредит. Пока доставка ждёт места в этом канале, задача приёма продолжает выполнять урегулирования. Поэтому поток, который никто не опрашивает, не задерживает подтверждения уже выданных доставок.

Поток выдаёт по одной доставке. Без workers один цикл вызывает обработчик для каждой доставки по очереди, и порядок очереди сохраняется.

workers(n, by_key) запускает n партиций воркеров. Доставка попадает в ту партицию воркеров, на которую указывает хеш её ключа партиционирования, а партиция воркеров выполняет свои доставки по порядку. Ключ партиционирования хранится в свойстве group-id сообщения, поэтому сообщения одной группы сохраняют порядок, а разные группы выполняются параллельно. У доставки без ключа нет ключа партиции воркеров, и такие доставки по кругу распределяются по партициям воркеров.

Чтобы выйти за пределы одного процесса, сервис запускает больше реплик на том же адресе queue. Их получатели конкурируют, и каждое сообщение достаётся одному из них. Группы сообщений Artemis отправляют все сообщения с одним group-id одному и тому же получателю, поэтому группа сохраняет порядок и между репликами. В Azure Service Bus group-id - это идентификатор сеанса.

Обработчик пакетов берёт пакет, который клиент собирает из потока: до размера, заданного в точке монтирования, или меньше, если раньше истекает batch_wait (по умолчанию 10 миллисекунд). Кредит и размер пакета независимы. Кредит ограничивает, сколько брокер отправляет заранее, а размер - сколько сообщений видит один вызов обработчика.