Page cache on yksi tehokkaimmista tavoista nopeuttaa WordPress-sivustoa. Oikein toteutettuna se voi vähentää PHP:n ja tietokannan kuormaa yli 90 prosenttia. Välimuistiin liittyy kuitenkin yksi vakava ongelma, joka näkyy erityisesti korkean liikenteen sivustoilla: cache stampede.
Cache stampede syntyy, kun suuri määrä käyttäjiä yrittää samanaikaisesti rakentaa uudelleen vanhentunutta välimuistia. Sen seurauksena palvelin voi kuormittua hetkessä moninkertaisesti enemmän kuin ilman välimuistia.
Monissa tapauksissa juuri cache stampede aiheuttaa suorituskykyongelmia, vaikka välimuisti olisi muuten oikein konfiguroitu.
Mikä on cache stampede?
Tilanne alkaa yleensä näin:
Cached Page
↓
TTL expires
↓
Cache deletedSeuraava käyttäjä joutuu rakentamaan sivun uudelleen.
Ongelma syntyy, kun samaan aikaan saapuu paljon käyttäjiä.
100 visitors
↓
Cache expired
↓
100 cache rebuildsSen sijaan että yksi käyttäjä rakentaisi välimuistin, kaikki tekevät saman työn yhtä aikaa.
Miksi ilmiö on vaarallinen?
Yksi raskas sivu voi sisältää:
- kymmeniä tietokantakyselyitä
- ulkoisia API-kutsuja
- WooCommerce-laskentaa
- dynaamista sisältöä
Normaalisti:
1 render
↓
cache
↓
100 visitorsStampedessa:
100 visitors
↓
100 rendersKuorma kasvaa eksponentiaalisesti.
Tyypillinen WordPress-esimerkki
Etusivu:
TTL = 1 hourKun tunti täyttyy:
Cache purge
↓
Traffic spike
↓
CPU 100%Sivusto voi hidastua merkittävästi tai jopa kaatua.
Page cache ei ole ainoa ongelma
Stampede voi tapahtua myös:
- transienteissa
- Redis-välimuistissa
- REST API -vastauksissa
- query-cacheissa
- object cache -kerroksissa
Kyseessä on yleinen välimuistiarkkitehtuurin ongelma.
Locking on tärkein ratkaisu
Yleisin tapa estää stampede on lukitus.
Prosessi:
Cache Miss
↓
Acquire Lock
↓
Generate Cache
↓
Release LockMuut käyttäjät odottavat valmiin välimuistin syntymistä.
Redis Locking
Redis soveltuu tähän hyvin.
Esimerkki:
$lock = wp_cache_add(
'homepage_lock',
true,
'locks',
30
);Vain yksi prosessi saa lukon.
Muut odottavat.
Transient Lock
Yksinkertainen vaihtoehto:
if (!get_transient('cache_lock')) {
set_transient(
'cache_lock',
true,
30
);
}Ei yhtä luotettava kuin Redis, mutta toimii pienissä ympäristöissä.
Stale Cache
Moderni ratkaisu on tarjota vanhentunut cache käyttäjälle.
Malli:
Cache expired
↓
Serve stale content
↓
Refresh in backgroundKäyttäjä saa nopean vastauksen.
Palvelin rakentaa uuden välimuistin taustalla.
Stale-While-Revalidate
Tätä mallia käyttävät esimerkiksi:
- Cloudflare
- Fastly
- Varnish
Prosessi:
User Request
↓
Expired Cache
↓
Serve Stale Version
↓
Background RegenerationKäyttäjä ei huomaa mitään.
Soft TTL ja Hard TTL
Yksi tehokas tekniikka.
Esimerkki:
Soft TTL = 1h
Hard TTL = 2hSoft TTL:n jälkeen:
- cache voidaan päivittää
Hard TTL:n jälkeen:
- cache poistetaan pakolla
Näin vältetään yhtäkkiset rebuild-piikit.
Cache Warming
Toinen tehokas ratkaisu.
Sen sijaan että käyttäjä rakentaa välimuistin:
Content Update
↓
Cache Purge
↓
Warmup Job
↓
Cache ReadyKäyttäjät saavat aina lämpimän välimuistin.
Queue-pohjainen regenerointi
Suurissa ympäristöissä:
Cache Miss
↓
Queue Job
↓
Worker
↓
Cache RebuildTämä estää useita samanaikaisia rakennuksia.
WooCommerce ja stampede
WooCommerce on erityisen altis ongelmalle.
Esimerkiksi:
- kategoriat
- tuotesivut
- kampanjasivut
voivat saada suuren liikennepiikin heti cache purge -tapahtuman jälkeen.
Edge Cache vähentää riskiä
Arkkitehtuuri:
Visitor
↓
CDN Edge Cache
↓
OriginUseimmat käyttäjät eivät koskaan osu origin-palvelimeen.
Cache Invalidation
Liian aggressiivinen invalidointi aiheuttaa ongelmia.
Huono:
Save Post
↓
Purge Entire SiteParempi:
Save Post
↓
Purge Related PagesTällöin vain pieni osa välimuistista rakennetaan uudelleen.
Monitorointi
Seuraa:
- cache hit ratio
- regeneration time
- Redis hits
- CPU usage
- TTFB
Erityisesti:
Cache Miss Ratepaljastaa stampede-ongelmat nopeasti.
Cloudflare ja stampede
Cloudflare tarjoaa:
- Cache Reserve
- Tiered Cache
- Cache Locking
- Stale While Revalidate
Nämä vähentävät origin-kuormaa merkittävästi.
Yleisimmät virheet
- ei lockingia
- koko sivuston purge jokaisessa päivityksessä
- ei cache warmingia
- liian lyhyt TTL
- ei stale-cache-strategiaa
- WooCommerce-sivujen väärä cache-konfiguraatio
Paras käytännön arkkitehtuuri
CDN
↓
Edge Cache
↓
Redis Locking
↓
WordPress
↓
DatabaseLisäksi:
Stale While Revalidate
+
Cache Warming
+
Selective PurgeYhteenveto
Cache stampede on tilanne, jossa suuri määrä käyttäjiä yrittää samanaikaisesti rakentaa vanhentunutta välimuistia. Se voi aiheuttaa massiivisen kuormituspiikin juuri silloin, kun välimuistin pitäisi parantaa suorituskykyä.
Paras suoja muodostuu yhdistämällä locking, stale-while-revalidate, cache warming ja tarkasti kohdistettu cache invalidointi. Näin WordPress pystyy käsittelemään suuria liikennemääriä ilman että välimuistin vanheneminen aiheuttaa suorituskykyongelmia.