Comparthing Logo
pranešimų eilių sudarymaspatikimumo modeliaipaskirstytos sistemosdebesų architektūraklaidų apdorojimasdebesų infrastruktūra

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
Vėlavimo poveikis Didesnis delsos laikas dėl eilės operacijų Minimalus delsos laikas, neatidėliotinas pakartotinis vykdymas
Naudokite dėklą 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.

Mitas

Pakartotiniai bandymai atmintyje netinka paskirstytoms sistemoms.

Realybė

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ą.

Susiję palyginimai

„Kafka“ ir „Flink“ palyginti su apdorojimu atmintyje

„Kafka“ ir „Flink“ sudaro paskirstytą srautinio apdorojimo ekosistemą realaus laiko duomenų srautams, o apdorojimas atmintyje pagreitina analizę, nes duomenys saugomi tik RAM atmintyje – kiekvienas iš jų tenkina iš esmės skirtingus architektūrinius greičio, mastelio ir tvarumo poreikius.

„Netflix“ mašininio mokymosi platforma ir nepriklausomi mašininio mokymosi įrankiai

„Netflix“ vidinė mašininio mokymosi platforma siūlo glaudžiai integruotus, didelio masto įrankius, skirtus transliacijų suasmeninimui, o nepriklausomi mašininio mokymosi įrankiai suteikia mažesnėms komandoms lankstumo ir kontrolės. Pasirinkimas priklauso nuo masto, pritaikymo poreikių ir esamų investicijų į infrastruktūrą.

Adaptyvioji infrastruktūra ir statinė infrastruktūros projektavimas

Adaptyvi infrastruktūra dinamiškai prisitaiko prie kintančių darbo krūvių, naudodama automatizavimą ir mastelio keitimą realiuoju laiku, o statinės infrastruktūros projektavimas remiasi fiksuotais, iš anksto sukonfigūruotais ištekliais. Pasirinkimas priklauso nuo darbo krūvio kintamumo, biudžeto nuspėjamumo ir veikimo brandos jūsų debesijos aplinkoje.

Apkrovos balansavimas mašininio mokymosi sistemose ir paprastas API užklausų tvarkymas

Apkrovos balansavimas mašininio mokymosi sistemose valdo GPU reikalaujančius išvadų ir mokymo darbo krūvius specializuotoje įrangoje, o paprastas API užklausų apdorojimas paskirsto nedidelį HTTP srautą bendrosios paskirties serveriuose. Jie labai skiriasi sudėtingumu, išteklių poreikiu ir maršruto parinkimo išmanumu.

Atsparumas gedimams ir sistemos paleidimas iš naujo

Atsparumas gedimams proaktyviai perkelia darbo krūvius į sveikas sistemas, kol vartotojai nepastebi problemų, o sistemos gedimų atveju iš naujo paleidžiamos sistemos reaktyviai atkuria paslaugas po netikėtų gedimų. Abu metodai siekia palaikyti prieinamumą, tačiau iš esmės skiriasi laiku, architektūros sudėtingumu ir poveikiu vartotojams.