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

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

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

Пять понятий, которые нужно разделять

Понятие Рабочее определение Чего оно само по себе не гарантирует
Стабильный идентификатор Долговечное значение, сопоставляющее один и тот же запрос, транзакцию, раунд или ставку Наличие ID не доказывает дедупликацию на стороне сервера
Идемпотентность Ожидается, что повторение одного и того же бизнес-намерения даст тот же итоговый эффект, что и однократная обработка Ответы не обязаны быть текстуально идентичны, и запрос все еще может завершиться ошибкой
Повтор Еще одна попытка в заданных условиях, с ограничением числа попыток и временным бюджетом Постоянная ошибка не станет успешной, а повтор не заменяет поиск состояния
Сверка Сопоставление намерения запроса, бизнес-результата, записей транзакции или раунда и эффекта в реестре Она не принимает автоматически каждое компенсационное решение
Ручная эскалация Уполномоченный сотрудник расследует и принимает решение, когда автоматизация не может безопасно сделать вывод Человеческое суждение не восполняет отсутствующие журналы или определения протокола

HTTP-методы не определяют бизнес-семантику проекта. RFC 9110 определяет PUT, DELETE и безопасные методы как идемпотентные и предостерегает клиентов от автоматического повтора неидемпотентных запросов, если их фактическая семантика не известна как идемпотентная или клиент не может установить, что исходный запрос не был применен. Вызовы платформы, показанные в публичной справке API, используют POST, поэтому безопасное поведение при повторе нельзя выводить только из HTTP-метода.

1. Стабильные идентификаторы: отделяйте трассировку от бизнес-идентичности

Надежному решению обычно нужны как минимум два класса идентификаторов:

  • ID трассировки запроса: сопоставляет одну транспортную попытку с журналами, ответом и диагностическими материалами.
  • ID бизнес-транзакции: идентифицирует одно бизнес-намерение и сопоставляет переводы, движения в реестре, раунды или ставки.

Публичная справка API показывает reqTraceId и в некоторых потоках транзакций поля merchantTransactionId, transactionId, roundId и betId. В ней merchantTransactionId описан как уникальный идентификатор транзакции мерчанта, который может поддерживать сверку.

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

Проект IETF draft-ietf-httpapi-idempotency-key-header-07 предлагал заголовок Idempotency-Key. По состоянию на 9 августа 2026 года эта версия была просрочена и архивирована и не стала RFC. Ее можно рассматривать лишь как исторический входной материал для проектирования, а не как действующий стандарт, протокол AG или доказательство поддержки AG этого заголовка.

2. Повторы: делайте ограниченные попытки только для безопасных операций и сбоев

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

Сценарий Принцип по умолчанию Условие перед автоматическим повтором
Запрос только на чтение или список Можно рассмотреть ограниченный повтор Протокол подтверждает отсутствие побочного эффекта, а сбой является временным
Создание сессии Не создавайте повторно только из-за тайм-аута Явная идемпотентность или поиск существующей сессии по ее исходному идентификатору
Изменение кошелька или перевода По умолчанию сначала проверьте состояние или выполните сверку Подтверждены бизнес-ID, область идемпотентности и поведение при дубликате
Обработка callback Потребитель должен обнаруживать повторные события Обе стороны согласовали стабильный ID события или транзакции для дедупликации
Ошибка параметра, разрешения или подписи Не повторяйте тот же запрос автоматически Исправьте параметр, доступ, часы или учетные данные и примите новое решение
Тайм-аут или разрыв соединения Пометьте результат как неизвестный Сначала выполните запрос по исходному ID; повторяйте только при установленной безопасной семантике

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

3. Экспоненциальная задержка и джиттер: избегайте синхронизированной нагрузки

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

И AWS, и Google документируют ценность задержки и джиттера. Google также ясно указывает, что допустимость повтора зависит от того, допускает ли сбой повтор и является ли операция идемпотентной. Алгоритм задержки не может сделать безопасной неидемпотентную запись и не заменяет общий бюджет повторов.

Избегайте следующих антипаттернов:

  • немедленных или неограниченных циклов повторов;
  • единой политики повторов для каждой HTTP- и бизнес-ошибки;
  • повторов на уровнях шлюза, SDK, сервиса и очереди, которые умножают друг друга;
  • генерации нового ID бизнес-транзакции для каждой попытки, что мешает распознать исходное намерение;
  • журналирования ключей, полных учетных данных или ненужных чувствительных данных при повторах;
  • бесконечного продолжения автоматических повторов после повторяющихся сбоев.

RFC 9110 также требует осторожности с автоматическими повторами: повторный сбой не должен превращаться в неограниченное воспроизведение.

4. Неизвестное состояние: не называйте неопределенность сбоем

Когда запрос покинул вызывающую сторону, но полный бизнес-результат не вернулся, используйте отдельное состояние UNKNOWN. Нейтральный к протоколу поток можно представить так:

NEW -> SENT -> CONFIRMED_SUCCESS
            -> CONFIRMED_FAILURE
            -> UNKNOWN -> QUERY_OR_RECONCILE -> CONFIRMED_SUCCESS
                                           -> CONFIRMED_FAILURE
                                           -> MANUAL_REVIEW

В состоянии UNKNOWN запрашивайте существующие результаты, записи транзакций или движения в реестре по исходному запросу или ID бизнес-транзакции. Если в протоколе нет авторитетного пути поиска, остановите автоматические действия, которые могут продублировать эффект, сохраните контекст и эскалируйте. Не предполагайте сбой.

Метки состояний, API поиска и терминальные состояния должны следовать протоколу сторон. Эта диаграмма — метод проектирования; она не утверждает, что AG реализует именно эти состояния.

5. Сверка: используйте несколько записей, чтобы установить окончательный эффект

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

  • исходное бизнес-намерение и ID трассировки запроса;
  • ID бизнес-транзакции мерчанта или платформы;
  • идентификаторы транзакции, раунда и ставки контрагента;
  • сумму, валюту, направление и интерпретацию времени;
  • бизнес-результат API и последующие записи;
  • движение в реестре, текущий баланс и окончательное состояние обработки.

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

Частота, хранение и допуски зависят от бизнес-риска, объема, модели кошелька и договора. Эта статья не устанавливает фиксированные периоды или пороги AG.

6. Когда ручная эскалация обязательна

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

  • ограниченный бюджет повторов исчерпан, а бизнес-состояние остается неизвестным;
  • один бизнес-ID фигурирует с разными суммами, валютами, счетами или другими критически важными параметрами;
  • результат запроса, запись транзакции и движение в реестре противоречат друг другу;
  • авторитетная запись, определенная протоколом, не найдена или критически важные журналы неполны;
  • предполагаются двойное списание, двойная выплата, несанкционированный доступ или инцидент безопасности;
  • автоматическая компенсация может увеличить финансовое, комплаенс- или клиентское воздействие.

Запись должна включать исходные ID, временную шкалу, уже выполненные действия, доказательства, оценку риска, утверждающее лицо и итоговый результат закрытия. Секреты и учетные данные не должны попадать в текст тикетов.

Одностраничный контрольный список реализации

  • Определите стабильные ID отдельно для трассировки запросов и бизнес-транзакций.
  • Укажите область идемпотентности, поведение при конфликте и семантику ответа на повтор для каждой операции с побочными эффектами.
  • Разделите временные ошибки, постоянные ошибки и неизвестные состояния.
  • Повторяйте автоматически только тогда, когда безопасность повторения подтверждена.
  • Установите тайм-ауты, общий бюджет, ограниченный максимум экспоненциальной задержки и джиттер для допустимых путей.
  • Не допускайте неожиданного умножения повторов на нескольких системных уровнях.
  • Предоставьте поиск или сверку по исходному ID для неизвестных состояний.
  • Сверяйте доказательства по транзакции, раунду, сумме, валюте и реестру.
  • Определите условия остановки автоматизации и владельца ручной эскалации.
  • Тестируйте в staging случаи тайм-аута, потерянного ответа, дублирующей отправки и расхождения записей.

Что в настоящее время можно оценить на этом сайте

  • Публичная справка API показывает идентификаторы запросов и некоторых бизнес-транзакций, раундов и ставок.
  • В примечаниях к интерфейсу требуется оценивать бизнес-результат в теле ответа, а не только HTTP-статус.
  • Запросы к кошельку, транзакциям, раундам и ставкам могут информировать проектирование тестов прослеживаемости и сверки.
  • Текущие страницы описывают единый и переводной кошельки, но проект надежности должен следовать выбранной модели кошелька и формальному протоколу.

Границы, о которых следует помнить

  • Эта страница не утверждает, что все эндпоинты AG POST идемпотентны или что AG поддерживает заголовок Idempotency-Key.
  • Она не выдумывает для AG область дедупликации, хранение, ответы на конфликты, число повторов, параметры задержки или графики сверки.
  • Она не добавляет эндпоинтов запросов, компенсации, состояний или production.
  • Она не обещает нулевых дубликатов, нулевых потерь, абсолютной согласованности, абсолютной безопасности, фиксированной производительности или SLA.
  • Публичные примеры API не являются производственным протоколом, гарантией времени выполнения или записью о допуске проекта в production.

Часто задаваемые вопросы

Можно ли автоматически повторить неудачный POST-запрос?

Не только на основании «неудачи» или POST. Сначала установите, является ли сбой временным, мог ли исходный запрос уже дать эффект и предоставляет ли формальный протокол идемпотентность или поиск по исходному ID. В противном случае операция относится к обработке неизвестного состояния и сверке.

Означает ли тайм-аут, что транзакция не удалась?

Нет. Тайм-аут означает лишь, что вызывающая сторона не получила полный результат вовремя. Сервер мог не начать обработку, все еще обрабатывать запрос либо завершить его успешно или с ошибкой. Выполните запрос или сверку, используя исходный бизнес-ID.

Доказывает ли уникальный ID транзакции идемпотентность?

Нет. Это важная основа для распознавания одного бизнес-намерения, но протокол также должен определять, как сервис хранит и сопоставляет ID, его область и срок действия, конфликты параметров и результат, возвращаемый при повторе.

Должен ли повтор получать новый ID запроса?

Это зависит от того, как протокол отделяет одно бизнес-намерение от транспортной попытки. ID бизнес-транзакции обычно должен оставаться стабильным. Будет ли ID трассировки повторно использоваться или производиться от исходного, должно быть явно зафиксировано в контракте интерфейса, а не выведено из этой статьи или названия поля.

Связанные материалы и следующие шаги

Чтобы спроектировать надежность для конкретной интеграции, используйте раздел «Связаться с нами» и укажите модель кошелька, направление вызова, критически важные бизнес-операции и текущие возможности сверки. Затем AG сможет подтвердить идентификаторы, семантику поиска, границы повторов и владельца эскалации по формальному протоколу, не обещая заранее поведение в production.

Источники и область применения

Соответствующие поля и область страниц приведены в публичной справке API, обзоре Slots API и процессе интеграции. Реализация по-прежнему должна следовать протоколу и наблюдаемому поведению среды, согласованным обеими сторонами.

Общие источники по надежности:

Эти источники объясняют общие паттерны. Они не подтверждают, что AG использует алгоритм, параметры или заголовок какого-либо поставщика. Владельцы API, кошелька, SRE, безопасности и сверки должны проверить семантику проекта и примеры полей.


Нужно превратить это руководство в план проекта?

Материал помогает оценить проект, но не заменяет техническое, договорное, сертификационное или правовое подтверждение.

Связаться с нами