Caching i optymalizacja wydajności

Najszybszy request to ten, którego nie trzeba przetwarzać. Caching (buforowanie) to jedna z najpotężniejszych technik optymalizacji. Zamiast za każdym razem odpytywać bazę danych czy generować stronę od nowa, serwujesz gotową odpowiedź z pamięci podręcznej. W tej lekcji poznasz strategie cachingu w AWS i inne techniki przyspieszania aplikacji.

Dlaczego caching jest ważny?

Wyobraź sobie restaurację. Kucharz nie gotuje zupy od zera dla każdego klienta. Rano gotuje duży gar i nalewa z niego porcje. To jest caching w kulinarnym wydaniu.

W aplikacjach webowych bez cachingu:

  • Każdy request trafia do bazy danych (obciążenie rośnie liniowo z ruchem)
  • Te same dane są pobierane tysiące razy na minutę
  • Czas odpowiedzi rośnie, użytkownicy się frustrują
  • Koszty infrastruktury rosną, bo potrzebujesz coraz większych baz danych

Amazon CloudFront: caching na edge

CloudFront to CDN (Content Delivery Network) od AWS. Przechowuje kopie Twoich danych w ponad 400 lokalizacjach na całym świecie (edge locations). Gdy użytkownik z Warszawy requestuje Twoją stronę, dostaje ją z najbliższej edge location, a nie z serwera w Virginii.

Co CloudFront cachuje?

  • Statyczne pliki: obrazy, CSS, JS, fonty, filmy
  • Dynamiczne odpowiedzi API (z konfigurowalnym TTL)
  • Całe strony webowe (dla stron, które się rzadko zmieniają)

Jak działa cache w CloudFront?

  1. Użytkownik requestuje plik (np. logo.png)
  2. Request trafia do najbliższej edge location
  3. Cache HIT: plik jest w cache, CloudFront serwuje go natychmiast (latencja: milisekundy)
  4. Cache MISS: pliku nie ma w cache, CloudFront pobiera go z origin (S3/EC2/ALB), cachuje lokalnie i serwuje użytkownikowi
  5. Kolejne requesty o ten sam plik z tej edge location to cache HIT
💡 TTL (Time To Live)
TTL określa, jak długo obiekt pozostaje w cache. Domyślnie 24 godziny. Dla statycznych zasobów (logo, fonty) możesz ustawić długi TTL (np. tydzień). Dla dynamicznych danych (ceny, stock) krótki TTL (np. minuty). Możesz też wymusić invalidację cache, gdy zmieniasz zawartość.

Amazon ElastiCache

ElastiCache to zarządzana usługa in-memory cache. Dane trzymane w pamięci RAM, więc dostęp jest o rząd wielkości szybszy niż z dysku (mikrosek. vs milisek.). AWS oferuje dwa silniki:

⚖️ Redis vs Memcached
CechaRedisMemcached
Struktury danychZaawansowane (strings, lists, sets, hashes, sorted sets)Proste (key-value)
PersistenceTak (snapshots, AOF)Nie (dane giną po restarcie)
ReplikacjaTak (Multi-AZ, read replicas)Nie
Pub/SubTakNie
Przypadek użyciaSesje, leaderboardy, kolejki, pub/subProsty cache, duże obiekty

Typowe zastosowania ElastiCache:

  • Database caching: wyniki częstych zapytań SQL trzymasz w cache. Zamiast odpytywać bazę 10 000 razy/s, odpytujesz cache.
  • Session store: sesje użytkowników w Redis (wspiera stateless applications i Auto Scaling)
  • Leaderboard/ranking: Redis Sorted Sets idealnie nadają się do rankingów w grach
  • Real-time analytics: szybki zapis i odczyt liczników, metryk
⚠️ EXAM ALERT
Na egzaminie: jeśli pytanie mówi o "reducing database load", "improving read performance for frequently accessed data" lub "storing session data for stateless applications", odpowiedź to ElastiCache (Redis). Jeśli pytanie wspomina o "caching static content globally" lub "reducing latency for global users", odpowiedź to CloudFront.

DynamoDB Accelerator (DAX)

DAX to in-memory cache specjalnie dla DynamoDB. Działa jako warstwa pośrednia: Twoja aplikacja komunikuje się z DAX zamiast bezpośrednio z DynamoDB. DAX cachuje wyniki odczytów i zwraca je z opóźnieniem mierzonym w mikrosekundach.

Kluczowe cechy DAX:

  • Kompatybilny z API DynamoDB (minimalne zmiany w kodzie)
  • Latencja: z milisekund (DynamoDB) do mikrosekund (DAX)
  • Idealny dla read-heavy workloads z powtarzalnymi zapytaniami
  • Nie pomaga przy write-heavy workloads (cache dotyczy odczytów)
🏢 Scenariusz: ElastiCache vs DAX

Kiedy ElastiCache? Twoja aplikacja używa RDS (MySQL, PostgreSQL) i chcesz zcachować wyniki zapytań SQL. ElastiCache (Redis) jest uniwersalny i działa z każdą bazą danych.

Kiedy DAX? Twoja aplikacja używa DynamoDB i potrzebujesz ultra-niskiej latencji odczytów. DAX jest dedykowany wyłącznie dla DynamoDB i wymaga minimalnych zmian w kodzie.

Prosta reguła: DynamoDB + cache = DAX. Cokolwiek innego + cache = ElastiCache.

API Gateway Caching

Amazon API Gateway ma wbudowany cache. Możesz cachować odpowiedzi API, żeby nie odpytywać backendu (Lambda, EC2) przy każdym requescie. Konfigurowalny TTL od 0 do 3600 sekund.

