Настройка Yandex Message Queue для асинхронной обработки в Yandex Cloud

Пиковый поток заявок роняет сервисы, а часть сообщений теряется по дороге. Мы настраиваем асинхронный обмен через очереди под ключ: развязываем сервисы, сглаживаем пики и выстраиваем повторную обработку. Заявки перестают теряться, а нагрузка на команду разборов падает в разы.
Часто задаваемые вопросы

Yandex Message Queue: где ломается асинхронная обработка

Под нагрузкой асинхронная обработка ломается не в очереди, а до неё. Пока сервис оформления заказа синхронными вызовами дёргает платежи, склад и отправку писем, время ответа складывается из всех участников — самый медленный из них задаёт общий таймаут. В пиковые часы поток заявок вырастает в разы, вызовы начинают отваливаться по таймауту, и заявка исчезает на середине цепочки.

Дальше начинается ручной «догон»: оператор сверяет журналы операций, ищет заявки без подтверждения и заводит их повторно. Чем выше трафик, тем больше расхождений между системами — часть задач потеряна, часть обработана дважды. Каждая такая итерация — это часы инженерного времени и подорванное доверие клиента.

Очередь сообщений вроде Yandex Message Queue разрывает эту связь: отправитель публикует задачу и сразу отвечает клиенту, а получатели разбирают её в своём темпе. Надёжная доставка сообщений держится на подтверждениях — если обработчик упал, необработанное сообщение возвращается в очередь, а не пропадает. Дополнительно настраиваем повторные попытки, отложенный разбор сбойных сообщений и защиту от дублей, чтобы повтор не создавал вторую заявку.

Таймауты пикового трафика перестают быть потерей заявок — они превращаются в задержку на секунды. Ниже разбираем, как это закрывается на практике.

Что даёт развязка сервисов и как её измерять

Когда обработчик вызывается синхронно, время ответа сервиса равно времени самого медленного шага, а его падение становится падением всего сервиса. Очередь в Yandex Message Queue ставит между ними буфер, и дальше каждый эффект развязки считается в цифрах.

Буферизация пиков

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

Изоляция сбоя обработчика

Ошибка в потребителе больше не роняет приём: сообщения остаются в очереди, а сервис на входе продолжает отвечать. Время восстановления сводится к перезапуску обработчика — недоставленные задачи не теряются и не требуют ручного воспроизведения.

Повторные попытки доставки

Число попыток и пауза между ними задаются явно, после исчерпания сообщение уходит в очередь необработанных. Сбой на разборе одного типа сообщений не приводит к их исчезновению: доля потерянных задач видна в метриках и остаётся управляемой.

Независимое масштабирование обработчиков

Число потребителей меняется отдельно от входного сервиса: при росте длины очереди обработчики добавляются, при опустошении снимаются. Разбор ускоряется пропорционально нагрузке, при этом входной сервис не пересобирается и не перевыпускается.

Стандартные и упорядоченные очереди: что выбрать

Режим доставки в Yandex Message Queue выбирают не по привычке, а по схеме потоков. Если события независимы и потребители обрабатывают их в любом порядке, порядок навязывать не нужно: параллельные обработчики забирают столько сообщений, сколько успевают, и пропускная способность растёт вместе с их числом — достаточно добавить потребителей в группу.

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

Вариант Когда подходит Ограничения
Стандартная очередь Независимые события: рассылки, журналы, фоновые задания, порядок обработки не важен Порядок не гарантирован, возможны повторы доставки — обработчик должен быть идемпотентным
Упорядоченная с ключом группы Порядок важен внутри объекта: статусы заказа, операции по одному счёту Порядок только в пределах группы, ограничения на число групп и скорость в каждой
Упорядоченная с одним потоком Строгая последовательность по всему потоку при небольшом объёме Низкая пропускная способность, обработчики не масштабируются горизонтально

Выбор начинается с расчёта: сколько сообщений в секунду, сколько независимых ключей, что произойдёт при повторной обработке. Если ключей много и они не пересекаются, упорядоченный режим отдаёт почти ту же пропускную способность, что и стандартный. Если ключ один или повторы безобидны — берём стандартную очередь и добавляем обработчиков.

Этапы настройки: от схемы потоков до приёмки

