Surnud kirjade järjekorrad vs mälusisesed uuestikatsed
Surnud kirjade järjekorrad ja mälusisesed uuestiproovimised esindavad kahte põhimõtteliselt erinevat lähenemisviisi hajussüsteemides sõnumitöötlusvigade käsitlemiseks, kusjuures DLQ-d pakuvad problemaatiliste sõnumite püsivat isoleerimist, samas kui mälusisesed uuestiproovimised pakuvad kerget ja väikese latentsusega taastamist ilma püsivuse lisakuludeta.
Esiletused
Surnud kirjade järjekorrad säilitavad ebaõnnestunud sõnumeid lõputult, mistõttu on need auditi ja vastavusstsenaariumide jaoks hädavajalikud.
Mälusisene korduskatsete teostamine toimub mikrosekundilise üldkuluga, järjekorra toimingute puhul aga millisekundilise ja pikema latentsusega.
DLQ-d võimaldavad eraldi operatiivmeeskondadel hallata rikkeid ilma rakenduskoodi muudatusi tegemata.
Mälupõhiste lähenemisviiside uuestiproovimise tormid võivad käivitada kaskaadseid rikkeid, kui neid ei piira kaitselülitid
Mis on Surnud kirjade järjekorrad?
Püsivad sõnumijärjekorrad, mis jäädvustavad ebaõnnestunud sõnumeid hilisemaks kontrollimiseks ja uuesti töötlemiseks.
Pärast maksimaalse uuestiproovimise läve ületamist teisaldati sõnumid DLQ-sse, säilitades kogu sõnumi sisu ja metaandmed.
Algselt populariseeriti ettevõtte sõnumsidesüsteemides nagu IBM MQ ja JMS, nüüdseks on see standard AWS SQS-is, Azure Service Busis ja RabbitMQ-s.
Võimaldab lahtisidunud rikete analüüsi ilma peamisi töötlemiskanaleid blokeerimata, mis võimaldab meeskondadel probleeme lahendada ja sõnumeid uuesti esitada
Tavaliselt integreeritakse jälgimis- ja hoiatussüsteemidega, et operaatoreid teavitada, kui sõnumid lähevad surnud kirja olekusse
Toetab ajapõhiseid aegumispoliitikaid, kusjuures AWS SQS DLQ-d säilitavad sõnumeid vaikimisi kuni 14 päeva.
Mis on Mälusisesed uuestikatsed?
Kohene uuestiproovimise loogika, mis käivitatakse sama protsessi sees ilma välise sõnumi püsivuseta.
Uuesti proovimise poliitikad rakendavad tavaliselt eksponentsiaalset tagasilükkamist, kus viivitused katsete vahel kahekordistuvad (nt 1 s, 2 s, 4 s, 8 s).
Raamistikud nagu Polly (.NET), Resilience4j (Java) ja Retry (Python) pakuvad konfigureeritavaid uuesti proovimise strateegiaid koos kaitselülitite mustritega.
Ei tarbi täiendavaid infrastruktuuri ressursse peale töötlemisrakenduse olemasoleva mälu ja protsessori.
Rakenduse täielik ebaõnnestumine, kui see uuesti proovimise ajal kokku jookseb, kaotades uuesti proovimise oleku ja potentsiaalselt ka algse toimingu konteksti.
Sobib kõige paremini ajutiste tõrgete, näiteks võrgukatkestuste, andmebaasiühenduse ajalõppude ja ajutise teenuse kättesaamatuse korral
Võrdlustabel
Funktsioon
Surnud kirjade järjekorrad
Mälusisesed uuestikatsed
Püsivus
Vastupidav sõnumite salvestamine eraldi järjekorras
Ajutine, elab ainult rakenduse mälus
Rikete taastamine
Rakenduse krahhide ja taaskäivituste üleelamine
Kaotatud, kui protsess uuesti proovimise ajal katkeb
Taristu maksumus
Lisatasud järjekorra hoiustamiseks ja ülekandeks
Rakenduse piiridesse ei kuulu lisataristu
Operatiivne nähtavus
Sisseehitatud mõõdikud, alarmid ja kordusvõimalused
Nõuab kohandatud logimist ja jälgimist
Latentsuse mõju
Suurem latentsus järjekorra toimingute tõttu
Minimaalne latentsus, kohene uuesti proovimine
Kasutage korpuse sobivust
Kriitilised töövood, mis nõuavad garanteeritud töötlemist
Mittekriitilised toimingud mööduvate tõrgetega
Sõnumite järjestamine
Võib säilitada või katkestada algse järjekorra
Säilitab protsessisisese järjestuse loomulikult
Meeskonna koostöö
Võimaldab eraldi meeskonna omandiõiguse parandamise ja korduse jaoks
Tihedalt seotud rakenduste juurutamisega
Üksikasjalik võrdlus
Usaldusväärsuse ja vastupidavuse garantiid
Surnud kirjade järjekorrad on suurepärased siis, kui sõnumeid ei saa absoluutselt kaotada. Kui sõnum jõuab DLQ-sse, jääb see sinna seni, kuni keegi sellega otseselt tegeleb, isegi kui kogu teie teenus taaskäivitub. Mälus olevad uuestikatsetused seevastu kaovad õhku, kui teie pod jookseb kokku või protsess juurutamise ajal peatatakse. See teeb DLQ-dest ilmselge valiku finantstehingute, varude värskenduste või muu vastavusega seotud jaoks.
Jõudluse ja latentsuse omadused
Mälusisesed uuestikatsetused on kiiruse poolest vaieldamatult parimad. Puudub võrguhüpe, järjekorra API-kõned ja serialiseerimise üldkulud, piisab kiirest unerežiimi võtmisest ja uuesti proovimisest. Suure läbilaskevõimega süsteemide puhul, mis töötlevad tuhandeid sõnumeid sekundis, see erinevus summeerub. Mälusisesed uuestikatsetused tekitavad mõõdetavat latentsust, eriti kui sõnumid peavad eraldi järjekorrateenuseni jõudmiseks ületama võrgu piire. Mõned meeskonnad hübridiseerivad, kasutades mälusiseseid uuestikatseid kiireteks ajutisteks parandusteks ja mälusiseseid uuestikatseid viimase turvavõrguna.
Operatiivne keerukus ja silumine
DLQ-d loovad selge operatiivse piiri. Teie valvetehnik kutsutakse kohale, uurib surnud kirjade järjekorda, parandab algse vea ja esitab sõnumid uuesti. See on hästi mõistetav töövoog. Mälus olevad uuestikatsetused matavad tõrked rakenduste logidesse, mis nõuab sageli logide koondamist ja kohandatud armatuurlaudu, et isegi uuestikatsete toimumisest teada saada. Kui uuestikatsete arv ammendub, on see tõrkelahendaja õudusunenägu, eriti mikroteenustes, kus tõrge võib allavoolu levida enne, kui keegi seda märkab.
Kulude kaalutlused skaalal
Pilvejärjekorra teenused võtavad tasu päringu ja salvestatud sõnumi kohta. Ülekoormatud DLQ miljonite sõnumitega võib teie arvet mitte triviaalselt mõjutada, eriti kui säilituspoliitikad on leebe iseloomuga. Mälusisesed uuestiproovimised on infrastruktuuri seisukohast sisuliselt tasuta, kuigi need tarbivad mälu ja võivad teisi lõime näljutada, kui uuestiproovimiste tormid pole piiratud. Kulutundlike idufirmade puhul kallutab see sageli kaalukaussi mälusiseste lähenemisviiside poole, kuni tulu õigustab usaldusväärsuse lisatasu.
Integratsioon kaasaegsete arhitektuuridega
Sündmuspõhised arhitektuurid ja serverita funktsioonid on muutnud DLQ-d asjakohasemaks kui kunagi varem. AWS Lambda, Azure Functions ja Google Cloud Functions toetavad kõik natiivselt surnud kirjade konfiguratsioone. Mälusisesed uuestikatsetused sobivad loomulikumalt traditsioonilistesse rakendusserveritesse ja pikalt töötavatesse protsessidesse. Kubernetesi ja ajutise arvutuse esiletõus on tegelikult muutnud mälusisesed strateegiad keerulisemaks, konteinereid saab vähese hoiatusega lõpetada, muutes DLQ-d üha atraktiivsemaks isegi meeskondadele, kes neid varem vältisid.
Plussid ja miinused
Surnud kirjade järjekorrad
Eelised
+Garanteeritud sõnumi vastupidavus
+Selge operatiivne üleandmine
+Natiivne pilveintegratsioon
+Toetab kordusmängimist ja auditeerimist
+Isoleerib rikke mõju
Kinnitatud
−Lisakulud infrastruktuurile
−Suurem otsast lõpuni latentsusaeg
−Nõuab kordusmehhanismi
−Võib koguneda aegunud sõnumeid
−Keerulisem arhitektuur
Mälusisesed uuestikatsed
Eelised
+Äärmiselt madal latentsusaeg
+Lisataristut pole
+Alguses lihtne rakendada
+Minimaalsed tegevuskulud
+Kiire rikke tagasiside
Kinnitatud
−Protsessi krahhi tõttu kadunud
−Toimingute eest varjatud
−Võib põhjustada uuesti proovimise torme
−Tihe seos rakenduse elutsükliga
−Tagantjärele silumine on raskem
Tavalised eksiarvamused
Müüt
Surnud kirjade järjekorrad välistavad rakendustes igasuguse uuesti proovimise loogika vajaduse.
Tõelisus
DLQ-d on sihtkohaks pärast uuestiproovimiste arvu ammendumist, mitte ei asenda uuestiproovimise loogikat. Enamik rakendusi teostab endiselt koheseid või viivitusega uuestiproovimisi enne, kui sõnumit surnuks loetakse. Ilma vahepealsete uuestiproovimisteta ujutaks iga ajutine tõrge koheselt teie DLQ üle.
Müüt
Mälusisesed uuestiproovimised on alati kiiremad ja seetõttu jõudluse seisukohalt paremad.
Tõelisus
Kuigi üksikud korduskatsed on kiiremad, võivad piiramatud mälusisesed korduskatsed lõngade kogumeid üle koormata ja süsteemi üldist läbilaskevõimet vähendada. Jõudluse eelis kaob kiiresti, kui korduskatsete tormid käivitavad kaitselülitid või koormavad allavoolu teenuseid üle.
Müüt
Surnud kirjade järjekorras olevad sõnumid töödeldakse hiljem automaatselt.
Tõelisus
DLQ-d on passiivne salvestusruum, nende sõnumitega ei juhtu midagi enne, kui toimub selgesõnaline inimlik või automaatne toiming. Paljud meeskonnad on avastanud DLQ-des kuid vanu sõnumeid, kuna keegi pole loonud korduskanalit.
Müüt
Peate valima ainult DLQ-de ja mälusiseste uuestikatsete vahel.
Tõelisus
Need mustrid täiendavad teineteist suurepäraselt. Kõige vastupidavamad süsteemid kasutavad kiireks taastumiseks eksponentsiaalse tagasilükkamisega mälusiseseid korduskatseid ning mõistliku läve järel eskaleeruvad need DLQ-deni. See kihiline lähenemisviis hõlmab nii mööduvaid kui ka püsivaid rikkerežiime.
Müüt
Mälusisesed uuesti proovimised ei sobi hajutatud süsteemide jaoks.
Tõelisus
Kuigi mälusisesed uuestiproovimised on vähem töökindlad kui DLQ-d, on need hajussüsteemides idempotentsete ja mittekriitiliste toimingute jaoks endiselt levinud ja sobivad. Peamine on sobitada uuestiproovimise strateegia rikke tegeliku ärilise tagajärjega, mitte eeldada, et üks muster sobib kõigile.
Müüt
Surnud kirjade järjekorrad hoiavad ära sõnumite kadumise süsteemi katkestuste ajal.
Tõelisus
DLQ-d aitavad ainult järjekorrasüsteemi poolt juba vastu võetud sõnumite puhul. Kui sõnum ei jõua võrgupartitsiooni või tootja rikke tõttu kunagi primaarsesse järjekorda, ei saa DLQ seda maagiliselt taastada. Lõpp-otsa usaldusväärsus nõuab ka tootjapoolset püsivust.
Sageli küsitud küsimused
Mis täpselt käivitab sõnumi surnud kirjade järjekorda teisaldamise?
Tavaliselt sisenevad sõnumid DLQ-sse pärast konfigureeritud uuestiproovimise katsete ammendumist, mis võib tähendada SQS-is maksimaalse vastuvõtute arvu ületamist, mitme tarbija vahel edastamise ebaõnnestumist või rakenduse koodi poolt selgesõnalist tagasilükkamist. Täpne päästik varieerub platvormiti: AWS SQS kasutab uuesti käivitamise poliitikat, mis määrab maksimaalse vastuvõtute arvu, samas kui Azure Service Bus jälgib edastamiste arvu. Kui see lävi ületatakse, teisaldab või kopeerib sõnumside infrastruktuur sõnumi automaatselt seotud surnud kirjade järjekorda.
Kuidas mälusisesed uuestikatsed protsesside taaskäivituste või krahhidega toime tulevad?
Nad ei tee seda ja see on nende põhimõtteline piirang. Igasugune uuestiproovimise olek eksisteerib puhtalt töötava protsessi heapis. Kui rakendus jookseb kokku, suletakse juurutamise ajal või konteiner ajastatakse ümber, kaovad kõik ootel olevad uuestiproovimised ja nende kontekst. Toimingute jaoks, mis peavad selliste sündmuste üle elama, on vaja püsivaid uuestiproovimise mehhanisme, olgu selleks siis DLQ, andmebaasipõhine tööde järjekord või hajutatud ülesannete süsteemid nagu Celery või Hangfire.
Kas samas süsteemis saab kombineerida surnud kirjade järjekordi mälus olevate korduskatsetega?
Absoluutselt, ja see on tegelikult paljude meeskondade jaoks parim tava. Tüüpiline muster hõlmab mälusiseseid korduskatseid eksponentsiaalse tagasilükkamisega koheseks ajutiseks taastumiseks, näiteks kolm katset mõne sekundi jooksul. Kui need ebaõnnestuvad, avaldatakse sõnum või toiming järjekorda, millel on DLQ-tugi püsivaks käsitlemiseks. See annab teile mälusisese korduskatse kiiruse vigade korral ja DLQ-de turvalisuse püsivate probleemide korral.
Millist jälgimist peaks surnud kirjade järjekordade jaoks seadistama?
Minimaalselt tuleks seadistada alarmid järjekorra sügavuse, vanima sõnumi vanuse ja sissetulevate sõnumite kiiruse kohta. DLQ saabumiste järsk hüpe viitab tavaliselt juurutatud veale. Sõnumi vanusehoiatused tuvastavad juhtumeid, kus kordust ei toimu. Paljud meeskonnad jälgivad ka DLQ sõnumite ja edukalt töödeldud sõnumite suhet tervisenäitajana. CloudWatch, Azure Monitor või Datadog saavad kõik need mõõdikud kuvada pager-integratsiooni abil.
Kas nii DLQ-dele kui ka mälusisestele korduskatsetele on alternatiive?
Sarnaste vajaduste rahuldamiseks on mitu mustrit. Väljundkausta muster säilitab sündmusi tehingute kaupa äriandmetega, tagades aatomilisuse. Saga muster haldab pikaajalisi hajutatud tehinguid kompenseerivate toimingutega. Andmebaasil põhinevad tööjärjekorrad nagu Sidekiq või pg-boss pakuvad püsivust ilma spetsiaalsete sõnumivahendajateta. Sündmuste hankimine rekonstrueerib oleku ainult lisamiseks mõeldud logist, muutes uuesti proovimise semantika erinevaks. Õige valik sõltub teie järjepidevuse nõuetest ja olemasolevast infrastruktuurist.
Kuidas surnud kirjade järjekorras olevaid sõnumeid turvaliselt taasesitada?
Ärge kunagi esitage otse algsesse järjekorda ilma kontrollimiseta, see on retsept lõpmatuteks tsükliteks, kui algpõhjus püsib. Selle asemel suunake DLQ-sõnumid eraldi analüüsikeskkonda, uurige representatiivseid valimeid, et tuvastada tõrkemuster, lahendage algne probleem ja seejärel esitage valikuliselt partiidena koos jälgimisega. AWS pakub DLQ ümberjuhtimise funktsioone ja tööriistad nagu Amazon EventBridge Pipes saavad automatiseerida tingimusliku taasesituse töövooge.
Mis teeb mälus olevate korduskatsete jaoks hea korduskatsete poliitika?
Eksponentsiaalne tagasilöök koos värinaga on kuldstandard. Ilma värinata võivad mitme kliendi sünkroniseeritud uuestikatsed tekitada taastuvatele teenustele tohutuid probleeme. Piirake maksimaalset viivitust, et vältida piiramatuid ooteaegu, ja määrake alati maksimaalne uuestikatsete arv. Kaaluge kaitselülitite kasutamist, mis peatavad uuestikatsed täielikult, kui rikke määr ületab läve, andes allavoolu teenustele aega taastumiseks, selle asemel, et neid maha suruda siis, kui need on maas.
Kas serverita funktsioonid toimivad mälusiseste korduskatsetega hästi?
Mitte eriti. Lambda ja sarnased funktsioonid on loodud olematuteks ja lühiajalisteks. Maksimaalne viieteistkümneminutiline täitmisaeg tähendab, et teie mälusisene uuesti proovimise aken on piiratud. Veelgi olulisem on see, et kui Lambda ebaõnnestub, kaob kogu täitmiskontekst. Serverita arhitektuurid eelistavad tugevalt eksternaliseeritud olekut, muutes sisseehitatud uuesti proovimise loogikaga DLQ-d või astmelised funktsioonid palju loomulikumaks sobivuseks kui mälusisene lähenemine.
Kuidas erinevad sõnumite järjestuse probleemid nende lähenemisviiside vahel?
DLQ-d võivad järjekorra garantiisid keerulisemaks muuta. Kui teie peamine järjekord on FIFO, võib sõnumite liigutamine DLQ-sse ja DLQ-st järjestust häirida, välja arvatud juhul, kui platvorm säilitab järjekorra. Mälus olevad uuestiproovimised ühe tarbija piires säilitavad loomulikult selle tarbija sõnumite järjestuse, kuigi mitu tarbijat töötlevad endiselt paralleelselt. Mõned süsteemid kasutavad pärast mis tahes uuestiproovimise mehhanismi õige järjestuse taastamiseks järjekorranumbreid või rakendustaseme järjestust.
Millised turvakaalutlused kehtivad surnud kirjade järjekordade kohta?
DLQ-d sisaldavad samu tundlikke andmeid kui teie peamised järjekorrad, mõnikord isegi rohkem, kuna need sisaldavad tõrke konteksti. Rakendage identset krüptimist, juurdepääsukontrolli ja auditeerimislogi. Olge ettevaatlik kordusmehhanismidega, vanade sõnumite uuesti töötlemine võib põhjustada ootamatuid kõrvalmõjusid, kui allavoolu süsteemid pole idempotentsed. Mõned reguleeritud tööstusharud nõuavad enne DLQ-sõnumitele juurdepääsu või nende taasesitamist selgesõnalisi kinnitustöövooge.
Millal peaks mälusiseseid uuesti proovimisi täielikult vältima?
Jätke need vahele, kui töötlemisel on kõrvalmõjusid, mis ei ole idempotentsed – krediitkaardi topeltdebiteerimine uuesti proovimise tõttu on katastroofiline. Vältige neid, kui täpne-ühekordne semantika on oluline ja teil puudub deduplikatsioon. Ärge lootke neile pikaajaliste toimingute puhul, kus protsess ei pruugi uuesti proovimise lõpuleviimiseks piisavalt kaua kesta. Ja ärge kasutage neid, kui operatiivmeeskonnad vajavad nähtavust tõrkemustrite kohta ilma koodimuudatusi juurutamata.
Kuidas on kulud ettevõtte tasandil võrreldavad?
Tüüpiline AWS-i seadistus SQS-i standardjärjekordade ja DLQ-dega võib maksta paar dollarit miljoni sõnumi kohta, millele lisandub säilitatud sõnumite salvestusruum. Süsteemi puhul, mis töötleb miljardeid sõnumeid kuus, muutub see oluliseks teguriks. Mälusisene uuestiproovimine nihutab kulud arvutusvõimsusele, mille eest te juba maksate. Uuestiproovimise tormid võivad aga protsessori ja mälu koormust märkimisväärselt suurendada, mis võib vajada suuremaid eksemplare. Enamik omamise kogukulu analüüse eelistab mälusisest töötlemist madala kriitilisusega suure mahuga töö puhul ja DLQ-sid väiksema mahuga oluliste töövoogude puhul.
Otsus
Valige surnud kirjade järjekorrad, kui sõnumite kadu on vastuvõetamatu ja operatiivmeeskonnad vajavad selgeid rikete piire haldamiseks. Valige mälusisesed korduskatsed, kui kiirus on kõige olulisem, infrastruktuuri lihtsus on hinnatud ja tõrked on pigem ajutised kui süsteemsed. Paljud küpsed süsteemid ühendavad tegelikult mõlemad, kasutades mälusiseseid korduskatseid koheseks taastamiseks ja mälusiseseid korduskatseid ülima varumeetmena.