Przykład: Twoje API zwraca listę produktów. Ta lista zmienia się raz na godzinę. Zamiast wywoływać Lambda 10 000 razy na minutę, API Gateway cachuje odpowiedź i serwuje z cache. Lambda wywoływana jest raz na godzinę.

Efekt: niższe koszty Lambda, niższa latencja, mniejsze obciążenie backendu.

Database Read Replicas

Read replicas to nie caching w tradycyjnym sensie, ale technika optymalizacji odczytów z bazy danych. Tworzysz kopie bazy danych (repliki), które obsługują tylko odczyty. Główna baza (primary/master) obsługuje zapisy i replikuje dane do replik.

Korzyści:

  • Rozdzielasz ruch odczytowy na wiele replik (odciążasz primary)
  • Możesz tworzyć repliki w różnych regionach (cross-region read replicas) dla niższej latencji globalnej
  • RDS wspiera do 5 read replik (Aurora do 15)
💡 Read Replica vs Multi-AZ
Nie mylij tych dwóch koncepcji! Multi-AZ = wysoka dostępność (standby replica, automatyczny failover, nie obsługuje ruchu). Read Replica = wydajność (obsługuje ruch odczytowy, nie ma automatycznego failover). Możesz mieć oba jednocześnie: primary + standby (Multi-AZ) + read replicas.

S3 Transfer Acceleration

S3 Transfer Acceleration przyspiesza upload plików do S3, wykorzystując sieć edge locations CloudFront. Zamiast wysyłać plik bezpośrednio do bucketu w us-east-1, wysyłasz go do najbliższej edge location, a AWS przesyła go do bucketu przez swoją szybką sieć wewnętrzną.

Szczególnie użyteczne przy dużych plikach uploadowanych z różnych części świata. Może przyspieszyć transfer nawet o 50-500% w porównaniu z bezpośrednim uploadem.

W dobrze zaprojektowanej architekturze masz wiele warstw cachingu:

  1. Browser cache: przeglądarka cachuje statyczne zasoby (kontrolowane przez HTTP headers: Cache-Control, ETag)
  2. CDN cache (CloudFront): edge locations cachują content blisko użytkowników
  3. API Gateway cache: cachuje odpowiedzi API
  4. Application cache (ElastiCache/DAX): cachuje wyniki zapytań do bazy danych
  5. Database cache: wbudowane mechanizmy cachowania bazy danych (InnoDB buffer pool, itp.)

Im bliżej użytkownika cache, tym niższa latencja i tym mniej obciążona infrastruktura backendowa. Idealnie, większość requestów powinna być obsłużona z cache bez dotykania bazy danych.

✅ Kiedy użyć jakiego cachingu
Statyczny content globalnie: CloudFront (CDN)
Wyniki zapytań SQL/redukcja obciążenia RDS: ElastiCache (Redis)
Sesje użytkowników (stateless apps): ElastiCache (Redis)
Ultra-szybkie odczyty z DynamoDB: DAX
Odpowiedzi API: API Gateway caching
Odciążenie primary DB z read traffic: Read Replicas
Szybszy upload do S3: S3 Transfer Acceleration
🧠 Podsumowanie
  • CloudFront to CDN cachujący content w edge locations na całym świecie. Redukuje latencję i odciąża origin
  • ElastiCache (Redis/Memcached) to in-memory cache. Redis jest bogatszy (persistence, replikacja, pub/sub). Memcached prostszy
  • DAX to in-memory cache dedykowany dla DynamoDB (mikrosek. latencja). DynamoDB + cache = DAX
  • API Gateway ma wbudowany cache odpowiedzi (TTL 0-3600s), redukuje wywołania backendu
  • Read Replicas odciążają primary DB z ruchu odczytowego. Multi-AZ to HA, Read Replica to wydajność
  • S3 Transfer Acceleration przyspiesza uploady przez edge locations
🧪 Sprawdź się

Aplikacja używa DynamoDB i potrzebuje ultra-niskiej latencji odczytów (mikrosek.). Która usługa AWS jest najlepsza?

A ElastiCache (Redis)
B DynamoDB Accelerator (DAX)
C CloudFront
DAX (DynamoDB Accelerator) to in-memory cache dedykowany dla DynamoDB. Redukuje latencję odczytów z milisekund do mikrosekund. ElastiCache jest bardziej uniwersalny, ale DAX wymaga minimalnych zmian w kodzie dla DynamoDB. CloudFront to CDN, nie database cache.

Firma chce przyspieszyć dostarczanie statycznych zasobów (obrazy, CSS, JS) do użytkowników na całym świecie. Która usługa AWS jest najlepsza?

A ElastiCache
B S3 Transfer Acceleration
C Amazon CloudFront
CloudFront to CDN, który cachuje statyczne zasoby w edge locations blisko użytkowników na całym świecie. ElastiCache to in-memory cache dla danych aplikacyjnych. S3 Transfer Acceleration przyspiesza uploady do S3, nie dostarczanie do użytkowników.

Czym różni się RDS Read Replica od RDS Multi-AZ?

A Read Replica obsługuje ruch odczytowy, Multi-AZ to standby dla failover
B Multi-AZ obsługuje ruch odczytowy, Read Replica to standby dla failover
C Oba obsługują ruch odczytowy, ale Multi-AZ jest w innej AZ
Read Replica obsługuje ruch odczytowy (skalujesz odczyty na wiele replik). Multi-AZ standby NIE obsługuje ruchu. Czeka w gotowości na failover. Gdy primary padnie, standby przejmuje rolę primary. Możesz mieć oba jednocześnie.