Работы идут фиксированными этапами, и каждый заканчивается артефактом, который можно проверить до перехода к следующему — конфигурацией, схемой или протоколом проверки. Сбой на любом шаге виден до того, как он попадёт в продуктивный контур.

  1. Аудит обмена данными. Собираем производителей и потребителей сообщений, текущие способы передачи, объёмы и пиковые профили. Отдельно фиксируем места, где сообщения теряются или обрабатываются дважды.
  2. Схема потоков сообщений. Проектируем маршруты: какое событие в какую очередь идёт, что происходит при ошибке обработчика, где важен порядок доставки. Схема согласуется до начала настройки.
  3. Настройка очередей и прав. Заводим очереди Yandex Message Queue под каждый поток, задаём срок видимости сообщения, время хранения и очередь недоставленных. Доступы раздаём сервисным аккаунтам по минимально необходимому набору.
  4. Проверка под нагрузкой. Прогоняем профиль, близкий к пиковому: смотрим рост глубины очереди, долю повторных обработок и поведение системы при остановке одного из потребителей.
  5. Наблюдаемость и алерты. Настраиваем метрики глубины очереди, задержки доставки и числа ошибок, выставляем пороги уведомлений, чтобы деградация ловилась раньше жалоб пользователей.
  6. Передача в эксплуатацию. Отдаём конфигурацию, регламент реакции на инциденты и инструкции по добавлению новых потоков; при необходимости дежурим на первых релизах.

Конфигурации, схемы и регламенты: что передаём на руки

Передаём не скриншоты настроек, а комплект артефактов по Yandex Message Queue: по нему очередь поднимается в новой среде, а инцидент разбирается без звонка автору. Всё хранится в репозитории рядом с кодом — изменения проходят ревью и попадают в среду тем же путём, что и релиз сервиса.

  • Конфигурация очередей — описания очередей и подписок: тип очереди, период хранения сообщений, окно невидимости, размер пакета, таймауты. Значения выведены из профиля нагрузки, а не выставлены на глаз.
  • Схема потоков данных — поставщик, потребитель, маршрут результата, точки повторной обработки. Помечены места, где поток может дублироваться, и как потребитель это переносит.
  • Политики доступа и роли — какие сервисные учётные записи пишут и читают, что именно им разрешено, где ключи с ограниченным сроком жизни. Права разведены по минимуму.
  • Обработка сбойных сообщений — правила повторных попыток, порог перевода в очередь сбойных сообщений, порядок разбора и возврата в поток после исправления.
  • Метрики и оповещения — сигналы о накоплении очереди, росте доли повторов и отказе потребителя, с порогами, при которых дежурный получает уведомление.
  • Регламент эксплуатации — что проверяет дежурная смена, как править конфигурацию без потери сообщений, как откатить изменение и что делать при отказе потребителя.

Разбор внедрения: пиковый поток заявок без потерь

Что было до перестройки

Заявки принимал синхронный сервис: форма отдавала запрос прямо в обработчик, и ответ клиенту зависел от того, успел ли тот отработать. Пока поток ровный, узкое место обработки не проявлялось — но в дни акций и рассылок число заявок подскакивало в разы, обработчик не успевал, а часть запросов терялась ещё на входе: пользователь видел ошибку и не повторял отправку. В пиковые дни доля потерянных заявок доходила до 3–4%, и разбирали их вручную — выгружали журналы и дописывали пропущенное.

Что перестроили

Между приёмом и обработкой поставили очередь на базе Yandex Cloud. Приёмник только фиксирует заявку и подтверждает приём, а обработчики забирают сообщения в своём темпе. Подтверждение уходит в очередь лишь после успешного завершения: если обработчик упал, сообщение вернётся и будет обработано повторно. Для заявок, которые не проходят с нескольких попыток, завели отдельную очередь разбора, чтобы сбойное сообщение не блокировало остальные. Обработчики масштабируются по длине очереди, а ключ заявки защищает от дублей.

Что стало

Доля потерянных заявок ушла в ноль в пределах окна повторной доставки: запрос не «сгорает», даже если сервис перезапускается в самый пик. Накопившийся поток задач, который раньше разбирали почти полный рабочий день, теперь уходит за минуты. Ручных вмешательств стало заметно меньше — вместо ночных дежурств на разбор пропусков остались единичные сообщения из очереди разбора.

Что делать, если обмен между сервисами уже работает напрямую

Прямой вызов сервиса работает, пока отказ получателя виден сразу: поставщик держит соединение и повторяет запрос. То же свойство превращает перегрузку одного участка в отказ всей цепочки. Очередь разрывает связь: сообщение принято и хранится, пока получатель не будет готов его обработать.

