Stripe памятае ваш запыт, калі адказ знікае
Тайм-аўт можа пакінуць афармленне заказу нявызначаным пасля таго, як сервер завяршыў аперацыю.
Тайм-аўт можа пакінуць афармленне заказу нявызначаным пасля таго, як сервер завяршыў аперацыю. Гэты тлумачальнік «Пад капотам» выкарыстоўвае дакументаваны кантракт ідэмпатэнтнасці Stripe API v1, каб паказаць стабільныя ключы аперацый, прайграванне захаванага адказу, абмежаванні параметраў і паралельнасці, гарызонт захавання і ўзгадненне вынікаў.
Чытаць пісьмовае выданне (англійская) ↗
Што ахоплівае гэта відэа
- Ідэмпатэнтнасць датычыцца меркаванага эфекту паўтарэння аперацыі. Stripe API v1 дадае дакументаваны кантракт прайгравання захаванага адказу.
- Паўторная спроба таго ж лагічнага дзеяння выкарыстоўвае той жа ключ і параметры. Захоўвайце ключ аперацыі пры асобных выкліках SDK або перазапусках праграмы; сапраўды новае дзеянне патрабуе ўласнага ключа.
- Пасля пачатку выканання канчатковай кропкі Stripe API v1 захоўвае статус і цела першага запыту, уключаючы памылкі 500, і вяртае гэты захаваны адказ пры паўторных спробах.
- Змененыя параметры з тым жа ключом прыводзяць да неадпаведнасці. Памылкі праверкі і канфлікты адначасовага выканання не захоўваюць ідэмпатэнтны вынік для гэтай спробы і могуць быць паўтораны.
- Stripe захоўвае ключы API v1 мінімум 24 гадзіны і можа выдаліць іх пасля. Абмяжуйце невырашаныя сеткавыя паўторныя спробы першымі 24 гадзінамі, затым спыніцеся і ўзгадніце, перш чым паўтараць аперацыю.
- Кэшаваная памылка 500 можа працягваць прайгравацца пасля аднаўлення злучэння. Арыгінальная аперацыя магла мець пабочныя эфекты; выкарыстоўвайце адпаведны аб'ект, запыт у Dashboard і вэбхукі для ўстанаўлення яе выніку.
- API v2 выкарыстоўвае іншую семантыку прайгравання. Ключ не забяспечвае ўніверсальную дастаўку «дакладна адзін раз» для электроннай пошты, інвентара і кожнай лакальнай аперацыі з базай дадзеных.
Перакладзеная стэнаграма
Перакладзена з арыгінальнай англійскай агучкі. Даступнае аўдыя і субтытры кантралююцца YouTube.
Ці адмяніў тайм-аўт ваш плацёж?
0:00 Вы думаеце, што тайм-аўт азначае, што ваш плацёж не атрымаўся. Сервер можа завяршыць працу, пакуль адказ знікае, пакідаючы ваша афармленне заказу ўпэўнена адлюстроўваць абсалютна нічога. Чаму паўторная спроба можа зноў зняць грошы? Як Stripe запамінае спробу? Калі вы павінны спыніць паўторныя спробы? І майце на ўвазе адну непрыемную дэталь. Запомненая памылка можа перажыць праблему з сеткай.
0:17 Мы вернемся да гэтага. Гэта The Daily Diff, пад капотам.
Што ідэнтыфікуе ключ ідэмпатэнтнасці?
0:21 Ідэмпатэнтнасць азначае, што паўторнае выкананне аперацыі мае той жа меркаваны эфект, што і выкананне яе адзін раз. Ключ ідэмпатэнтнасці пазначае адно лагічнае дзеянне. Першая версія API Stripe распазнае гэты ярлык пры паўторных спробах і прайгравае захаваны адказ. Уявіце, што вы купляеце каву. Stripe завяршае ваш запыт на аплату, і адказ губляецца пры вяртанні дадому. Кліент бачыць спінер. Іх банк можа мець больш захапляльную інтэрпрэтацыю. Неабаронены запыт на стварэнне можа паўтарыць пабочны эфект.
Як той жа ключ робіць паўторную спробу бяспечнай?
0:45 Далучыце ўнікальны ключ перад першай спробай і захавайце яго для паўторных спроб. Калі ваша праграма перазапускаецца, захавайце гэты ключ разам з аперацыяй у вашых запісах. Для API Stripe версіі адзін, як толькі пачынаецца выкананне канчатковай кропкі, статус і цела першага запыту захоўваюцца. Адпраўце той жа ключ і параметры зноў, і Stripe верне захаваны адказ. Кава застаецца на месцы, пакуль яе квітанцыя зноў падарожнічае.
Што менавіта захоўвае Stripe?
1:07 Вось дакладная фармулёўка Stripe. Паўторныя спробы з тым жа ключом вяртаюць захаваны адказ, уключаючы пяцьсот памылак. Дакументацыя робіць больш працы, чым ваш аптымістычна названы памочнік паўторнай спробы. Кліент націскае зноў. Ваша праграма вырашае, ці аднаўляе гэта адкладзеную куплю, ці пачынае іншую Адна сапраўды новая кава атрымлівае новы ключ. Новы ключ для кожнай сеткавай паўторнай спробы знішчае абарону.
1:27 Розныя параметры з тым жа ключом выклікаюць неадпаведнасць.
Што адбываецца, калі запыт змяняецца?
1:30 Калі параметры не праходзяць праверку, або іншы запыт з гэтым ключом усё яшчэ выконваецца, Stripe не захоўвае ідэмпатэнтны вынік для гэтай спробы. Гэтыя запыты могуць быць паўтораны. Запыт, які "гоніцца", атрымлівае канфлікт. Гэта правілы версіі адзін. Версія два паводзіць сябе па-іншаму. Загаловак не можа абяцаць дастаўку «дакладна адзін раз» па ўсёй вашай сістэме. Электронная пошта, інвентар і ваша база дадзеных патрабуюць апрацоўкі збояў.
1:52 Ключ абараняе аперацыю ў рамках яе дакументаванага аб'ёму. Stripe захоўвае ключы версіі адзін мінімум дваццаць чатыры гадзіны і можа выдаляць
Як доўга запомнены вынік бяспечна паўтараць?
1:59 іх пасля. Выдалены ключ можа выканаць новы запыт. Захоўвайце невырашаныя паўторныя спробы на працягу першага дня. Пасля гэтага спыніцеся і ўзгадніце першапачатковы вынік. Выкарыстоўвайце экспанентнае адступленне і джытэр, каб даць серверу час для перадышкі. У адваротным выпадку паўторныя спробы ўтвараюць чаргу каля палаючай кавярні. Бібліятэкі Stripe апрацоўваюць паўторныя спробы, але праверце налады вашай бібліятэкі па змаўчанні. Гэтая ліпкая памылка — загвоздка.
Чаму запомненая памылка можа працягваць вяртацца?
2:20 Кэшаваны адказ пяцьсот працягвае прайгравацца пасля аднаўлення злучэння. Арыгінальная аперацыя магла выклікаць пабочныя эфекты. Вырашыце яе вынік з дапамогай аб'ектаў, Dashboard і вэбхукаў. Новы ключ можа паўтарыць дзеянне. Калі вы аддаеце перавагу прачытаць гэта, чым пачуць ад мяне, diff трапляе ў вашу паштовую скрыню кожную раніцу, бясплатна на thedailydiff.dev, спасылка ніжэй.
Ці варта было б мне адправіць кнопку паўторнай спробы з гэтым кантрактам?
2:39 Вердыкт, пад капотам. Адправіць. Я б адправіў стабільныя ключы з абмежаванымі паўторнымі спробамі і ўзгадненнем, каб кліенты атрымлівалі каву, не фінансуючы вашу адукацыю ў галіне размеркаваных сістэм. І гэта ўвесь diff на сёння. Я Ніка з 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



