Как сделать идемпотентным запуск сбора данных, если одновременно приходит 10 одинаковых запросов?

Сформируйте устойчивый ключ операции и атомарно создавайте запись запуска с уникальным ограничением. Все десять запросов должны получить один job ID или его уже готовый результат.

Короткий ответ

Что ответить на собеседовании

Сформируйте устойчивый ключ операции и атомарно создавайте запись запуска с уникальным ограничением. Все десять запросов должны получить один job ID или его уже готовый результат.

Подробный разбор

Ответ с пояснениями

Сформируйте устойчивый ключ операции и атомарно создавайте запись запуска с уникальным ограничением. Все десять запросов должны получить один job ID или его уже готовый результат.

Ключ включает область пользователя и параметры; одинаковый ключ с другими параметрами должен отклоняться. Проверка «сначала SELECT, потом INSERT» без уникальности допускает гонку.

В транзакции создайте запуск и, при необходимости, outbox-задание. Проигравшие конкурентные запросы читают существующее состояние. Worker также должен быть идемпотентным, иметь lease/heartbeat и восстановление после сбоя. Одна краткоживущая Redis-блокировка не гарантирует отсутствие дубля после истечения TTL, если первый исполнитель ещё работает.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее