IOSOR База знань

Ідемпотентність send API: дублі, retry і гроші

Гід для розробників prepaid send API — ключі ідемпотентності, безпечні retry, захист від дублів і correlation, зручна для ledger, щоб помилки інженерії не ставали фінансовим інцидентом.

Тайм-аути трапляються. Балансувальники роблять повторні спроби. Мобільні клієнти натискають кнопки двічі. Без ідемпотентності продукт «надіслати один раз» перетворюється на подвійне списання з балансу та дублювання OTP. Цей гайд призначений для інженерів та технічних лідів, що інтегрують white-label API — де кожен дубль видно в гаманці. IOSOR очікує інтеграцій, що враховують рух коштів: автентифіковані виклики, зіставні дебети та помилки клієнта, які ніколи не видають дані сторонніх брендів. При обороті від 1 000 USD на місяць дисципліна виключення дублів стає обов'язковою. Ставтеся до кожної відправки спочатку як до події в реєстрі, а потім як до мережевого виклику.

Чому дублі стають грошовою проблемою

Режим відмови Що бачить користувач Що бачить гаманець
Тайм-аут + сліпий ретрай Два OTP / два алерти Два списання
Неідемпотентний webhook Подвійні побічні ефекти Плутанина у статусах
Ресенд поверх авто-ретрая Роздратування користувача Множення витрат
Відсутність кореляції Тікети «не спрацювало» Незведені рядки

Ключі ідемпотентності, що переживають retry

Серйозний шлях відправки приймає ключ, згенерований клієнтом, який є унікальним для бізнес-цілі, а не для спроби TCP. Він має повертати той самий результат при повторі в межах вікна TTL. Це запобігає прихованому створенню другого списання за ту саму операцію. Ключ має логуватися поруч із ID повідомлення та посиланням на платіж. Він зобов'язаний працювати через тайм-аути, ретраї шлюзів та ручні перезапуски.

Бюджети retry vs user resend

Автоматичним ретраям потрібен бюджет: ліміт спроб, експоненціальна затримка та список кодів помилок. Повторна відправка користувачем — це інша дія продукту зі своїми лімітами та вартістю. Змішування цих понять перетворює нестабільну мережу на фінансовий інцидент. Пов'яжіть обидва процеси з перевіркою балансу та чіткими причинами відмови. Опублікуйте, які HTTP-статуси безпечно ретраїти, а які потребують втручання людини. Ось пастка: вважати, що помилка 500 означає «не надіслано».

Чекліст buyer / engineering

  1. Документована семантика ключів ідемпотентності та їх TTL.
  2. Тест на повтор, що доводить одне списання на одну ціль.
  3. Розділення бюджету авто-ретраїв та логіки ресенду користувачем.
  4. Correlation ID у запитах, статусах повідомлень та реєстрі.
  5. Стейджинг на реальних коридорах — моки не замінюють запуск.
  6. Гігієна ключів та мінімальні привілеї для облікових даних.
  7. Обробка кодів 429 та 503 без втрати оригінального ключа.
  8. Автоматичні алерти на високий рівень відмов за дублікатами.

Червоні прапорці

  • Порада «просто ретрай до переможного 200» без використання ключів.
  • Обробники вебхуків, які не ідемпотентні та запускають дії двічі.
  • Повні секретні ключі або токени в логах або тікетах підтримки.
  • Помилки, що виводять внутрішні трейси або дані апстрім-брендів користувачу.
  • Відсутність можливості довести фінансам, що дубль був відвернутий.
  • Використання тільки часових міток для забезпечення унікальності.

Старт з IOSOR

У консолі відправлення випустіть один OTP або алерт із клієнтським ключем ідемпотентності.

Як правильно налаштувати ліміти запитів API? · Що варто знати про стандарти E164 та NANP? · Як захистити ключі вебхуків під час запуску?

Підсумок IOSOR

Робіть: спочатку подія ledger, потім мережа. Ключ унікальний на бізнес-намір, не на TCP-спробу. Автоповтор має бюджет; кнопка «надіслати ще» — інша дія зі своєю prepaid-ціною.

Не робіть: молотити до 200 без ключа й давати webhook без ідемпотентності другий побічний ефект. Два OTP на одне натискання — грошовий баг, не мережева казка.

Чи був матеріал корисним?

Пов’язані гіди