de Zhia Hwa Chong

Un ghid al manechinului la cozile distribuite

Dacă te-ai întrebat vreodată ce Kafka, Heron, streaming în timp real, SQS sau RabbitMQ toate sunt despre, atunci acest articol este pentru tine. Voi discuta în detaliu de ce avem nevoie de o coadă pentru arhitectura software modernă de astăzi, care sunt unele tehnologii comune utilizate și cum sunt utilizate în mod obișnuit cozile în industrie. Dacă vă place acest articol, am un curs despre scalarea sistemelor distribuite, unde discut aceste subiecte mai detaliat.

OK, hai să intrăm!

Un ghid al manechinului la cozile distribuite
Un ghid al manechinului la cozi

În primul rând, de ce ai nevoie de un broker de cozi / mesaje?

Povestea despre cum o coadă a salvat limonada stă

Imaginați-vă că conduceți o limonadă? stați în picioare și ați construit o aplicație web mică și inteligentăurmărește frecvența cu care clienții tăi se întorc la standul tău de limonadă.

Aplicația dvs. web are un punct final, să zicem yourlemonade.com/traffic, și de fiecare dată când faceți clic pe un buton, numărul de trafic crește cu 1. Frumos.

Pe măsură ce traficul către standul de limonadă crește, faceți clic pe buton din ce în ce mai mult. Ei bine, din moment ce locuiți într-un cartier relativ mic, primiți doar 10-20 de persoane pe zi. Vânzările dvs. se desfășoară ca de obicei, aplicația web gestionează traficul foarte bine și totul este în regulă și dandy. Perfect.

1611202329 635 Un ghid al manechinului la cozile distribuite
Aplicația dvs. web pentru limonadă

Coșmarul unei afaceri în plină expansiune

Acum că standul tău de limonadă și-a făcut un nume, oamenii din tot orașul se adună pentru a gusta din faimoasa ta limonadă. Și într-o frumoasă duminică dimineață, știrile locale au decis să vă promoveze standul și traficul EXPLODĂ.

După cum vă puteți imagina, traficul către standul dvs. de limonadă crește de la 10-20 de persoane pe zi la 10.000 pe zi. Atingeți cu furie butonul de trafic, care la rândul său declanșează un apel către yourlemonade.com/traffic, iar aplicația dvs. web continuă să mărească cantitatea de trafic.

1611202330 747 Un ghid al manechinului la cozile distribuite
Afacerea cu standuri de limonadă intră în blocaj

Din păcate, aplicația dvs. web este găzduită pe un server RAM de 8 biți, 128 MB în garajul casei dvs. Datorită afacerii în plină expansiune și a traficului crescut, aplicația dvs. web nu mai poate gestiona scara traficului.

În cele din urmă, serverul dvs. moare. ☠️

Cu aceasta, întreaga aplicație web este redusă. Nu mai puteți urmări traficul. Oamenii se grăbesc, comenzile se acumulează, totuși aplicația dvs. web este defectă și nu puteți gestiona nicio tranzacție până când nu puteți începe din nou înregistrarea traficului.

1611202330 442 Un ghid al manechinului la cozile distribuite
Traficul a redus aplicația dvs. web și compania.

Ce faci?

Coadă la salvare

Un moment de strălucire te lovește, ce se întâmplă dacă așez o cutie în fața tejghelei în care fiecare client poate să arunce o notă spunând că a fost acolo?

De fiecare dată când un client trece prin ușă și plasează o comandă, îi cereți politicos să-și lase foile de comandă într-o cutie mică plasată în fața tejghelei de plăți. Remarcabil! Ați introdus în esență un mecanism pentru a ține evidența sosirilor, permițând în același timp afacerii dvs. să funcționeze ca de obicei.

Asta numim noi prelucrare asincronă, și, bun venit în lumea cozilor. ?

1611202331 618 Un ghid al manechinului la cozile distribuite
Erou salvator!

Când începeți să construiți software, la fel ca standul de limonadă pe care l-am menționat mai sus, este obișnuit ca o sarcină să o facă

  1. sunați la un serviciu, atunci
  2. așteptați terminarea serviciului și apoi
  3. treceți la următoarea sarcină.

Așa se numește prelucrare sincronă. Procesare asincronăpe de altă parte, permite unei sarcini să apeleze un serviciu și treceți la următoarea sarcină în timp ce serviciul procesează solicitarea în ritmul său. De aceea, o coadă este un mod frumos și elegant de a vă debloca sistemele, deoarece pune un strat în fața serviciilor dvs. și le permite să abordeze sarcinile în ritmul lor.

Dacă o coadă este atât de puternică, de ce nu o punem în fața tuturor?

Un ghid al manechinului la cozile distribuite
Imagine oferită de imgflip.com

După cum poate atesta oricine s-a implicat în sisteme distribuite, scalarea unui sistem distribuit este extrem de complicată și complicată. Există câteva lucruri de știut despre cozi care ar putea face din coadă o propunere neatractivă pentru sistemul dvs.

Câteva întrebări pe care le-aș pune înainte de a decide dacă o coadă este soluția potrivită pentru dvs.:

  • Serviciul dvs. are probleme din cauza traficului ridicat? Dacă nu, poate ar trebui să te uiți la care este blocajul înainte de a trece la cozi. După cum a spus faimos Donald Knuth, optimizarea prematură este rădăcina tuturor răurilor.
  • Aveți experiență internă în gestionarea unei cozi? Sau trebuie să angajezi potențial o echipă care să o facă pentru tine? Costurile de întreținere, cum ar fi scalarea cozii, pot crește dacă nu sunteți atent. Există servicii precum Amazon SQS (Serviciu simplu de așteptare) care oferă un a reușit soluție (adică nu trebuie să întrețineți nimic pe cont propriu).
  • Este posibil să aveți intrări duplicate în coadă? Dacă da, este acceptabil?
  • Trebuie să țineți o evidență a tuturor tranzacțiilor, în cazul în care o coadă scade?
  • În cazul în care o coadă cade, coada trebuie să poată reda toate intrările? Care sunt opțiunile dvs. de rezervă?

