Proiectarea aplicațiilor tolerante la erori și reziliente pe AWS
Dezvoltarea aplicațiilor pe AWS
Ricardo Sueiras
Principal Technologist
Construirea pentru reziliență
Erori temporare
Înțelege modurile comune de eșec:
Erorile temporare dispar de la sine – de obicei, e sigur să reîncerci.
Timeout-uri
Înțelege modurile comune de eșec:
Erorile temporare dispar de la sine – de obicei, e sigur să reîncerci.
Timeout-uri: serviciul extern durează prea mult să răspundă.
Erori permanente
Înțelege modurile comune de eșec:
Erorile temporare dispar de la sine – de obicei, e sigur să reîncerci.
Timeout-uri: serviciul extern durează prea mult să răspundă.
Erori permanente: cererea este fundamental greșită, reîncercarea nu va ajuta.
Limite API
Înțelege modurile comune de eșec:
Erorile temporare dispar de la sine – de obicei, e sigur să reîncerci.
Timeout-uri: serviciul extern durează prea mult să răspundă.
Erori permanente: cererea este fundamental greșită, reîncercarea nu va ajuta.
Limite de rată API: prea multe cereri, te aștepți la HTTP 429 Too Many Requests.
Strategii de reîncercare
Eșecurile în sistemele distribuite sunt adesea temporare.
O cerere reîncercată reușește de regulă.
Adaugă logica de reîncercare cu atenție – reîncercările oarbe pot agrava situația.
Backoff exponențial: crește intervalul dintre reîncercări.
Jitter: adaugă aleatorie pentru a evita vârfurile de reîncercări.
Limite de reîncercări: previne buclele infinite.
Capabilități native ale AWS SDK
AWS SDK-urile gestionează automat logica de reîncercare.
Reîncercarea integrată include backoff exponențial și jitter.
Cererile eșuate sau throttled sunt reîncercate cu întârzieri crescânde.
Reduce cantitatea de cod de gestionare a erorilor pe care trebuie să-l scrii.
Gestionarea logicii de reîncercare
Logica de reîncercare nu este întotdeauna soluția.
Erori HTTP 4xx: serverul a înțeles și a respins cererea.
Cereri non-idempotente: reîncercarea poate cauza acțiuni duplicate sau inconsistente.
Gestionarea timeout-urilor
Reîncercările fără limite pot amplifica problemele sub sarcină.
Combină reîncercările cu timeout-uri.
Un timeout stabilește timpul maxim de așteptare a unui răspuns.
Orice apel către un serviciu extern ar trebui să aibă un timeout.
Circuit breaker-e
Când un serviciu continuă să eșueze, reîncercările singure nu sunt suficiente.
Trimiterea continuă de cereri poate supraîncărca serviciul cu probleme.
Modelul circuit breaker oprește temporar cererile către o dependență nesănătoasă.
Stare închisă: cererile circulă normal.
Circuit breaker-e
Când eșecurile depășesc un prag, circuitul se deschide.
Cererile ulterioare sunt blocate.
Circuit breaker-e
După un interval de răcire, circuitul intră într-o stare semi-deschisă pentru a testa recuperarea.
Serviciul răspunde cu succes: operarea normală reia.
Încă eșuează: circuitul rămâne deschis.
Implementează circuit breaker-ele la nivelul aplicației.
Dead letter queue-uri
Mesajele care eșuează repetat pot bloca sistemul.
Mută-le în afara fluxului principal de procesare.
Mesajele eșuate ajung într-un Dead Letter Queue.
Componentă esențială pentru aplicații reziliente.
Totuși, înțelege compromisurile implicate.
Limite API AWS
Interacționezi cu serviciile AWS prin intermediul API-urilor.
Fiecare serviciu își definește propriile limite de rată API.
Depășirea limitelor declanșează throttling (HTTP 429 Too Many Requests).
Proiectează aplicația să gestioneze throttling-ul fără probleme.
Integrarea cu servicii terțe
Serviciile terțe introduc incertitudine.
Nu ai control asupra performanței sau disponibilității lor.
Setează timeout-uri pentru a preveni așteptările lungi.
Folosește reîncercări cu backoff pentru problemele temporare.
Izolează dependențele pentru a limita impactul eșecurilor.
Integrarea cu servicii terțe
Ia în calcul trecerea de la comunicarea sincronă la cea asincronă.
Sistemul tău continuă să proceseze chiar dacă serviciul extern întârzie.
Hai să exersăm!
Dezvoltarea aplicațiilor pe AWS
Preparing Video For Download...