+− THE DAILY DIFFdev & AI news
SHIP IT

Stripe si pamatuje váš požadavek, když zmizí odpověď

Časový limit může zanechat platbu nejistou poté, co server dokončil operaci.

Časový limit může zanechat platbu nejistou poté, co server dokončil operaci. Tento vysvětlující článek „Under the Hood“ využívá zdokumentovanou idempotenci smlouvy Stripe API v1 k zobrazení stabilních operačních klíčů, přehrávání uložených odpovědí, limitů parametrů a souběžnosti, horizontu uchovávání a sladění výsledků.

Přečtěte si psané vydání (anglicky) ↗

Co toto video pokrývá

  • Idempotence se týká zamýšleného účinku opakování operace. Stripe API v1 přidává zdokumentovanou smlouvu o přehrávání uložených odpovědí.
  • Opakování stejné logické akce používá stejný klíč a parametry. Operační klíč uchovávejte napříč samostatnými voláními SDK nebo restarty aplikace; skutečně nová akce potřebuje svůj vlastní klíč.
  • Jakmile se spustí provádění koncového bodu, Stripe API v1 uloží stav a tělo prvního požadavku, včetně chyb 500, a vrátí tuto uloženou odpověď při opakováních.
  • Změněné parametry se stejným klíčem vedou k neshodě. Selhání ověření a konflikty souběžného provádění neuloží žádný idempotentní výsledek pro tento pokus a lze je opakovat.
  • Stripe uchovává klíče API v1 po dobu nejméně 24 hodin a poté je může odstranit. Omezte nevyřešená opakování sítě na prvních 24 hodin, poté zastavte a slaďte před opakováním operace.
  • Uložená chyba 500 se může přehrávat i po obnovení připojení. Původní operace mohla mít vedlejší účinky; pro zjištění jejího výsledku použijte příslušný objekt, požadavek na Dashboard a webhooks.
  • API v2 používá jinou sémantiku přehrávání. Klíč nezajišťuje univerzální doručení přesně jednou pro e-mail, inventář a každou operaci lokální databáze.

Přeložený přepis

Přeloženo z původního anglického vyprávění. Dostupné audio a titulky jsou řízeny YouTube.

Zrušil časový limit vaši platbu?

0:00 Myslíte si, že časový limit znamená, že vaše platba selhala. Server může dokončit práci, zatímco odpověď zmizí, a vaše platba sebevědomě nezobrazuje vůbec nic. Proč může opakování znovu účtovat? Jak si Stripe pamatuje pokus? Kdy byste měli přestat s opakováním? A mějte na paměti jeden nepříjemný detail. Zapamatovaná chyba může přežít problém se sítí.

0:17 K tomu se ještě vrátíme. Toto je The Daily Diff, pod pokličkou.

Co identifikuje klíč idempotence?

0:21 Idempotence znamená, že opakování operace má stejný zamýšlený účinek jako provedení jí jednou. Klíč idempotence označuje jednu logickou akci. Verze jedna API Stripe rozpozná toto označení při opakováních a přehraje uloženou odpověď. Představte si, že kupujete kávu. Stripe dokončí vaši platební žádost a odpověď se ztratí při návratu domů. Zákazník vidí načítací kolečko. Jejich banka může mít vzrušující interpretaci. Nechráněný požadavek na vytvoření může opakovat vedlejší účinek.

Jak stejný klíč zajišťuje bezpečné opakování?

0:45 Před prvním pokusem připojte jedinečný klíč a uchovejte ho pro opakování. Pokud se vaše aplikace restartuje, uchovejte tento klíč s operací ve svých záznamech. Pro API verze jedna Stripe, jakmile se spustí provádění koncového bodu, stav a tělo prvního požadavku jsou uloženy. Pošlete znovu stejný klíč a parametry a Stripe vrátí uloženou odpověď. Káva zůstane na místě, zatímco její účtenka cestuje znovu.

Co přesně Stripe ukládá?

1:07 Zde je skutečné znění Stripe. Opakování se stejným klíčem vrátí uloženou odpověď, včetně chyb pět set. Dokumentace dělá více práce než váš optimisticky pojmenovaný pomocník pro opakování. Zákazník znovu klepne. Vaše aplikace rozhodne, zda se tím obnoví čekající nákup nebo začne další jeden. Skutečně nová káva dostane nový klíč. Nový klíč pro každé opakování sítě zruší ochranu.

1:27 Různé parametry se stejným klíčem spustí neshodu.

Co se stane, když se požadavek změní?

1:30 Pokud parametry selžou ověření, nebo jiný požadavek s tímto klíčem stále probíhá, Stripe neuloží žádný idempotentní výsledek pro tento pokus. Tyto požadavky lze opakovat. Závodní požadavek dostane konflikt. Toto jsou pravidla verze jedna. Verze dva se chová jinak. Hlavička nemůže slíbit doručení přesně jednou napříč vaším systémem. E-mail, inventář a vaše databáze potřebují každá zpracování selhání.

1:52 Klíč chrání operaci v rámci jejího zdokumentovaného rozsahu. Stripe uchovává klíče verze jedna po dobu nejméně dvaceti čtyř hodin a může je

Jak dlouho je zapamatovaný výsledek bezpečný pro opakování?

1:59 poté odstranit. Odstraněný klíč může spustit nový požadavek. Nevyřešená opakování držte v rámci prvního dne. Kromě toho zastavte a slaďte původní výsledek. Použijte exponenciální zpoždění a jitter, abyste dali serveru prostor k dýchání. Jinak se opakování tvoří frontou před hořící kavárnou. Knihovny Stripe zpracovávají opakování, ale zkontrolujte výchozí nastavení vaší knihovny. Tou lepivou chybou je háček.

Proč se zapamatovaná chyba může neustále vracet?

2:20 Uložená odpověď pět set se přehrává i po obnovení připojení. Původní operace mohla vyvolat vedlejší účinky. Vyřešte její výsledek pomocí objektů, Dashboardu a webhooků. Nový klíč může opakovat akci. Pokud si to raději přečtete, než abyste to slyšeli ode mě, diff vám přistane ve schránce každé ráno, zdarma na the daily diff dot dev, odkaz níže.

Poslal bych tlačítko pro opakování s touto smlouvou?

2:39 Verdikt, pod pokličkou. ODESLAT. Odeslal bych stabilní klíče s omezenými opakováními a sladěním, aby zákazníci dostali kávu, aniž by financovali vaše vzdělání v distribuovaných systémech. A to je dnešní diff. Jsem Niko z Axrisi. Spojujte zodpovědně.

Zdroje

  1. Idempotent requestsStripe Docs
  2. Designing robust and predictable APIs with idempotencyStripe Engineering — Brandur Leach
  3. Advanced error handlingStripe Docs
  4. HTTP Semantics — RFC 9110 §9.2.2 Idempotent MethodsIETF / RFC Editor

Související videa