Mirušo vēstuļu rindas salīdzinājumā ar atkārtotiem mēģinājumiem atmiņā
Mirušo vēstuļu rindas un atkārtoti mēģinājumi atmiņā ir divas principiāli atšķirīgas pieejas ziņojumu apstrādes kļūmju risināšanai izkliedētās sistēmās, kur DLQ nodrošina problemātisku ziņojumu ilgstošu izolāciju, savukārt atkārtoti mēģinājumi atmiņā piedāvā vieglu, zema latentuma atkopšanu bez pastāvīgās slodzes.
Iezīmes
Neveiksmīgo vēstuļu rindas saglabā neveiksmīgos ziņojumus bezgalīgi, padarot tos par būtiskiem audita un atbilstības scenārijiem.
Atmiņā esošie atkārtotie mēģinājumi tiek izpildīti ar mikrosekundes līmeņa papildu slodzi, salīdzinot ar milisekundes un vairāk latentumu rindas operācijām
Atkārtotas mēģinājumu vētras no atmiņā esošajām pieejām var izraisīt kaskādes kļūmes, ja tās neierobežo ķēdes pārtraucēji
Kas ir Mirušo vēstuļu rindas?
Pastāvīgas ziņojumu rindas, kas uztver neizdevušos ziņojumus vēlākai pārbaudei un atkārtotai apstrādei.
Ziņojumi tika pārvietoti uz DLQ pēc maksimālā atkārtotas mēģinājumu skaita pārsniegšanas, saglabājot pilnu ziņojuma saturu un metadatus.
Sākotnēji popularizēja uzņēmumu ziņojumapmaiņas sistēmas, piemēram, IBM MQ un JMS, tagad ir standarts AWS SQS, Azure Service Bus un RabbitMQ
Iespējojiet atsaistītu kļūmju analīzi, nebloķējot galvenos apstrādes kanālus, ļaujot komandām novērst problēmas un atkārtoti atskaņot ziņojumus
Parasti integrējas ar uzraudzības un brīdināšanas sistēmām, lai informētu operatorus, kad ziņojumi nonāk nedzīvas vēstules stāvoklī
Atbalsta uz laiku balstītas derīguma termiņa politikas, AWS SQS DLQ pēc noklusējuma saglabājot ziņojumus līdz 14 dienām
Kas ir Atkārtoti mēģinājumi atmiņā?
Tūlītējas atkārtotas mēģinājuma loģika, kas tiek izpildīta tajā pašā procesā bez ārēja ziņojuma saglabāšanas.
Atkārtotas mēģinājuma politikas parasti īsteno eksponenciālu atlikšanu, kur aizkaves starp mēģinājumiem dubultojas (piemēram, 1 s, 2 s, 4 s, 8 s).
Tādi ietvari kā Polly (.NET), Resilience4j (Java) un Retry (Python) nodrošina konfigurējamas atkārtotas mēģināšanas stratēģijas ar ķēdes pārtraucēju modeļiem.
Neizmanto papildu infrastruktūras resursus papildus apstrādes lietojumprogrammas esošajai atmiņai un centrālajam procesoram
Pilnībā neizdodas, ja lietojumprogramma avarē atkārtota mēģinājuma laikā, zaudējot atkārtota mēģinājuma stāvokli un, iespējams, sākotnējo darbības kontekstu.
Vispiemērotākais īslaicīgu kļūmju, piemēram, tīkla traucējumu, datubāzes savienojuma taimautu un īslaicīgas pakalpojumu nepieejamības, gadījumā
Salīdzinājuma tabula
Funkcija
Mirušo vēstuļu rindas
Atkārtoti mēģinājumi atmiņā
Noturība
Ilgtspējīga ziņojumu glabāšana atsevišķā rindā
Īslaicīgs, atrodas tikai lietojumprogrammas atmiņā
Neveiksmju atkopšana
Iztur lietojumprogrammu avārijas un restartēšanas
Pazaudēts, ja process tiek pārtraukts atkārtota mēģinājuma laikā
Infrastruktūras izmaksas
Papildu rindas glabāšanas un pārsūtīšanas izmaksas
Nav papildu infrastruktūras ārpus lietojumprogrammas
Operatīvā redzamība
Iebūvētas metrikas, trauksmes signāli un atkārtošanas iespējas
Nepieciešama pielāgota reģistrēšana un uzraudzība
Latentuma ietekme
Lielāka latentuma dēļ rindas darbībām
Minimāla latentuma, tūlītēja atkārtota izpilde
Lietošanas gadījums piemērots
Kritiskas darbplūsmas, kurām nepieciešama garantēta apstrāde
Nekritiskas darbības ar pārejošām kļūmēm
Ziņojumu secība
Var saglabāt vai izjaukt sākotnējo secību
Dabiski saglabā procesa secību
Komandas sadarbība
Nodrošina atsevišķu komandas īpašumtiesības labojumiem un atkārtošanai
Cieši saistīts ar lietojumprogrammu izvietošanu
Detalizēts salīdzinājums
Uzticamības un izturības garantijas
Mirušo vēstuļu rindas izceļas, ja ziņojumus absolūti nevar pazaudēt. Kad ziņojums nonāk DLQ, tas tur paliek, līdz kāds ar to tieši rīkojas, pat ja viss jūsu pakalpojums tiek restartēts. Turpretī atmiņā esošie atkārtotie mēģinājumi iztvaiko kā niecīgs elements, ja jūsu pods avarē vai process tiek apturēts izvietošanas laikā. Tas padara DLQ par acīmredzamu izvēli finanšu darījumiem, krājumu atjauninājumiem vai jebkam citam, kas saistīts ar atbilstību.
Veiktspējas un latentuma raksturlielumi
Atmiņā esošie atkārtotie mēģinājumi nepārprotami uzvar ātruma ziņā. Nav tīkla pārslēgšanās, nav rindas API izsaukuma, nav serializācijas piesātināto izmaksu, tikai ātra miega režīms un mēģinājums vēlreiz. Augstas caurlaidspējas sistēmām, kas apstrādā tūkstošiem ziņojumu sekundē, šī starpība summējas. DLQ rada izmērāmu latentumu, īpaši, ja ziņojumiem ir jāšķērso tīkla robežas, lai sasniegtu atsevišķu rindas pakalpojumu. Dažas komandas hibridizē, izmantojot atmiņā esošos atkārtotos mēģinājumus ātrai pārejas problēmu novēršanai un DLQ kā pēdējo drošības tīklu.
Darbības sarežģītība un atkļūdošana
DLQ izveido skaidru darbības robežu. Jūsu dežūrējošais inženieris tiek izsaukts, pārbauda nedzīvu vēstuļu rindu, novērš pamatā esošo kļūdu un atkārtoti atskaņo ziņojumus. Tā ir labi saprotama darbplūsma. Atmiņā esošie atkārtotie mēģinājumi slēpj kļūmes lietojumprogrammu žurnālos, bieži vien ir nepieciešama žurnālu apkopošana un pielāgoti informācijas paneļi, lai vispār zinātu par atkārtotiem mēģinājumiem. Kad atkārtotie mēģinājumi ir izsmelti, kļūmju risinātāja murgs kļūst par īstu problēmu, īpaši mikropakalpojumos, kur kļūme var izplatīties lejup pa straumi, pirms kāds to pamana.
Izmaksu apsvērumi mērogā
Mākoņa rindu pakalpojumi iekasē maksu par katru pieprasījumu un par katru saglabāto ziņojumu. Noslogota DLQ ar miljoniem ziņojumu var nenozīmīgi ietekmēt jūsu rēķinu, īpaši, ja saglabāšanas politikas ir dāsnas. Atmiņā esošie atkārtotie mēģinājumi no infrastruktūras viedokļa būtībā ir bez maksas, lai gan tie patērē atmiņu un var pārslogot citus pavedienus, ja atkārtotu mēģinājumu skaits nav ierobežots. Izmaksu ziņā jutīgiem jaunuzņēmumiem tas bieži vien liek svaru kausus par labu atmiņā esošajām pieejām, līdz ieņēmumi attaisno uzticamības piemaksu.
Integrācija ar mūsdienu arhitektūrām
Notikumu vadītas arhitektūras un bezserveru funkcijas ir padarījušas DLQ aktuālākus nekā jebkad agrāk. AWS Lambda, Azure Functions un Google Cloud Functions visas sākotnēji atbalsta neaktīvu burtu konfigurācijas. Atmiņā esošie atkārtotie mēģinājumi dabiskāk iederas tradicionālajos lietojumprogrammu serveros un ilgstošos procesos. Kubernetes un īslaicīgo aprēķinu pieaugums faktiski ir sarežģījis atmiņā esošās stratēģijas, konteinerus var pārtraukt ar nelielu brīdinājumu, padarot DLQ arvien pievilcīgāku pat komandām, kas iepriekš no tiem izvairījās.
Priekšrocības un trūkumi
Mirušo vēstuļu rindas
Iepriekšējumi
+Garantēta ziņojumu noturība
+Skaidra operatīvā nodošana
+Vietējā mākoņa integrācija
+Atbalsta atkārtošanu un auditu
+Izolē kļūmes ietekmi
Ievietots
−Papildu infrastruktūras izmaksas
−Augstāka pilnā latentuma vērtība
−Nepieciešams atkārtošanas mehānisms
−Var uzkrāt novecojušus ziņojumus
−Sarežģītāka arhitektūra
Atkārtoti mēģinājumi atmiņā
Iepriekšējumi
+Īpaši zema latentuma
+Nav papildu infrastruktūras
+Sākotnēji vienkārši ieviest
+Minimāla ekspluatācijas pieskaitāmā summa
+Ātra atgriezeniskā saite par kļūmēm
Ievietots
−Pazudis procesa avārijas dēļ
−Slēpts no operācijām
−Var izraisīt atkārtotas vētras
−Cieša saikne ar lietotnes dzīves ciklu
−Grūtāk atkļūdot retrospektīvi
Biežas maldības
Mīts
Mirušo vēstuļu rindas novērš nepieciešamību pēc atkārtotas mēģināšanas loģikas lietojumprogrammās.
Realitāte
DLQ ir galamērķis pēc atkārtotu mēģinājumu skaita beigām, nevis atkārtotu mēģinājumu loģikas aizstājējs. Lielākā daļa ieviešanas joprojām veic tūlītējus vai aizkavētus atkārtotus mēģinājumus, pirms jebkad tiek uzskatīts, ka ziņojums ir miris. Bez starpposma atkārtotiem mēģinājumiem katra īslaicīga kļūme nekavējoties pārpludinātu jūsu DLQ.
Mīts
Atkārtoti mēģinājumi atmiņā vienmēr ir ātrāki un tāpēc uzlabo veiktspēju.
Realitāte
Lai gan atsevišķi atkārtoti mēģinājumi ir ātrāki, neierobežoti atkārtoti mēģinājumi atmiņā var piesātināt pavedienu kopas un samazināt kopējo sistēmas caurlaidspēju. Veiktspējas priekšrocība ātri izzūd, ja atkārtotu mēģinājumu vētras aktivizē ķēdes pārtraucējus vai pārslogo lejupējos pakalpojumus.
Mīts
Ziņojumi nedzīvu vēstuļu rindās tiek automātiski apstrādāti vēlāk.
Realitāte
DLQ ir pasīva krātuve, ar šiem ziņojumiem nekas nenotiek, kamēr nenotiek tieša cilvēka vai automatizēta darbība. Daudzas komandas ir atklājušas vairākus mēnešus vecus ziņojumus, kas slēpjas DLQ, jo neviens nav izveidojis atkārtošanas plūsmu.
Mīts
Jums jāizvēlas tikai starp DLQ un atkārtotiem mēģinājumiem atmiņā.
Realitāte
Šie modeļi viens otru lieliski papildina. Visnoturīgākās sistēmas izmanto atmiņā esošos atkārtotus mēģinājumus ar eksponenciālu atteici ātrai atkopšanai, pēc tam, kad sasniegts saprātīgs slieksnis, tie tiek eskalēti līdz DLQ. Šī daudzslāņainā pieeja aptver gan pārejošus, gan pastāvīgus kļūmes režīmus.
Mīts
Atkārtoti mēģinājumi atmiņā nav piemēroti izkliedētām sistēmām.
Realitāte
Lai gan atmiņā esošie atkārtotie mēģinājumi ir mazāk stabili nekā DLQ, tie joprojām ir izplatīti un piemēroti izkliedētās sistēmās idempotentām, nekritiskām darbībām. Galvenais ir saskaņot atkārtotā mēģinājuma stratēģiju ar faktiskajām kļūmes sekām biznesā, nevis pieņemt, ka viens modelis der visiem.
Mīts
Mirušo vēstuļu rindas novērš ziņojumu zudumu sistēmas darbības pārtraukumu laikā.
Realitāte
DLQ palīdz tikai tiem ziņojumiem, kurus rindošanas sistēma jau ir pieņēmusi. Ja ziņojums nekad nesasniedz primāro rindu tīkla nodalījuma vai ražotāja kļūmes dēļ, DLQ to nevar maģiski atgūt. Pilnīgai uzticamībai ir nepieciešama arī ražotāja puses noturība.
Bieži uzdotie jautājumi
Kas tieši izraisa ziņojuma pārvietošanu uz nedzīvu vēstuļu rindu?
Ziņojumi parasti nonāk DLQ pēc konfigurēto atkārtotas mēģināšanas mēģinājumu skaita izsmelšanas, kas var nozīmēt maksimālā saņemšanas skaita pārsniegšanu SQS, piegādes kļūmi vairākiem patērētājiem vai skaidru noraidīšanu lietojumprogrammas kodā. Precīzs aktivizētājs atšķiras atkarībā no platformas: AWS SQS izmanto atkārtotas piedziņas politiku, kas nosaka maksimālo saņemšanas skaitu, savukārt Azure Service Bus izseko piegādes skaitu. Kad šis slieksnis tiek pārsniegts, ziņojumapmaiņas infrastruktūra automātiski pārvieto vai kopē ziņojumu uz saistīto nedzīvu vēstuļu rindu.
Kā atmiņā esošie atkārtotie mēģinājumi apstrādā procesa restartēšanu vai avārijas?
Tās to nedara, kas ir to būtisks ierobežojums. Jebkurš atkārtotas mēģināšanas stāvoklis pastāv tikai darbojošā procesa kaudzē. Ja lietojumprogramma avarē, tiek apturēta izvietošanas laikā vai konteiners tiek pārplānots, visi gaidošie atkārtotie mēģinājumi un to konteksts pazūd. Operācijām, kurām jāizdzīvo šādos gadījumos, ir nepieciešami pastāvīgi atkārtotas mēģināšanas mehānismi, neatkarīgi no tā, vai tā ir DLQ, datubāzē balstīta uzdevumu rinda vai izkliedētas uzdevumu sistēmas, piemēram, Celery vai Hangfire.
Vai vienā sistēmā var apvienot nederīgu vēstuļu rindas ar atkārtotiem mēģinājumiem atmiņā?
Pilnīgi piekrītu, un šī patiesībā ir labākā prakse daudzām komandām. Tipisks modelis ietver atkārtotus mēģinājumus atmiņā ar eksponenciālu atlikšanu tūlītējai īslaicīgai atkopšanai, piemēram, trīs mēģinājumus dažu sekunžu laikā. Ja tie neizdodas, ziņojums vai darbība tiek publicēta rindā ar DLQ atbalstu ilgstošai apstrādei. Tas nodrošina atmiņā veiktu atkārtotu mēģinājumu ātrumu kļūmju gadījumā un DLQ drošību pastāvīgu problēmu gadījumā.
Kādu uzraudzību vajadzētu iestatīt nedzīvu vēstuļu rindām?
Vismaz konfigurējiet trauksmes signālus par rindas dziļumu, vecākā ziņojuma vecumu un ienākošo ziņojumu ātrumu. Pēkšņs DLQ pienākšanas pieaugums parasti norāda uz ieviestu kļūdu. Ziņojumu vecuma brīdinājumi konstatē gadījumus, kad atkārtota atskaņošana nenotiek. Daudzas komandas arī izseko DLQ ziņojumu un veiksmīgi apstrādāto ziņojumu attiecību kā veselības indikatoru. CloudWatch, Azure Monitor vai Datadog var parādīt šos rādītājus ar peidžera integrāciju.
Vai pastāv alternatīvas gan DLQ, gan atkārtotiem mēģinājumiem atmiņā?
Vairāki modeļi risina līdzīgas vajadzības. Izsūtnes modelis saglabā notikumus transakcijas veidā ar biznesa datiem, nodrošinot atomiskumu. Saga modelis pārvalda ilgstošas izkliedētas transakcijas ar kompensējošām darbībām. Datubāzē balstītas darbu rindas, piemēram, Sidekiq vai pg-boss, piedāvā saglabāšanu bez īpašiem ziņojumu brokeriem. Notikumu avoti rekonstruē stāvokli no tikai pievienošanas žurnāla, padarot atkārtotas mēģināšanas semantiku atšķirīgu. Pareizā izvēle ir atkarīga no jūsu konsekvences prasībām un esošās infrastruktūras.
Kā droši atskaņot ziņojumus no nedzīvu vēstuļu rindas?
Nekad neatskaņojiet tieši sākotnējā rindā bez pārbaudes, jo tā ir recepte bezgalīgām cilpām, ja pamatcēlonis joprojām pastāv. Tā vietā nosūtiet DLQ ziņojumus uz atsevišķu analīzes vidi, pārbaudiet reprezentatīvus paraugus, lai identificētu kļūmes modeli, novērsiet pamatproblēmu un pēc tam selektīvi atkārtojiet partijās ar uzraudzību. AWS nodrošina DLQ atkārtotas atskaņošanas funkcijas, un tādi rīki kā Amazon EventBridge Pipes var automatizēt nosacītas atkārtošanas darbplūsmas.
Kas veido labu atkārtotas mēģināšanas politiku atmiņā esošajiem atkārtotiem mēģinājumiem?
Eksponenciāla aizture ar trīci ir zelta standarts. Bez trīces sinhronizēti atkārtoti mēģinājumi no vairākiem klientiem var radīt milzīgas problēmas ar pakalpojumu atjaunošanu. Ierobežojiet maksimālo aizkavi, lai novērstu neierobežotu gaidīšanu, un vienmēr iestatiet maksimālo atkārtotu mēģinājumu skaitu. Apsveriet iespēju izmantot ķēdes pārtraucējus, kas pilnībā aptur atkārtotus mēģinājumus, ja kļūmju rādītāji pārsniedz sliekšņus, dodot lejupējiem pakalpojumiem laiku atjaunoties, nevis tos spiežot, kamēr tie nedarbojas.
Vai bezservera funkcijas labi darbojas ar atkārtotiem mēģinājumiem atmiņā?
Ne īpaši. Lambda un līdzīgas funkcijas ir izstrādātas kā bezstāvokļa un īslaicīgas. Maksimālais piecpadsmit minūšu izpildes laiks nozīmē, ka jūsu atmiņā esošā atkārtotas mēģināšanas logs ir ierobežots. Vēl svarīgāk ir tas, ka, ja Lambda neizdodas, viss izpildes konteksts pazūd. Bezserveru arhitektūras stingri dod priekšroku ārējai stāvokļa apstrādei, padarot DLQ vai soļu funkcijas ar iebūvētu atkārtotas mēģināšanas loģiku daudz dabiskāk piemērotas nekā atmiņā esošās pieejas.
Kā ziņojumu secības jautājumi atšķiras starp šīm pieejām?
DLQ rindas var sarežģīt secības garantijas. Ja jūsu primārā rinda ir FIFO, ziņojumu pārvietošana uz DLQ un no tās var izjaukt secību, ja vien platforma īpaši nesaglabā secību. Atmiņā esošie atkārtotie mēģinājumi viena patērētāja ietvaros dabiski saglabā šī patērētāja ziņojumu secību, lai gan vairāki patērētāji joprojām apstrādā paralēli. Dažas sistēmas izmanto secības numurus vai lietojumprogrammas līmeņa secību, lai atjaunotu pareizu secību pēc jebkura atkārtota mēģinājuma mehānisma.
Kādi drošības apsvērumi attiecas uz nedzīvu vēstuļu rindām?
DLQ satur tādus pašus sensitīvos datus kā jūsu primārās rindas, dažreiz pat vairāk, jo tās ietver kļūmes kontekstu. Lietojiet identisku šifrēšanu, piekļuves kontroli un audita reģistrēšanu. Esiet piesardzīgi ar atkārtošanas mehānismiem, jo veco ziņojumu atkārtota apstrāde var izraisīt negaidītas blakusparādības, ja lejupējās sistēmas nav idempotentas. Dažās regulētās nozarēs ir nepieciešamas skaidras apstiprināšanas darbplūsmas, pirms var piekļūt DLQ ziņojumiem vai tos atkārtoti atskaņot.
Kad vajadzētu pilnībā izvairīties no atkārtotiem mēģinājumiem atmiņā?
Izlaidiet tos, ja apstrādei ir blakusparādības, kas nav idempotentas, jo kredītkartes dubulta iekasēšana atkārtota mēģinājuma dēļ ir katastrofāla. Izvairieties no tiem, ja ir svarīga precīzas vienreizējas darbības semantika un jums trūkst deduplikācijas. Nepaļaujieties uz tiem ilgstošām darbībām, kur process var nebūt pietiekami ilgs, lai pabeigtu atkārtotus mēģinājumus. Un neizmantojiet tos, ja operatīvajām komandām ir nepieciešama pārredzamība kļūmju modeļos, neieviešot koda izmaiņas.
Kā izmaksas salīdzināmas uzņēmuma mērogā?
Tipiska AWS iestatīšana ar SQS standarta rindām un DLQ varētu izmaksāt dažus dolārus par miljonu ziņojumu, kā arī saglabāto ziņojumu krātuvi. Sistēmai, kas ik mēnesi apstrādā miljardus, tas kļūst būtiski. Atmiņā ierakstītie atkārtotie mēģinājumi pārnes izmaksas uz skaitļošanas uzņēmumiem, par kuriem jūs jau maksājat. Tomēr atkārtotie mēģinājumi var ievērojami palielināt centrālā procesora un atmiņas noslodzi, potenciāli pieprasot lielākus instanču izmērus. Lielākā daļa kopējo īpašumtiesību izmaksu analīžu dod priekšroku atmiņā ierakstītiem darbiem ar mazu kritiskumu un liela apjoma darbiem, bet DLQ — mazāka apjoma būtiskām darbplūsmām.
Spriedums
Izvēlieties nedzīvu vēstuļu rindas, ja ziņojumu zudums ir nepieņemams un operatīvajām komandām ir jāpārvalda skaidras kļūmju robežas. Izvēlieties atmiņā esošus atkārtotus mēģinājumus, ja vissvarīgākais ir ātrums, infrastruktūras vienkāršība ir ļoti svarīga un kļūmes ir patiesi pārejošas, nevis sistēmiskas. Daudzas nobriedušas sistēmas faktiski apvieno abus, izmantojot atmiņā esošus atkārtotus mēģinājumus tūlītējai atkopšanai un DLQ kā galveno drošības līdzekli.