Как проверять корректность работы сервиса и обработку сообщений по разным приоритетам вовремя
Что проверяют
Два навыка сразу: как вы тестируете асинхронную обработку и как доказываете, что приоритеты соблюдаются под нагрузкой, а не только на пустой очереди. Следом обычно спрашивают, что будет с низким приоритетом, если высокий идёт непрерывно.
Как отвечать
Сначала уточните, что значит «вовремя»: у каждого приоритета свой целевой срок, например высокий обработан за 5 секунд в 99% случаев, низкий за 5 минут. Без этого проверять нечего.
Дальше три уровня:
- логика: юнит-тесты обработчиков без брокера. Если приоритеты реализованы внутри сервиса через
asyncio.PriorityQueueилиheapq, тест кладёт сообщения вперемешку и проверяет порядок. Время подменяют черезtime-machineилиfreezegun, а не ждутsleep; - интеграция: настоящий RabbitMQ в testcontainers, очередь с аргументом
x-max-priorityзабивается низким приоритетом, затем приходит высокий, и тест проверяет, что он обработан первым. У Kafka приоритетов нет, там заводят отдельные топики и консьюмеры; - нагрузка: постоянный поток высокого приоритета и проверка, что низкий не голодает.
В продакшене своевременность видна по метрикам. В сообщение кладут время создания и считают задержку до конца обработки как Histogram из prometheus_client с меткой приоритета, рядом длина очереди и возраст самого старого сообщения, алерты в Grafana на превышение срока.
Если у вас Celery, назовите ловушку с prefetch: воркер заранее забирает пачку задач, и приоритет на них уже не действует. Для приоритетов ставят worker_prefetch_multiplier = 1 и task_acks_late = True.
Где спотыкаются
Проверяют приоритеты на пустой очереди. Приоритет влияет, только когда сообщения копятся, иначе всё обрабатывается сразу и тест ничего не доказывает.
Забывают про голодание. Строгий приоритет при постоянной нагрузке может не дать низкому ни одного шанса, нужны отдельные воркеры, веса или повышение приоритета со временем.
Меряют время только внутри обработчика. Пользователю важно время от отправки до результата, а основная задержка обычно сидит в ожидании в очереди.