Există mult mai multe îngrijorări care ar putea fi specifice cazului dvs. de utilizare, dar, din fericire, mi-am exprimat ideea că adăugarea unei cozi nu este la fel de ușoară ca să dai cu degetele.

Cum sunt folosite cozile în arhitectura modernă

Cozile sunt omniprezente în arhitectura modernă a sistemelor distribuite de astăzi – adoptate în diferite industrii pentru diferite cazuri de utilizare și există mai multe cazuri de utilizare noi în fiecare zi.

Iată câteva dintre cazurile de utilizare din coada reală:

Streaming în timp real

Când a apărut MapReduce, a fost un fenomen imens în industrie, deoarece a permis simplilor muritori să proceseze petabytes de date într-o perioadă rezonabilă de timp, de la zile la ore. Acest lucru ar putea părea absurd astăzi când datele sunt disponibile în aproape câteva secunde, dar înainte de MapReduce, nu a fost ușor să extragem date utilizabile din seturi de date extrem de mari.

Apetitul pentru analiza datelor a crescut și acum ne uităm la procesarea datelor în câteva ore și, uneori, milisecunde.

Pentru a realiza analize și performanțe cu latență redusă într-un mod continuu, a fost conceput conceptul de streaming în timp real.

Un exemplu util aici este să ne gândim la reclame: reclame pe Twitter, de exemplu, sunt afișate pentru milioane de oameni pe zi. Cu toate acestea, pentru a ne asigura că utilizatorii nu văd aceleași reclame de mai multe ori într-o anumită perioadă de timp, Twitter trebuie să știe cumva ultima dată când un utilizator a fost expus unui anumit anunț.

Dacă ne-am fi bazat pe MapReduce pentru a efectua această acțiune, nici măcar nu ar fi considerată o soluție, deoarece va dura mai multe ore pentru a procesa toate acele date. În schimb, transmiterea în timp real ne permite să procesăm afișările de anunțuri pe măsură ce acestea ajung. Totul este posibil datorită cozilor care permit transmiterea și procesarea continuă a datelor în timp real.

Unele tehnologii despre care veți auzi deseori în cazurile de utilizare în timp real sunt Kafka, fluxurile Kafka, Redis, Spark Streaming (care este diferit de Spark) și așa mai departe.

Arhitectură bazată pe evenimente

Cozile sunt utilizate ca o componentă critică a unui arhitectură bazată pe evenimente, sau cunoscut în mod colocvial ca Pub(lisher) –Sub(scriber). Arhitectura bazată pe evenimente este, conform Wikipedia:

Arhitectura bazată pe evenimente (EDA), este un model de arhitectură software care promovează producția, detectarea, consumul și reacția la evenimente.

Aș vrea să mă gândesc la acest lucru ca la abonarea la un buletin informativ: în calitate de producător al unui buletin informativ, știți cine s-a abonat la newsletter-ul dvs. și cine nu. Scrii conținutul și apoi îl trimiți abonaților tăi.

Pe de altă parte, în calitate de abonat, ați putea fi abonat la mai multe buletine informative, dar nu știți cine sunt ceilalți abonați. Dar nu prea îți pasă de asta. Aceasta este o caracteristică foarte frumoasă, deoarece acum puteți scrie software care ascultă o grămadă de evenimente și răspunde doar la cele care vă interesează.

RabbitMQ și Amazon SQS (Simple Queuing Service) sunt câteva dintre tehnologiile utilizate adesea pentru aceste tipuri de cazuri de utilizare.

Infrastructură distribuită, tolerantă la erori, scalabilă

Sistemele distribuite sunt predispuse la erori, iar o coadă este una dintre mai multe modalități de a crește rezistența în arhitectură. Într-o arhitectură de microservice (sau Arhitectura orientată spre servicii), microservicii multiple comunică între ele prin cozi ca interfețe partajate.

Atunci când un microserviciu eșuează în mod neașteptat, o coadă este în continuare capabilă să accepte mesaje. Aceasta în esență oferă un buffer pentru recuperarea microserviciului nostru. Odată ce microserviciul revine online, acesta poate prelua mesajele din coadă și le poate procesa din nou.

Gândiți-vă la aceasta ca la cutia dvs. poștală. În timp ce sunteți în vacanță în Hawaii, persoana poștală vă va livra în continuare poșta în cutia poștală. Odată ce vă întoarceți din vacanță, puteți prelua e-mailurile și le puteți prelucra în timp liber.

Mulțumesc că ai citit! Sper că ați învățat ceva sau două despre cozile distribuite din articolul meu. Dacă v-a plăcut să citiți acest lucru, vă rugăm să lăsați o palmă și nu ezitați să vă alăturați newsletterului meu aici unde scriu despre software și interviuri tehnice!

Resurse pe care le recomand

Pentru a vă înțelege mai bine cozile și diferitele subiecte menționate mai sus, aș recomanda aceste resurse de mai jos. Sau alătură-te cursului meu despre scalarea sistemelor distribuite pentru a afla mai multe despre cozi 🙂

(FYI, împărtășesc mai multe resurse pe site-ul meu: zhiachong.com unde am încercat și testat personal și recomand pentru inginerii software de toate nivelurile.)

Noroc!