Переходить на асинхронный обмен целиком за один раз не нужно. В Yandex Cloud первыми переводят участки, где ответ не требуется в той же сессии: события, уведомления, выгрузки, пересчёт справочников. Запросы, от которых зависит интерфейс пользователя, остаются прямыми.

Участок Схема При отказе получателя
События, уведомления, выгрузки Очередь Сообщение остаётся в очереди до восстановления
Запросы для интерфейса Прямой вызов Поставщик видит ошибку и отдаёт её пользователю
Пакетный пересчёт, отчёты Очередь Задача не теряется, сроки сдвигаются
Операции с однократной обработкой Очередь с подтверждением Повторная доставка гасится ключом операции

Две схемы одновременно живут за счёт маршрутизации по типу операции: поставщик решает, куда отправить вызов, и развилка описана в конфигурации, а не размазана по коду. Для очереди задаются повторные попытки, отложенная доставка и очередь необработанных сообщений — прямой вызов этого не даёт вовсе.

Начинать удобно с одного сервиса-получателя и одной группы потребителей — тогда видно реальную глубину очереди и время обработки. Откат дешёвый: переключатель на стороне поставщика возвращает прямой вызов, старая ветка работает до конца переходного периода.

Ограничения, квоты и типичные ошибки асинхронной обработки

Очередь не бесконечна: есть предел по числу сообщений и объёму, а у каждого сообщения — время удержания, после которого оно удаляется независимо от того, обработал его потребитель или нет. Слишком короткое удержание — сообщения пропадают на середине задачи, и события не доходят до потребителя. При всплеске нагрузки очередь упирается в предел, публикация отклоняется — данные теряются ещё на входе.

Вторая ошибка — расчёт на однократную доставку. Yandex Message Queue держит гарантию «как минимум один раз»: при перезапуске потребителя или превышении окна видимости сообщение приходит повторно. Без идемпотентной обработки это даёт дубли операций — двойные списания, повторные письма, разъехавшиеся счётчики.

Окно видимости — ключевой компромисс: короткое рождает дубли, длинное — застрявшие задачи, которые не переобрабатываются часами. Хуже всего, когда за очередью не следят: контроль глубины и возраста самого старого сообщения показывает, что потребители не успевают или падают, задолго до жалоб пользователей. И отдельная очередь для сообщений, не обработанных после нескольких попыток, — иначе они зацикливаются или пропадают бесследно.

Как отличить переполнение из-за неверного времени удержания от обычной нехватки потребителей?

Сопоставьте время удержания с фактической длительностью обработки по метрикам и посмотрите на возраст старейшего сообщения: если он мал, а очередь растёт — потребители не успевают, нужны новые обработчики. Если сообщения исчезают, не дождавшись обработки, — удержание выставлено слишком коротко. Его берут с запасом на пиковую длительность задачи, а «хвосты» уводят в отдельную очередь необработанных.

Обсудим задачу: с чего начнём и что нужно от вас

Для постановки задачи не нужен многотомный документ — достаточно описания потоков, примеров сообщений и требований к надёжности. По ним уже видно, какой режим очереди подходит, сколько потребителей держать и где нужны повторы.

  • Описание потоков данных: кто публикует сообщения, кто читает, что считается успешной обработкой и куда уходит результат.
  • Примеры сообщений: структура тела, размер, частота и пиковые часы — по ним считаем пропускную способность очереди.
  • Требования к порядку: важна ли последовательность внутри группы или обработка независима.
  • Требования к надёжности: допустимая задержка доставки, разумное число повторов и правила разбора сбойных сообщений.

Наши компетенции:

Последние работы

  • Разработка сайта компании B2B ADVANCE
    Разработка сайта компании B2B ADVANCE
    1542
  • Разработка веб-приложения для компании FEEDME
    Разработка веб-приложения для компании FEEDME
    1393
  • Разработка веб-сайта для компании БЕЛФИНГРУПП
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    1081
  • Разработка интернет магазина для компании FURNORO
    Разработка интернет магазина для компании FURNORO
    1368
  • Разработка логотипа компании B2B Advance
    Разработка логотипа компании B2B Advance
    815
  • Разработка веб-приложения для компании Enviok
    Разработка веб-приложения для компании Enviok
    1139