Pelnas:
- Gali interpretuoti greičio apribojimus (RPM/ITPM/OTPM) ir 429 klaidas
- Įgyvendina eksponentinį atsitraukimą ir bandykite dar kartą su bandymu vėl
- Teisingai klasifikuoja ir tvarko įprastus HTTP klaidų kodus (400/401/429/500/529)
Gamybos aplinkoje jokia API nereaguoja tobulai visą laiką. Kartais per greitai siunčiate užklausas ir pasiekiate limitą; kartais serveris laikinai užimtas; Kartais jūsų prašymas neteisingas nuo pat pradžių. Tvirta integracija nuo mėgėjiško bandymo skiriasi tuo, kad tokias situacijas ji sprendžia nuspėjamai ir automatiškai. Šiame skyriuje sužinosite apie greičio ribas (RPM / ITPM / OTPM), 429 klaidą, pakartotinį bandymą su eksponentiniu atsitraukimu ir tinkamą įprastų HTTP klaidų kodų klasifikaciją. Tikslas: sukurti srautą, kuris būtų toks tvirtas, kad vartotojas to niekada nepastebės.
Kas yra greičio apribojimai?
Teikėjas riboja, kiek darbo jungiklis gali atlikti per tam tikrą laikotarpį. Ši apsauga; Tai apsaugo tiek infrastruktūrą, tiek jus nuo staigių išlaidų sprogimų. Yra trys įprasti apribojimų tipai:
- RPM (užklausos per minutę): užklausų skaičius per minutę.
- ITPM (Input Tokens Per Minute): įvesties prieigos raktas, kurį galima apdoroti per minutę.
- OTPM (išvesties žetonai per minutę): išvesties prieigos raktas, kurį galima pagaminti per minutę.
Jei viršysite bet kurią iš šių ribų, teikėjas atmeta užklausą ir grąžina 429 klaidos kodą. Limitai paprastai skiriasi priklausomai nuo paskyros lygio (pakopos) ir laikui bėgant gali būti didinami.
Patarimas: atsakymų antraštėse galite žiūrėti, kada artėsite prie ribos. Daugelis teikėjų praneša apie likusią kvotą su antraštėmis, pvz., x-ratelimit-remaining-*. Stebėti šias vertes ir sumažinti eismą priekyje yra pats brandžiausias būdas išvengti problemos negaunant 429.
429 ir eksponentinis atsekimas
429 (normos riba) yra laikina ir pakartotinai bandoma klaida. Teisingas atsakymas – kurį laiką palaukti užklausos ir bandyti dar kartą. Tačiau nuolatinio laukimo neužtenka; Jei visi bandys dar kartą vienu metu, limitas vėl bus pasiektas. Sprendimas yra eksponentinis atsitraukimas: eksponentiškai ilginamas laukimo laikas su kiekvienu nesėkmingu bandymu.
# Eksponentinio atsitraukimo loginis bandymas 1 → 429 → palaukite 1 sek. bandymas 2 → 429 → palaukite 2 sek. bandymas 3 → 429 → palaukite 4 sek. bandymas 4 → 429 → palaukite 8 sek (+ mažas atsitiktinis „drebėjimas“)... pasiduokite ir praneškite po daugiausiai N bandymų
Pridėjus šiek tiek atsitiktinumo (drebėjimo), išvengiama užklausų susidūrimo bandant dar kartą tuo pačiu metu. Be to, 429 atsakymas dažnai turi antraštę „pakartoti po“: „bandyk dar kartą po tiek sekundžių“. Gerbti šį titulą tiksliau nei aklai laukti.
Atsargiai: kai gausite 429, „priversdami jį siųsti siunčiant daugiau užklausų“, padėtis pablogės; Limitas ir toliau pildomas, o užklausos nepateikiamos. Teisingas atsakas yra atsitraukimas, o ne pagreitis. Geros naujienos: dauguma oficialių SDK automatiškai bando iš naujo 429 ir serverio klaidas su atsitraukimu – naudokite šį SDK elgesį prieš jį įdiegdami rankiniu būdu.
HTTP klaidų kodų klasifikavimas
Ne kiekviena klaida yra vienoda. Esminis skirtumas: ar tai gali būti bandoma dar kartą, ar tai užklausos / tapatybės problema?
Kodas
Reikšmė
Ar galima pabandyti dar kartą?
teisingas atsakymas
400
Neteisinga užklausa (formato / parametro klaida)
ne
Ištaisyti prašymą; daugiau nesiųsk to paties
401
Autentifikavimo klaida (netinkamas raktas / nėra)
ne
Pataisykite raktą / pavadinimą
403
Nėra prieigos (nėra prieigos prie modelio / funkcijos)
ne
Patikrinkite leidimus / apimtį
404
Nerasta (netinkamas modelio ID / pabaigos taškas)
ne
Teisingas modelio ID / adresas
429
Viršytas greičio apribojimas
Taip
Atsitraukti + bandyti iš naujo
500
Serverio klaida
Taip
Bandykite dar kartą atsitraukdami
529
Serveris perkrautas
Taip
Bandykite dar kartą atsitraukdami
Auksinė taisyklė: 429, 500 ir 529 yra laikini; Bandoma dar kartą su pasitraukimu. 400, 401, 403, 404 yra užklausos / tapatybės problemos; Bandymas dar kartą to neišspręs, o tai eikvoja pastangas. Jūsų kodas turi atskirti šias dvi grupes.
Žingsnis po žingsnio: patvarus skambutis
- Pateikite prašymą. Jei pasiseks, tęskite.
- Klasifikuokite klaidos kodą. Ar galima pabandyti dar kartą?
- Jei bandoma: sekite bandymą po to, taikykite eksponentinį atsitraukimą + virpėjimą, bandykite ribotą skaičių kartų (pvz., ne daugiau kaip 5).
- Jei nebandė: Pataisyti (formatuoti/raktą) ir sustabdyti; Nekartokite tos pačios klaidingos užklausos cikle.
- Apsvarstykite galimybę atsisakyti. Jei po n bandymų vis tiek nepavyksta, parodykite vartotojui mandagų pranešimą ir užregistruokite įvykį (11 sekimo blokas).
# Tvirtas iškvietimas pseudokodenas = 0pakartojimas: atsakymas = request_at(), jei atsakymas.sėkmė: grąžinkite atsakymą, jei atsakymas.kodas [429, 500, 529] ir bandykite < 5: palauk = pakartokite_after ?? (2^bandyti sek + virpėjimas) miegas (laukti); pabandyk += 1; git dar kartą, jei atsakymas.kodas [400, 401, 403, 404]: save_error(response); return "užklausa turi būti ištaisyta" return "nuolatinė klaida, bandykite vėliau"
# Mandagus atsiliepimas vartotojui (kai baigiasi pakartotiniai bandymai) "Šiuo metu esu užsiėmęs, negaliu apdoroti jūsų užklausos. Netrukus bandykite dar kartą arba išsaugojau jūsų užklausą, susisieksiu su jumis, kai ji bus paruošta."
Silpnas raginimas / stiprus raginimas (čia: klaidos pranešimo dizainas)
# WEAK (vartotojui rodo neapdorotą klaidą)"429 klaida: rate_limit_error"
# STIPRUS (patogus vartotojui, raminantis, siūlantis imtis veiksmų) "Sistemoje buvo laikina spūstis. Jūsų užklausą gavome saugiai ir ji automatiškai bandoma dar kartą. Jei rezultatas nepasirodo per kelias sekundes, galite atnaujinti puslapį."
Neapdorotos techninės klaidos atskleidimas galutiniam vartotojui mažina pasitikėjimą ir gali būti saugumo spraga. Suskirstykite klaidas viduje ir perduokite vartotojui ramų, į veiksmą orientuotą pranešimą; tiesiog parašykite techninę įrašo informaciją.
Trys mini dėklai
1 atvejis – laivas sudužo per eismo sprogimą. Kampanijos dieną klientų aptarnavimo robotas sulaukė 429 srauto padidėjimo; Kode nebuvo pakartotinio bandymo, kiekviena klaida buvo tiesiogiai atspindėta vartotojui kaip „klaida“. Jie pridėjo eksponentinį sekimą + pakartotinis bandymas po; esant tokiam pačiam srautui, užklausos perduodamos su kelių sekundžių vėlavimu, vartotojas nematė jokių klaidų.
2 atvejis – bandoma 400. Integracija gavo 404 dėl netinkamo modelio ID, bet visas klaidas laikė „trumpalaikėmis“ ir bandė dar kartą per begalinę kilpą; Rąstas išsipūtė ir susidarė nereikalingas krūvis. Jie pridėjo klaidų klasifikaciją: 404 laikomas nuolatiniu, kilpa sustabdoma ir modelio ID pataisomas. Pamoka: nebandykite dar kartą kiekvienos klaidos.
3 atvejis – limito valdymas iš priekio. Duomenų praturtinimo užduotis nuolat buvo vykdoma esant 429 ribai. Jie laikėsi likusios x-ratelimit antraštės ir sumažino srautą pagal kvotą. Taigi jie išlaikė pastovų tempą šiek tiek žemiau ribos, nepaimdami jokių 429 s; Darbas buvo atliktas labiau nuspėjamai ir greičiau.
Dažnos klaidos
- Didėjantis greitis 429: pablogina situaciją; Perjungti į atsitraukimą.
- Kiekviena klaida bandoma iš naujo: 400/401/404 yra nuolatinė; Bandymas dar kartą yra veltui.
- Naudojant fiksuotą laukimą: sukuria susidūrimą; Naudokite eksponentinį + virpėjimą.
- „Pakartotinai po“ ignoravimas: tiksliausia laikytis teikėjo nurodyto laiko.
- Neapdorotos klaidos atskleidimas vartotojui: Sukrečia pasitikėjimą, sukuria pažeidžiamumą; Klasifikuoti viduje.
- Neribotas bandymų skaičius: nustatykite viršutinę ribą (pvz., 5 bandymai); tada grakščiai pasiduokite.
Giliau: eilės, lygiagrečiai ir grandinės pertraukikliai
Vieno troškimo ištvermė yra pirmas žingsnis; Tikroji branda yra valdyti daugybę užklausų nepažeidžiant limitų. Čia galioja trys sąvokos.
Eilė: pateikiate užklausas į eilę, kad jas išsiųstumėte kontroliuojamu tempu, o ne iškart. Eilės sudarymas išlygina staigius srauto pliūpsnius: net jei vienu metu gaunama 1 000 užklausų, eilė jas atleis mažesne nei riba. Taip išvengsite 429, tada jums nereikės jaudintis dėl jo taisymo.
Lygiagretumo limitas: ribojate, kiek užklausų vienu metu yra „orėje“. Neribotos lygiagrečios užklausos greitai užpildo RPM ir TPM ribas. Pagrįsta lygiagretumo riba (pvz., ne daugiau kaip 10 užklausų vienu metu) išlaiko ribas ir daro sistemą nuspėjamą.
Grandinės pertraukiklis: jei paslaugų teikėjas nuolat grąžina 500/529, užuot atkakliai bandęs kiekvieną užklausą, kurį laiką „nutraukiate grandinę“ ir greitai nepavyksta įvykdyti užklausos niekada jos neišsiųsdamas. Palaukę vėl įjungiate grandinę ir pabandykite. Šis modelis apsaugo jūsų sistemą nuo strigimo, jei laikinai sugenda teikėjas.
Kartu šios trys sistemos sukuria sistemos lygio atsparumą, viršijantį vieno skambučio pakartotinio bandymo logiką. Mažu mastu pakanka automatinio SDK pakartotinio bandymo; Didėjant mastui, eilės, lygiagretumas ir grandinės pertraukiklis tampa būtini. Jų visų bendras tikslas – laikiną problemą vartotojui atspindėti ne kaip avariją, o kaip nematomą kelių sekundžių vėlavimą.
Apibendrinant
429 grįžta, kai viršijami greičio apribojimai (RPM/ITPM/OTPM); Tai laikina klaida ir bus bandoma dar kartą naudojant kartojimą po ir eksponentinį atsitraukimą + virpėjimą. 500 ir 529 taip pat yra preliminarūs; 400/401/403/404 yra užklausos / tapatybės problema ir jos negalima išspręsti bandant dar kartą. Tvirtas srautas išskiria klaidas į šias dvi grupes, bando ribotą skaičių kartų, stebi ribą iš priekio ir rodo ramius pranešimus vartotojui.
Taikymo užduotis
Apsvarstykite savo integraciją. (1) Išvardykite klaidų kodus, su kuriais galite susidurti, ir suskirstykite juos į „pakartotinai bandoma / nuolatinė“. (2) Užrašykite savo eksponentinį atsitraukimo planą (pradinis laikymas, koeficientas, viršutinė riba, virpėjimas). (3) Nurodykite, kaip naudoti antraštę pakartokite po to. (4) Parašykite mandagų pranešimą, kuris bus rodomas vartotojui, kai baigsis pakartotiniai bandymai.
kontrolinis sąrašas
- [ ] Galiu paaiškinti RPM/ITPM/OTPM ribas ir 429.
- [ ] Galiu taikyti eksponentinio atsitraukimo + virpėjimo + pakartotinio bandymo po to logiką.
- [ ] Galiu klasifikuoti klaidų kodus kaip pakartotinai bandomus / nuolatinius.
- [ ] Žinau, kad neturėtume bandyti kiekvienos klaidos.
- [ ] Vietoj neapdorotos klaidos galiu parodyti vartotojui ramų, į veiksmą orientuotą pranešimą.