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

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

Конвейеры обработки

Одна подписка читает одну очередь через одну задачу приёма, а workers(n, by_key) раскладывает её сообщения по конвейерам обработки, выбирая их по группе сообщений FIFO.

Диспетчеризация одной подписки: очередь FIFO, одна задача приёма, один поток и два конвейера обработки с ключом по группе сообщенийОчередь orders.fifoгруппы сообщений alice, bob и carolЗадача приёмана одно получение впереди обработчиковПоток SqsSubscriberпо одному сообщениюworkers(2, by_key)конвейер = хеш группы сообщенийКонвейер обработки 1alice и carol,каждая по порядкуКонвейер обработки 2bob, по порядкуУ стандартной очереди нет групп, поэтому её сообщенияпо кругу расходятся по конвейерам обработкиРеплики сервиса опрашивают одну очередь,и SQS отдаёт каждое сообщение одной из них
Схема текстом
  1. Очередь orders.fifo группы сообщений alice, bob и carol → Задача приёма на одно получение впереди обработчиков: ReceiveMessage
  2. Задача приёма на одно получение впереди обработчиков → Поток SqsSubscriber по одному сообщению: пакет
  3. Поток SqsSubscriber по одному сообщению → workers(2, by_key) конвейер = хеш группы сообщений: по одному
  4. workers(2, by_key) конвейер = хеш группы сообщений → Конвейер обработки 1 alice и carol, каждая по порядку
  5. workers(2, by_key) конвейер = хеш группы сообщений → Конвейер обработки 2 bob, по порядку
  6. У стандартной очереди нет групп, поэтому её сообщения по кругу расходятся по конвейерам обработки
  7. Реплики сервиса опрашивают одну очередь, и SQS отдаёт каждое сообщение одной из них

Поток подписки выдаёт по одному сообщению. Без workers один цикл вызывает обработчик для каждого сообщения по очереди, и ничего не выполняется параллельно. workers(n) выполняет до n обработчиков одновременно, без определённого порядка.

workers(n, by_key) запускает n конвейеров обработки, и сообщение попадает в тот конвейер, на который указывает хеш его ключа. Ключ - заголовок PARTITION_KEY_HEADER сообщения, в котором хранится его группа сообщений FIFO. Поэтому группа никогда не делится между двумя конвейерами обработки, и порядок, который Группы соблюдают в очереди, сохраняется и в сервисе. Если конвейеров меньше, чем групп, каждый из них обслуживает несколько групп. У стандартной очереди групп нет, поэтому у её сообщений нет ключа, и они по кругу расходятся по конвейерам обработки.

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

Несколько реплик сервиса или несколько подписок на одну очередь конкурируют за её сообщения: SQS отдаёт каждое сообщение одной из них. Транспорт внутри процесса сохраняет порядок стандартной очереди, а SQS нет, поэтому тест, который проверяет порядок, использует очередь FIFO.

Обработчик пакетов берёт по одному получению за раз, не больше размера, заданного в точке монтирования, и не больше десяти, поэтому пакет часто меньше этого размера.