Neveikiančių laiškų eilės ir pakartotiniai bandymai atmintyje
Neveikiančių laiškų eilės ir pakartotiniai bandymai atmintyje yra du iš esmės skirtingi būdai, kaip tvarkyti pranešimų apdorojimo gedimus paskirstytose sistemose: DLQ užtikrina ilgalaikę probleminių pranešimų izoliaciją, o pakartotiniai bandymai atmintyje siūlo lengvą, mažo delsos laiko atkūrimą be nuolatinių išlaidų.
Akcentai
Neveikiančių laiškų eilėse nepavykę pranešimai saugomi neribotą laiką, todėl jie yra būtini audito ir atitikties scenarijams.
Pakartotiniai bandymai atmintyje vykdomi su mikrosekundžių lygio pridėtinėmis sąnaudomis, o eilės operacijų vėlavimai – milisekundėmis ar daugiau.
DLQ leidžia atskiroms operacinėms komandoms valdyti gedimus nekeičiant programos kodo.
Pakartotinių bandymų audros iš atminties metodų gali sukelti kaskadinius gedimus, jei jų neapriboja grandinės pertraukikliai
Kas yra Negyvų laiškų eilės?
Nuolatinės pranešimų eilės, kurios fiksuoja nepavykusius pranešimus, kad juos vėliau būtų galima patikrinti ir pakartotinai apdoroti.
Pranešimai perkelti į DLQ viršijus maksimalų pakartotinio bandymo slenkstį, išsaugant visą pranešimo turinį ir metaduomenis
Iš pradžių išpopuliarėjo įmonių pranešimų sistemose, tokiose kaip IBM MQ ir JMS, dabar standartinėje AWS SQS, Azure Service Bus ir RabbitMQ versijoje.
Įgalinkite atsietą gedimų analizę neužblokuodami pagrindinių apdorojimo srautų, leisdami komandoms išspręsti problemas ir pakartotinai peržiūrėti pranešimus.
Paprastai integruojama su stebėjimo ir įspėjimo sistemomis, kad operatoriai būtų informuoti, kai pranešimai tampa nebenaudojamų laiškų būsena.
Palaikomos laiko pagrindu veikiančios galiojimo pabaigos politikos, o AWS SQS DLQ pagal numatytuosius nustatymus saugo pranešimus iki 14 dienų.
Kas yra Pakartotiniai bandymai atmintyje?
Nedelsiant bandant pakartotinai, logika vykdoma tame pačiame procese be išorinio pranešimo išsaugojimo.
Pakartotinių bandymų politikose dažniausiai taikomas eksponentiškas atidėjimas, kai tarp bandymų vėlavimai padvigubėja (pvz., 1 s, 2 s, 4 s, 8 s).
Tokios sistemos kaip „Polly“ (.NET), „Resilience4j“ (Java) ir „Retry“ (Python) teikia konfigūruojamas pakartotinio bandymo strategijas su grandinės pertraukiklių šablonais.
Nenaudoja jokių papildomų infrastruktūros išteklių, išskyrus apdorojimo programos esamą atmintį ir procesorių
Visiškai nepavyksta, jei programa užstringa pakartotinio bandymo metu, prarandant pakartotinio bandymo būseną ir galbūt pradinį operacijos kontekstą.
Geriausiai tinka trumpalaikiams gedimams, pvz., tinklo sutrikimams, duomenų bazės ryšio skirtiems laikams ir laikinam paslaugų nepasiekiamumui, spręsti.
Palyginimo lentelė
Funkcija
Negyvų laiškų eilės
Pakartotiniai bandymai atmintyje
Atkaklumas
Patvari pranešimų saugykla atskiroje eilėje
Efemeriškas, gyvena tik programos atmintyje
Gedimų atkūrimas
Išgyvena programos gedimus ir paleidimą iš naujo
Prarandama, jei procesas nutrūksta pakartotinio bandymo metu
Infrastruktūros kaina
Papildomos eilės saugojimo ir perkėlimo išlaidos
Jokios papildomos infrastruktūros, išskyrus taikymą
Veiklos matomumas
Integruoti rodikliai, signalizacijos ir pakartojimo galimybės
Reikalingas pasirinktinis registravimas ir stebėjimas
Svarbios darbo eigos, kurioms reikalingas garantuotas apdorojimas
Nekritinės operacijos su trumpalaikiais gedimais
Pranešimų tvarka
Gali išsaugoti arba sutrikdyti pradinį užsakymą
Natūraliai išlaiko proceso seką
Komandos bendradarbiavimas
Įgalina atskirą komandos nuosavybę taisymams ir pakartojimams
Glaudžiai susietas su programų diegimu
Išsamus palyginimas
Patikimumo ir ilgaamžiškumo garantijos
Neveikiančių laiškų eilės puikiai tinka, kai visiškai neįmanoma prarasti pranešimų. Kai pranešimas patenka į DLQ, jis ten lieka, kol kas nors jį tiesiogiai apdoroja, net jei visa jūsų paslauga paleidžiama iš naujo. Priešingai, pakartotiniai bandymai atmintyje išgaruoja, jei jūsų modulis sugenda arba procesas nutraukiamas diegimo metu. Dėl to DLQ yra akivaizdus pasirinkimas finansinėms operacijoms, atsargų atnaujinimams ar bet kam, kas susiję su atitiktimi.
Našumas ir delsos charakteristikos
Pakartotiniai bandymai atmintyje neabejotinai laimi greičio požiūriu. Nėra tinklo šuolio, eilės API iškvietimo, serializavimo pridėtinių išlaidų, tik greitas miego režimas ir bandymas dar kartą. Didelio našumo sistemose, apdorojančiose tūkstančius pranešimų per sekundę, šis skirtumas susisumuoja. DLQ sukelia išmatuojamą delsą, ypač kai pranešimai turi kirsti tinklo ribas, kad pasiektų atskirą eilės paslaugą. Kai kurios komandos naudoja hibridinius metodus, naudodamos pakartotinius bandymus atmintyje greitam trumpalaikiam problemų sprendimui ir DLQ kaip galutinį saugos tinklą.
Veikimo sudėtingumas ir derinimas
DLQ sukuria aiškią veiklos ribą. Jūsų budintis inžinierius yra iškviečiamas, peržiūri neveikiančių laiškų eilę, ištaiso pagrindinę klaidą ir pakartoja pranešimus. Tai gerai suprantamas darbo eigas. Pakartotiniai bandymai atmintyje išsaugo gedimus programų žurnaluose, todėl dažnai reikia agreguoti žurnalus ir naudoti pritaikytas ataskaitų suvestines, kad būtų galima žinoti apie pakartotinius bandymus. Kai pakartotinių bandymų skaičius išsenka, tai tampa gedimų sprendėjo košmaru, ypač mikropaslaugose, kur gedimas gali būti kaskadinis, kol kas nors jo nepastebi.
Sąnaudų aspektai mastu
Debesijos eilių paslaugos ima mokestį už kiekvieną užklausą ir saugomą pranešimą. Užimtas debesies eilių srautas su milijonais pranešimų gali nežymiai paveikti jūsų sąskaitą, ypač jei saugojimo politika yra dosni. Pakartotiniai bandymai atmintyje iš esmės yra nemokami infrastruktūros požiūriu, tačiau jie eikvoja atmintį ir gali apkrauti kitas gijas, jei pakartotinių bandymų audroms netaikomos ribos. Išlaidoms jautrioms pradedančiosioms įmonėms tai dažnai lemia atminties naudojimo metodų naudojimą, kol pajamos pateisina patikimumo priedą.
Integracija su šiuolaikinėmis architektūromis
Įvykiais pagrįstos architektūros ir serverių neturinčios funkcijos padarė DLQ aktualesnius nei bet kada anksčiau. „AWS Lambda“, „Azure Functions“ ir „Google Cloud Functions“ iš esmės palaiko neveikiančių raidžių konfigūracijas. Pakartotiniai bandymai atmintyje natūraliau dera prie tradicinių programų serverių ir ilgai veikiančių procesų. „Kubernetes“ ir trumpalaikių skaičiavimų atsiradimas iš tikrųjų apsunkino atminties strategijas, konteinerius galima nutraukti be jokio įspėjimo, todėl DLQ tampa vis patrauklesni net ir toms komandoms, kurios anksčiau jų vengė.
Privalumai ir trūkumai
Negyvų laiškų eilės
Privalumai
+Garantuotas pranešimų patvarumas
+Aiškus operacinis perdavimas
+Gimtoji debesijos integracija
+Palaiko pakartojimą ir auditą
+Izoliuoja gedimo poveikį
Pasirinkta
−Papildomos infrastruktūros išlaidos
−Didesnis ištisinis delsos laikas
−Reikalingas pakartojimo mechanizmas
−Gali kaupti pasenusius pranešimus
−Sudėtingesnė architektūra
Pakartotiniai bandymai atmintyje
Privalumai
+Ypač mažas delsos laikas
+Jokios papildomos infrastruktūros
+Iš pradžių paprasta įgyvendinti
+Minimalios eksploatacinės išlaidos
+Greitas gedimų grįžtamasis ryšys
Pasirinkta
−Pasiklydo dėl proceso gedimo
−Paslėpta nuo operacijų
−Gali sukelti pakartotinių bandymų audras
−Glaudus ryšys su programos gyvavimo ciklu
−Sunkiau derinti retrospektyviai
Dažni klaidingi įsitikinimai
Mitas
Neveikiančių raidžių eilės panaikina bet kokios pakartotinio bandymo logikos poreikį programose.
Realybė
DLQ yra paskirties vieta, kai išnaudojamas pakartotinių bandymų skaičius, o ne pakartotinio bandymo logikos pakaitalas. Daugelyje įdiegimų vis dar atliekami neatidėliotini arba uždelsti pakartotiniai bandymai, prieš tai, kai pranešimas laikomas dingusiu. Be tarpinių pakartotinių bandymų, kiekvienas trumpalaikis trikdis iš karto užtvindytų jūsų DLQ.
Mitas
Pakartotiniai bandymai atmintyje visada yra greitesni ir todėl geresni našumo požiūriu.
Realybė
Nors individualūs pakartotiniai bandymai yra greitesni, neriboti pakartotiniai bandymai atmintyje gali perkrauti gijų telkinius ir sumažinti bendrą sistemos pralaidumą. Našumo pranašumas greitai išnyksta, kai pakartotinių bandymų audrose suveikia grandinės pertraukikliai arba perkraunamos paslaugos.
Mitas
Pranešimai, esantys negyvų laiškų eilėse, vėliau apdorojami automatiškai.
Realybė
DLQ saugyklos yra pasyvios – su šiais pranešimais niekas nevyksta, kol neįvykdomas aiškus žmogaus ar automatinis veiksmas. Daugelis komandų DLQ saugyklose aptiko mėnesių senumo pranešimus, nes niekas nesukūrė atkūrimo kanalo.
Mitas
Turite rinktis tik tarp DLQ ir pakartotinių bandymų atmintyje.
Realybė
Šie modeliai puikiai vienas kitą papildo. Atspariausios sistemos naudoja atminties viduje esančius pakartotinius bandymus su eksponentiniu atsilikimu, kad greitai atsigautų, o tada, pasiekus pagrįstą ribą, pereina prie DLQ. Šis sluoksniuotas metodas apima tiek trumpalaikius, tiek nuolatinius gedimų režimus.
Nors pakartotiniai bandymai atmintyje yra mažiau patikimi nei DLQ, jie išlieka įprasti ir tinkami paskirstytose sistemose idempotentinėms, nekritinėms operacijoms. Svarbiausia yra suderinti pakartotinio bandymo strategiją su faktinėmis gedimo verslo pasekmėmis, o ne daryti prielaidą, kad vienas modelis tinka visiems.
Mitas
Neveikiančių laiškų eilės apsaugo nuo pranešimų praradimo sistemos sutrikimų metu.
Realybė
DLQ padeda tik tiems pranešimams, kuriuos eilių tvarkymo sistema jau priėmė. Jei pranešimas niekada nepasiekia pagrindinės eilės dėl tinklo skaidinio ar gamintojo gedimo, DLQ negali jo stebuklingai atkurti. Išsamiam patikimumui taip pat reikalingas gamintojo pusės patikimumas.
Dažnai užduodami klausimai
Kas tiksliai sukelia pranešimo perkėlimą į neveikiančių laiškų eilę?
Paprastai pranešimai patenka į DLQ, išnaudoję sukonfigūruotą pakartotinių bandymų skaičių, o tai gali reikšti, kad viršijamas maksimalus SQS priimtų laiškų skaičius, nepavyksta pristatyti keliems vartotojams arba programos kodas juos aiškiai atmeta. Tikslus paleidiklis priklauso nuo platformos: AWS SQS naudoja pakartotinio įkėlimo politiką, nurodančią maksimalų priimtų laiškų skaičių, o „Azure Service Bus“ seka pristatymo skaičių. Kai ši riba peržengiama, pranešimų infrastruktūra automatiškai perkelia arba nukopijuoja pranešimą į susijusią neveikiančių laiškų eilę.
Kaip pakartotiniai bandymai atmintyje apdoroja procesų paleidimus iš naujo arba gedimus?
Jie to nedaro, ir tai yra jų esminis apribojimas. Bet kokia pakartotinio bandymo būsena egzistuoja tik veikiančio proceso krūvoje (heap). Jei programa sugenda, yra uždaroma diegimo metu arba konteineris yra perplanuojamas, visi laukiantys pakartotiniai bandymai ir jų kontekstas išnyksta. Operacijoms, kurios turi išlikti tokiuose įvykiuose, reikalingi nuolatiniai pakartotinio bandymo mechanizmai, nesvarbu, ar tai būtų DLQ, duomenų bazės pagrindu sukurta užduočių eilė, ar paskirstytos užduočių sistemos, tokios kaip „Celery“ ar „Hangfire“.
Ar toje pačioje sistemoje galima sujungti neveikiančių laiškų eiles su pakartotiniais bandymais atmintyje?
Be abejo, ir tai iš tikrųjų yra geriausia praktika daugeliui komandų. Įprastas modelis apima pakartotinius bandymus atmintyje su eksponentiniu atsilikimu, kad būtų galima nedelsiant atkurti laikiną būseną, tarkime, tris bandymus per kelias sekundes. Jei jie nepavyksta, pranešimas arba operacija publikuojama eilėje su DLQ palaikymu, kad būtų galima ilgai apdoroti duomenis. Tai suteikia atmintyje atliekamų pakartotinių bandymų greitį, kai reikia pašalinti trikdžius, ir DLQ saugumą, kai reikia spręsti nuolatines problemas.
Kokį stebėjimą reikėtų nustatyti neveikiančių laiškų eilėms?
Bent jau sukonfigūruokite įspėjimus apie eilės ilgį, seniausio pranešimo amžių ir gaunamų pranešimų dažnį. Staigus DLQ atvykimų skaičiaus padidėjimas paprastai rodo įdiegtą klaidą. Pranešimų amžiaus įspėjimai užfiksuoja atvejus, kai pakartojimas nevyksta. Daugelis komandų taip pat stebi DLQ pranešimų ir sėkmingai apdorotų pranešimų santykį kaip sveikatos rodiklį. „CloudWatch“, „Azure Monitor“ arba „Datadog“ gali pateikti šiuos rodiklius, integruodami pranešimų gaviklį.
Ar yra alternatyvų tiek DLQ, tiek pakartotiniams bandymams atmintyje?
Keletas šablonų tenkina panašius poreikius. Siunčiamų laiškų šablonas išsaugo įvykius transakciškai su verslo duomenimis, užtikrindamas atomiškumą. „Saga“ šablonas valdo ilgai trunkančias paskirstytas transakcijas su kompensaciniais veiksmais. Duomenų bazėmis pagrįstos užduočių eilės, tokios kaip „Sidekiq“ ar „pg-boss“, užtikrina duomenų išsaugojimą be specialių pranešimų tarpininkų. Įvykių šaltinis rekonstruoja būseną iš tik papildymui skirto žurnalo, todėl pakartotinio bandymo semantika skiriasi. Teisingas pasirinkimas priklauso nuo jūsų nuoseklumo reikalavimų ir esamos infrastruktūros.
Kaip saugiai atkurti pranešimus iš neveikiančių laiškų eilės?
Niekada negrįžkite tiesiai į pradinę eilę be patikrinimo, nes jei pagrindinė priežastis išlieka, tai veda prie begalinių ciklų. Verčiau nukreipkite DLQ pranešimus į atskirą analizės aplinką, išnagrinėkite reprezentatyvius pavyzdžius, kad nustatytumėte gedimo modelį, išspręskite pagrindinę problemą ir tada selektyviai paleiskite paketais su stebėjimu. AWS teikia DLQ perkrovimo funkcijas, o tokie įrankiai kaip „Amazon EventBridge Pipes“ gali automatizuoti sąlyginio pakartojimo darbo eigas.
Kas lemia gerą pakartotinio bandymo politiką atmintyje esantiems pakartotiniams bandymams?
Eksponentinis atidėjimas su svyravimu yra auksinis standartas. Be svyravimo, sinchronizuoti pakartotiniai bandymai iš kelių klientų gali sukelti milžiniškas bandos problemas, trukdančias atkurti paslaugas. Apribokite maksimalų vėlavimą, kad išvengtumėte neriboto laukimo, ir visada nustatykite maksimalų pakartotinių bandymų skaičių. Apsvarstykite galimybę naudoti grandinės pertraukiklius, kurie visiškai sustabdo pakartotinius bandymus, kai gedimų dažnis viršija ribas, suteikdami paslaugoms laiko atsigauti, o ne smogdami jas, kai jos neveikia.
Ar serverio neturinčios funkcijos gerai veikia su pakartotiniais bandymais atmintyje?
Ne ypač. „Lambda“ ir panašios funkcijos yra sukurtos taip, kad būtų be būsenos ir trumpalaikės. Maksimalus penkiolikos minučių vykdymo laikas reiškia, kad jūsų pakartotinio bandymo atmintyje langas yra apribotas. Dar svarbiau, kad jei „Lambda“ nepavyksta, visas vykdymo kontekstas išnyksta. Serverių neturinčios architektūros labai teikia pirmenybę išorinei būsenai, todėl DLQ arba žingsninės funkcijos su integruota pakartotinio bandymo logika yra daug natūralesnės nei atmintyje esančios funkcijos.
Kuo skiriasi pranešimų tvarkos klausimai taikant šiuos metodus?
DLQ gali apsunkinti eilės tvarkos užtikrinimą. Jei jūsų pagrindinė eilė yra FIFO, pranešimų perkėlimas į DLQ ir iš jo gali sutrikdyti seką, nebent platforma specialiai išsaugotų eilės tvarką. Pakartotiniai bandymai atmintyje viename vartototojui natūraliai išlaiko to vartotojo pranešimų tvarką, nors keli vartotojai vis tiek apdoroja lygiagrečiai. Kai kurios sistemos naudoja sekos numerius arba programos lygio eilės tvarką, kad atkurtų tinkamą seką po bet kokio pakartotinio bandymo mechanizmo.
Kokie saugumo aspektai taikomi neveikiančių laiškų eilėms?
DLQ eilėse yra tie patys jautrūs duomenys kaip ir pagrindinėse eilėse, kartais net daugiau, nes jose yra gedimo kontekstas. Taikykite identišką šifravimą, prieigos kontrolę ir audito žurnalavimą. Būkite atsargūs naudodami pakartojimo mechanizmus, nes senų pranešimų pakartotinis apdorojimas gali sukelti netikėtų šalutinių poveikių, jei žemesnės grandies sistemos nėra idempotentinės. Kai kuriose reguliuojamose pramonės šakose reikalingi aiškūs patvirtinimo darbo eigos, prieš pasiekiant DLQ pranešimus arba juos pakartojant.
Kada reikėtų visiškai vengti pakartotinių bandymų atmintyje?
Praleiskite juos, kai apdorojimas turi ne idempotentinį šalutinį poveikį, o dvigubas kredito kortelės nuskaitymas dėl pakartotinio bandymo yra katastrofiškas. Venkite jų, kai svarbi tikslaus karto semantika ir trūksta deduplikacijos. Nepasikliaukite jais ilgai trunkančioms operacijoms, kai procesas gali būti nepakankamai ilgas, kad būtų galima atlikti pakartotinius bandymus. Ir nenaudokite jų, kai operacijų komandoms reikia matyti gedimų modelius neįdiegus kodo pakeitimų.
Kaip atrodo išlaidos įmonės mastu?
Įprasta AWS sistema su standartinėmis SQS eilėmis ir DLQ gali kainuoti kelis dolerius milijonui pranešimų, pridėjus saugyklą saugomiems pranešimams. Sistemai, kas mėnesį apdorojančiai milijardus, tai tampa reikšminga. Pakartotiniai bandymai atmintyje perkelia sąnaudas į skaičiavimą, už kurį jūs jau mokate. Tačiau pakartotinių bandymų audros gali padidinti procesoriaus ir atminties apkrovą, todėl gali prireikti didesnių egzempliorių dydžių. Daugelyje bendrųjų nuosavybės sąnaudų analizių pirmenybė teikiama atminčiai mažos svarbos didelės apimties darbams ir DLQ mažesnės apimties esminiams darbo eigoms.
Nuosprendis
Rinkitės neveikiančių laiškų eiles, kai pranešimų praradimas yra nepriimtinas ir operacijų komandoms reikia aiškių gedimų ribų, kurias galėtų valdyti. Rinkitės pakartotinius bandymus atmintyje, kai svarbiausia yra greitis, vertinamas infrastruktūros paprastumas ir gedimai yra išties trumpalaikiai, o ne sisteminiai. Daugelyje brandžių sistemų iš tikrųjų derinami abu šie būdai, naudojant pakartotinius bandymus atmintyje, kad būtų galima nedelsiant atkurti duomenis, ir DLQ kaip pagrindinę atsarginę kopiją.