Stripe помни вашата заявка, когато отговорът изчезне
Изтичането на времето може да остави плащането несигурно, след като сървърът е завършил операцията.
Изтичането на времето може да остави плащането несигурно, след като сървърът е завършил операцията. Този обяснителен материал „Под капака“ използва документирания договор за идемпотентност на Stripe API v1, за да покаже стабилни ключове за операции, повторно възпроизвеждане на запазен отговор, ограничения на параметрите и едновременността, хоризонт на съхранение и съгласуване на резултатите.
Прочетете писменото издание (английски) ↗
Какво обхваща този видеоклип
- Идемпотентността касае предвидения ефект от повтаряне на операция. Stripe API v1 добавя документиран договор за повторно възпроизвеждане на запазен отговор.
- Повторен опит за същото логическо действие използва същия ключ и параметри. Запазете ключа на операцията при отделни извиквания на SDK или рестартиране на приложението; едно наистина ново действие се нуждае от свой собствен ключ.
- След като започне изпълнението на крайната точка, Stripe API v1 запазва статуса и тялото на първата заявка, включително грешки 500, и връща този запазен отговор при повторни опити.
- Променени параметри със същия ключ водят до несъответствие. Неуспехите при валидация и конфликтите при едновременно изпълнение не запазват идемпотентен резултат за този опит и могат да бъдат повторени.
- Stripe съхранява API v1 ключове за поне 24 часа и може да ги изтрие след това. Ограничете неразрешените мрежови повторни опити до първите 24 часа, след което спрете и съгласувайте, преди да повторите операцията.
- Кеширана грешка 500 може да продължи да се възпроизвежда, след като свързаността се възстанови. Оригиналната операция може да има странични ефекти; използвайте съответния обект, заявка в таблото и уебкукове, за да установите нейния резултат.
- API v2 използва различна семантика за повторно възпроизвеждане. Един ключ не установява универсална еднократна доставка за имейл, инвентар и всяка операция с локална база данни.
Преведен препис
Преведено от оригиналния английски разказ. Наличните аудио и субтитри се контролират от YouTube.
Отмени ли изтичането на времето плащането ви?
0:00 Смятате, че изтичането на времето означава, че плащането ви е неуспешно. Сървърът може да завърши, докато отговорът изчезва, оставяйки вашето плащане уверено да показва абсолютно нищо. Защо един повторен опит може да начисли отново? Как Stripe помни един опит? Кога трябва да спрете да опитвате отново? И имайте предвид един неприятен детайл. Запомнена грешка може да надживее мрежовия проблем.
0:17 Ще се върнем на това. Това е The Daily Diff, под капака.
Какво идентифицира един ключ за идемпотентност?
0:21 Идемпотентността означава, че повтарянето на операция има същия предвиден ефект като извършването ѝ веднъж. Един ключ за идемпотентност е етикет за едно логическо действие. Stripe API версия едно разпознава този етикет при повторни опити и възпроизвежда запазен отговор. Представете си, че купувате кафе. Stripe завършва вашата заявка за плащане и отговорът се губи при връщане у дома. Клиентът вижда индикатор за зареждане. Тяхната банка може да има по-вълнуваща интерпретация. Една незащитена заявка за създаване може да повтори страничния ефект.
Как същият ключ прави повторния опит безопасен?
0:45 Прикрепете уникален ключ преди първия опит и го запазете за повторни опити. Ако приложението ви се рестартира, запазете този ключ с операцията във вашите записи. За API на Stripe версия едно, след като започне изпълнението на крайната точка, статусът и тялото на първата заявка се запазват. Изпратете отново същия ключ и параметри и Stripe връща запазения отговор. Кафето остава на мястото си, докато касовата му бележка пътува отново.
Какво точно запазва Stripe?
1:07 Ето действителната формулировка на Stripe. Повторните опити със същия ключ връщат запазения отговор, включително петстотин грешки. Документацията върши повече работа от вашия оптимистично наречен помощник за повторни опити. Клиентът докосва отново. Вашето приложение решава дали това възобновява чакащата покупка или започва друга една. Едно наистина ново кафе получава нов ключ. Нов ключ за всеки мрежов повторен опит проваля защитата.
1:27 Различни параметри със същия ключ предизвикват несъответствие.
Какво се случва, когато заявката се промени?
1:30 Ако параметрите не преминат валидация или друга заявка с този ключ все още се изпълнява, Stripe не запазва идемпотентен резултат за този опит. Тези заявки могат да бъдат повторени. Една състезаваща се заявка получава конфликт. Това са правилата за версия едно. Версия две се държи различно. Един хедър не може да обещае еднократна доставка за цялата ви система. Имейлът, инвентарът и вашата база данни се нуждаят от обработка на грешки.
1:52 Ключът защитава операцията в рамките на документирания ѝ обхват. Stripe съхранява ключове за версия едно за поне двадесет и четири часа и може да ги изтрие
Колко дълго е безопасно да се повтаря запомненият резултат?
1:59 след това. Един изтрит ключ може да изпълни нова заявка. Дръжте неразрешените повторни опити в рамките на първия ден. След това спрете и съгласувайте оригиналния резултат. Използвайте експоненциален отстъп и джитър, за да дадете на сървъра пространство за дишане. В противен случай повторните опити образуват опашка пред горящ магазин за кафе. Библиотеките на Stripe обработват повторните опити, но проверете настройките по подразбиране на вашата библиотека. Тази упорита грешка е уловката.
Защо една запомнена грешка може да продължава да се връща?
2:20 Кеширан петстотин отговор продължава да се възпроизвежда, след като свързаността се възстанови. Оригиналната операция може да е произвела странични ефекти. Разрешете резултата ѝ, като използвате обекти, таблото и уебкукове. Нов ключ може да повтори действието. Ако предпочитате да прочетете това, отколкото да ме чуете да го казвам, разликата пристига във входящата ви кутия всяка сутрин, безплатно на daily diff dot dev, линк по-долу.
Бих ли използвал бутон за повторен опит с този договор?
2:39 Присъда, под капака. SHIP IT. Бих използвал стабилни ключове с ограничени повторни опити и съгласуване, така че клиентите да получават кафе, без да финансират вашето образование по разпределени системи. И това е разликата за днес. Аз съм Нико от Axrisi. Обединявайте отговорно.
Източници
- Idempotent requestsStripe Docs
- Designing robust and predictable APIs with idempotencyStripe Engineering — Brandur Leach
- Advanced error handlingStripe Docs
- HTTP Semantics — RFC 9110 §9.2.2 Idempotent MethodsIETF / RFC Editor



