Projektowanie odpornych aplikacji na AWS
Tworzenie aplikacji na AWS
Ricardo Sueiras
Principal Technologist
Budowanie odporności
Błędy tymczasowe
Poznaj typowe rodzaje awarii:
Błędy tymczasowe ustępują samoistnie — zwykle można je bezpiecznie ponowić.
Przekroczenia czasu
Poznaj typowe rodzaje awarii:
Błędy tymczasowe ustępują samoistnie — zwykle można je bezpiecznie ponowić.
Przekroczenia czasu (timeout): zewnętrzna usługa odpowiada zbyt wolno.
Błędy trwałe
Poznaj typowe rodzaje awarii:
Błędy tymczasowe ustępują samoistnie — zwykle można je bezpiecznie ponowić.
Przekroczenia czasu (timeout): zewnętrzna usługa odpowiada zbyt wolno.
Błędy trwałe: żądanie jest fundamentalnie błędne — ponowienie nic nie zmieni.
Limity API
Poznaj typowe rodzaje awarii:
Błędy tymczasowe ustępują samoistnie — zwykle można je bezpiecznie ponowić.
Przekroczenia czasu (timeout): zewnętrzna usługa odpowiada zbyt wolno.
Błędy trwałe: żądanie jest fundamentalnie błędne — ponowienie nic nie zmieni.
Limity żądań API: zbyt wiele żądań — spodziewaj się HTTP 429 Too Many Requests.
Strategie ponawiania
Awarie w systemach rozproszonych często mają charakter tymczasowy.
Ponowione żądanie często kończy się sukcesem.
Dodawaj logikę ponowień ostrożnie — ślepe ponawianie może pogorszyć sytuację.
Wykładnicze wycofanie (exponential backoff): wydłużaj odstęp między próbami.
Jitter: dodaj losowość, aby uniknąć spiętrzenia ponowień.
Limit prób: zapobiega nieskończonym pętlom.
Wbudowane możliwości AWS SDK
AWS SDK obsługuje logikę ponowień automatycznie.
Wbudowane ponawianie obejmuje exponential backoff i jitter.
Nieudane lub ograniczone żądania są ponawiane z rosnącymi opóźnieniami.
Ogranicza ilość kodu obsługi błędów, który musisz pisać.
Zarządzanie logiką ponowień
Logika ponowień nie zawsze jest rozwiązaniem.
Błędy HTTP 4xx: serwer zrozumiał żądanie i je odrzucił.
Żądania nieidempotentne: ponawianie może skutkować duplikatami lub niespójnymi działaniami.
Zarządzanie timeoutami
Nieograniczone ponawianie może nasilać problemy pod obciążeniem.
Łącz ponawianie z timeoutami.
Timeout wyznacza maksymalny czas oczekiwania na odpowiedź.
Każde wywołanie zewnętrznej usługi powinno mieć ustawiony timeout.
Circuit breaker
Gdy usługa wciąż zawodzi, samo ponawianie nie wystarczy.
Ciągłe wysyłanie żądań może przeciążyć i tak już wadliwą usługę.
Wzorzec circuit breaker tymczasowo wstrzymuje żądania do niesprawnej zależności.
Stan zamknięty: żądania przepływają normalnie.
Circuit breaker
Gdy liczba awarii przekroczy próg, obwód się otwiera.
Kolejne żądania są blokowane.
Circuit breaker
Po czasie schładzania obwód przechodzi w stan półotwarty, testując odzyskanie sprawności.
Usługa odpowiada poprawnie: wznawiane jest normalne działanie.
Nadal zawodzi: obwód pozostaje otwarty.
Implementuj circuit breaker na poziomie aplikacji.
Kolejki utraconych wiadomości
Wiadomości, które wciąż się nie przetwarzają, mogą blokować system.
Przenieś je poza główny przepływ przetwarzania.
Nieudane wiadomości trafiają do kolejki utraconych wiadomości (Dead Letter Queue).
To kluczowy element budowania odpornych aplikacji.
Pamiętaj jednak o kompromisach.
Limity API w AWS
Z usługami AWS komunikujesz się przez API.
Każda usługa definiuje własne limity żądań API.
Przekroczenie limitu powoduje throttling (HTTP 429 Too Many Requests).
Projektuj aplikację tak, by sprawnie obsługiwała throttling.
Integracja z usługami zewnętrznymi
Usługi zewnętrzne wprowadzają niepewność.
Nie masz kontroli nad ich wydajnością ani dostępnością.
Ustaw timeouty, aby uniknąć długiego oczekiwania.
Stosuj ponawianie z backoffem przy błędach tymczasowych.
Izoluj zależności, aby ograniczyć zasięg awarii.
Integracja z usługami zewnętrznymi
Rozważ przejście z komunikacji synchronicznej na asynchroniczną.
System kontynuuje przetwarzanie, nawet gdy zewnętrzna usługa jest opóźniona.
Czas na praktykę!
Tworzenie aplikacji na AWS
Preparing Video For Download...