System Design Space

    Глава 17

    Обновлено: 15 февраля 2026 г. в 09:30

    Паттерны консистентности данных и идемпотентность

    Прогресс части0/8

    Как выбирать модель консистентности и реализовывать идемпотентность в API, event processing и фоновых задачах.

    Theory

    CAP теорема

    Консистентность всегда выбирается через компромисс с доступностью и latency.

    Открыть главу

    Паттерны консистентности и идемпотентность позволяют системе безопасно переживать retries, redelivery и частичные сбои. Ключевой принцип: невозможно полагаться только на "идеальную доставку" - система должна быть корректной даже при повторных и неупорядоченных событиях.

    Related

    Jepsen consistency models

    Эмпирическая проверка моделей консистентности и реального поведения распределённых БД под сбоями.

    Открыть главу

    Модели консистентности

    Strong consistency

    Финансовые операции, критичные инварианты, операции с высокой ценой ошибки.

    Выше latency/стоимость и ниже доступность при partition-сценариях.

    Read-your-writes / session consistency

    Пользовательские кабинеты и UX, где важно видеть собственные изменения сразу.

    Нужно учитывать session routing/sticky reads и кэш-валидацию.

    Eventual consistency

    Каталоги, рекомендации, аналитические витрины, асинхронные интеграции.

    Появляется временное рассогласование, требуется UI/бизнес-политика обработки лагов.

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

    Активный паттерн

    Idempotency Key для sync API

    POST/command операции: платежи, создание заказа, выдача инвойса, запуск workflow.

    Как реализовать

    • Клиент передает `Idempotency-Key`, сервер сохраняет key + fingerprint запроса + итог ответа.
    • При повторе с тем же key и тем же payload возвращается исходный результат, а не новая операция.
    • TTL ключа выбирается по бизнес-риску (часто 24-72 часа для финансовых сценариев).

    Риск: Если reused key приходит с другим payload, возвращайте ошибку конфликта, иначе получите скрытые дубли.

    Практические guardrails

    • Идемпотентность защищает от duplicate delivery, но не заменяет контроль конкурентности и инвариантов.
    • Для критичных команд храните не только факт обработки, но и canonical response/reason code для replay.
    • Мониторьте hit-rate повторов, долю dedupe reject и время обработки конфликтов ключей.

    Validation

    Testing Distributed Systems

    Идемпотентность должна подтверждаться тестами duplicate/out-of-order сценариев.

    Открыть главу

    Примеры сценариев использования

    Платежный API

    Повтор запроса после timeout без идемпотентного контракта часто приводит к двойному списанию.

    Failure path

    Client

    timeout + retry

    Payment API

    no idempotency key

    DB

    duplicate charge

    User

    double debit

    Resilient path

    Client

    Idempotency-Key

    API

    dedupe + unique constraint

    Ledger

    single transaction

    API

    status replay

    Что происходит

    • Ключ идемпотентности связывает повторы одного намерения клиента в одну бизнес-операцию.
    • Даже при повторной доставке сервер возвращает тот же результат вместо новой транзакции.
    • Unique constraint и status endpoint закрывают race-сценарии между ретраями.

    Риск: Срок жизни ключа и его scope должны совпадать с бизнес-временем операции.

    Сценарий должен быть корректен при retries, redelivery и out-of-order delivery.

    Практический чеклист

    Для каждого critical command определено, как система обрабатывает duplicate requests.

    У событий есть уникальный identity и consumer deduplication strategy.

    Модель консистентности выбрана осознанно и отражена в API-контрактах/документации.

    Есть reconciliation-процессы для обнаружения и исправления рассогласований.

    Команда тестирует retries, redelivery и out-of-order delivery в integration tests.

    Частый anti-pattern: считать once-only delivery гарантией платформы и не делать операцию идемпотентной.

    Связанные главы

    References