Brzina je danas jedan od najvažnijih faktora kvalitete svake web aplikacije. Korisnici napuštaju stranice koje se sporo učitavaju, a pretraživači brzinu uzimaju u obzir prilikom rangiranja. Iza većine brzih sajtova stoji jedna ista tehnika koja radi tiho u pozadini: keširanje. Cache je privremena pohrana podataka na mjestu odakle ih je moguće dohvatiti znatno brže nego iz originalnog izvora. U ovom tekstu objašnjavamo kako keširanje zaista funkcioniše, koje vrste postoje i kako ih pravilno primijeniti bez uvođenja suptilnih grešaka.
Šta je cache i zašto uopšte ubrzava stvari
Svaki put kada korisnik otvori stranicu, server mora obaviti niz operacija: izvršiti kod, postaviti upite bazi podataka, sastaviti HTML i poslati ga nazad. Mnoge od tih operacija daju isti rezultat za isti zahtjev. Keširanje iskorištava upravo tu činjenicu – umjesto da se isti posao ponavlja iznova, rezultat se sačuva i ponovo iskoristi sljedeći put.
Ključni princip je hijerarhija brzine. Dohvatanje podatka iz memorije traje nanosekundama, sa lokalnog diska milisekundama, a kompleksan upit prema bazi ili poziv eksternog servisa može trajati stotine milisekundi. Cache pomjera podatke prema bržem kraju te hijerarhije. Što je podatak bliže korisniku i što je brže memorijsko mjesto na kojem se nalazi, to je odgovor brži.
Vrste keširanja na webu
Keširanje nije jedna stvar, nego skup slojeva koji djeluju zajedno. Svaki sloj rješava drugačiji problem i nalazi se na drugačijem mjestu u putu zahtjeva.
Cache u pretraživaču
Korisnikov pretraživač lokalno čuva statičke resurse: slike, CSS, JavaScript datoteke i fontove. Kada se ti fajlovi ne mijenjaju, nema potrebe da ih server šalje ponovo pri svakoj posjeti. Kontroliše se HTTP zaglavljima poput Cache-Control i ETag, koji govore pretraživaču koliko dugo smije zadržati kopiju i kako provjeriti da li je i dalje aktuelna.
CDN i edge cache
Mreža za isporuku sadržaja (CDN) drži kopije resursa na serverima raspoređenim geografski bliže korisnicima. Umjesto da svaki zahtjev putuje do originalnog servera, isporučuje ga najbliža tačka u mreži. Ovo dramatično smanjuje kašnjenje i rasterećuje glavni server.
Aplikacijski cache i cache baze podataka
Na strani servera, sistemi poput Redisa ili Memcacheda drže rezultate skupih operacija u memoriji. Tipičan primjer je rezultat složenog upita ili izračunata statistika koja se ne mijenja često. Umjesto da se taj posao ponavlja za svakog posjetioca, čita se direktno iz brze memorije.
Cache cijele stranice
Kod sadržaja koji se rijetko mijenja, moguće je keširati cjelokupan generisani HTML. Sljedeći posjetilac dobija gotovu stranicu bez ikakvog izvršavanja koda na backendu. Ovo je najmoćniji, ali i najosjetljiviji oblik keširanja jer zahtijeva pažljivo upravljanje svježinom sadržaja.
Kako odabrati pravu strategiju
Ne treba se sve keširati i ne treba se sve keširati na isti način. Odluka zavisi od toga koliko se podaci mijenjaju i koliko je važno da korisnik uvijek vidi najnoviju verziju. Sljedeća tabela daje grub orijentir.
| Tip sadržaja | Preporučeni sloj | Trajanje |
|---|---|---|
| Slike, fontovi, JS i CSS | Pretraživač i CDN | Dugo, uz verzioniranje |
| Stranice sa rijetkim izmjenama | Cache cijele stranice | Sati do dana |
| Rezultati upita baze | Redis ili Memcached | Minute do sati |
| Personalizovani sadržaj korisnika | Bez cachea ili kratko | Vrlo kratko ili nikako |
Generalno pravilo je da statički, javni i nepromjenjivi sadržaj smije imati dugo trajanje cachea, dok dinamičan i personalizovan sadržaj zahtijeva oprez. Pogrešno keširanje korisničkih podataka je ozbiljna sigurnosna i privacy greška jer može dovesti do toga da jedan korisnik vidi podatke drugog.
Invalidacija: najteži dio keširanja
Postoji poznata izreka u inženjerstvu da su dvije najteže stvari u računarstvu invalidacija cachea i imenovanje varijabli. Invalidacija znači pravovremeno uklanjanje ili osvježavanje keširanih podataka kada se original promijeni. Ako je cache predugo aktivan, korisnici vide zastarjeli sadržaj. Ako je prekratak, gubi se sva prednost brzine.
Postoji nekoliko provjerenih pristupa kojima se ovaj problem drži pod kontrolom:
- Vremensko isticanje (TTL): svakom keširanom unosu dodjeljuje se rok trajanja nakon kojeg se automatski osvježava.
- Verzioniranje datoteka: u ime statičkih fajlova dodaje se hash sadržaja, pa svaka izmjena stvara novi URL i pretraživač automatski povlači svježu verziju.
- Eksplicitno brisanje: kada se podatak promijeni u bazi, kod aktivno briše odgovarajući unos iz cachea.
- Stale-while-revalidate: korisniku se odmah servira stara verzija, a u pozadini se tiho dohvata nova za sljedeći zahtjev.
Česte greške koje viđamo u praksi
Keširanje je moćno, ali loše postavljen cache zna napraviti više štete nego koristi. Najčešći problemi na koje nailazimo prilikom pregleda postojećih aplikacija su sljedeći.
- Keširanje dinamičnih odgovora bez razlikovanja korisnika. Ako se odgovor sa imenom ulogovanog korisnika kešira globalno, drugi posjetioci dobijaju tuđe podatke.
- Nedostatak strategije invalidacije. Cache se postavi, ali nikad se ne razmišlja o tome kada i kako će se osvježiti. Rezultat je sadržaj koji danima ne odražava stvarno stanje.
- Predugo ili prekratko trajanje. Trajanje cachea bira se nasumično umjesto na osnovu stvarnog ponašanja podataka.
- Keširanje grešaka. Ako se i HTTP odgovor sa greškom kešira, privremeni problem postaje trajan dok cache ne istekne.
Dobro postavljen sistem keširanja zahtijeva mjerenje. Bez metrika o tome koliko zahtjeva pogađa cache, a koliko ide do originalnog izvora, teško je znati da li sistem uopšte donosi korist. Stopa pogodaka cachea jedna je od prvih stvari koju pratimo prilikom optimizacije performansi.
Keširanje kao dio šire arhitekture
Cache nije dodatak koji se naknadno zalijepi na gotovu aplikaciju. Najbolji rezultati dolaze kada se slojevi keširanja planiraju zajedno sa ostatkom arhitekture, od strukture baze do načina na koji se isporučuje frontend. Brz sajt je rezultat niza promišljenih odluka, a keširanje je samo jedna od njih, doduše izuzetno važna.
U NEVIS-u keširanje tretiramo kao integralni dio inženjerskog procesa prilikom izrade web stranica i kompleksnijih platformi. Ako želite da vaša aplikacija bude brza i stabilna i pod opterećenjem, pogledajte naša rješenja i usluge ili nam se javite za konkretnu procjenu vašeg projekta.
Keširanje nije magija nego primjena jednostavnog principa: ne radi isti posao dvaput. Pravilno postavljeno, ono smanjuje opterećenje servera, ubrzava učitavanje i čini cijelo korisničko iskustvo ugodnijim. Ključ je u disciplini oko invalidacije i u tome da se kešira ono što treba, onako kako treba.
