Önbelleğe alma stratejileri
1) Neden önbellek ve nerede yapılacağı
Önbellek, gecikmeyi azaltan ve pahalı kaynaklara (CPU/DB/harici API) yüklenen hızlı bir bellek katmanıdır. Önemli hedefler:- Hız (p95/p99 daha düşük), maliyet (daha az çıkış/CPU), kararlılık (zirvenin altında daha az bağımlılık).
- Zirve yumuşatma ve "gürültülü komşulardan" izolasyon.
1. İstemci (tarayıcı/mobil) - HTTP önbelleği, IndexedDB, yerel depolama.
2. Edge/CDN - POP düğümleri kullanıcıya daha yakındır, önbellek statiktir ve API'nin bir parçasıdır.
3. L7-gateway/Reverse-proxy - Nginx/Elçi/Vernik (microcash, SWR).
4. Servis önbelleği - Küme içinde Redis/Memcached.
5. İşlem sırasında - bellek içinde (Caffeine/Guava/LRU-map).
6. Veritabanında önbellek - malzeme temsilleri, ikincil indeksler.
Kural: Tüketiciye mümkün olduğunca yakın önbelleğe alın, ancak gerçeği bir kez saklayın.
2) Önbellek desenleri
2. 1 Önbellek kenara ("tembel yükleme")
Uygulama önce önbellekten okur; Bir ıskalama durumunda - kaynaktan, sonra önbelleğe yazar.
Artılar: basitlik, kontrol. Eksileri: soğuk başlangıçlar, uyumsuz pencereler.
2. 2 Okuma
Okuma her zaman önbellekten geçer, bu da özlendiğinde kaynağa gider (kütüphane/proxy katmanı).
TTL/serileştirme politikalarının merkezileştirilmesi uygundur.
2. 3 Yazma/Geri yazma (write-behind)
Yazma: eşzamanlı olarak önbelleğe ve kaynağa yazma - tutarlılık daha yüksek, gecikme daha yüksek.
Geri yazma: önbelleğe yazma, asenkron flaş kaynağa yazma - hızlı, ancak kayıp ve çakışma riski.
2. 4 Refresh-ahead (proaktif)
"TTL yakında sona erecek" tahmininde bulunur ve arka planda anahtarı güncelleyerek izdihamı önler.
2. 5 Negatif önbelleğe alma
Kısa bir TTL'ye "veri yok/404/boş" önbelleği, kaynak üzerindeki yükü azaltır.
2. 6 Mikro önbellekleme
Çok kısa TTL'ler (0. 5-5 s) L7'de "neredeyse dinamikler" için (listeler, ana) - kuyrukları keskin bir şekilde azaltır.
3) HTTP önbelleği: başlıklar ve kontrol
3. 1 Temel başlıklar
'Cache-Control': 'max-age', 's-maxage' (для paylaşılan кэшей), 'public/private', 'no-store', 'stale-while-revalidate', 'stale-if-error'.
Doğrulayıcılar: 'ETag' (content hash), 'Last-Modified'.
Koşullu sorgular: 'If-None-Match', 'If-Modified-Since' - 304 Değiştirilmedi.
3. 2 Çeşitlilik ve anahtarlar
'Vary: Accept-Encoding, Authorization, Cookie, Accept-Language' - farklı önbellek seçenekleri üretir. Kardinaliteyi "havaya uçurmamak" için 'Vary'yi en aza indirin.
3. 3 HTTP Yanıt Örneği
Cache-Control: public, max-age=60, s-maxage=300, stale-while-revalidate=60
ETag: "a1b2c3"
Vary: Accept-Encoding
4) Anahtar tasarımı ve TTL
4. 1 Anahtar
Yapı: 'kiracı: kullanıcı: {id}: profil: v3' (şema sürümünü içerir).
Anahtarda PII'den kaçının.
Koleksiyonlar için - anahtar + sorgu parametreleri (normalleştirilmiş ve sıralanmış).
4. 2 TTL ve tutarlılık
Kısa bir TTL uyumsuzluğu azaltır ancak kaçırmayı artırır.
Kritik veriler için - doğrulayıcılar ('ETag') ve SWR (bayat while-revalidate).
Nadiren değiştirmek için - uzun TTL + engelli "bomba".
4. 3 Sürüm oluşturma/basma
Uyumsuz değişiklikler için, önek/anahtar sürümünü ('v2> v3') değiştirin.
Statik kaynaklar için - dosya adında içerik karması.
5) Engellilik: stratejiler ve uygulamalar
5. 1 Doğrudan silme
'DEL key'/' PURGE' proxy üzerinde. Tehlike: Kaldırma ve çoklu okuyucular arasındaki yarışlar.
5. 2 Vekil anahtarlar
Belgeyi bir etiket kümesiyle ilişkilendirin (kategori/yazar). Engellilik - etiketle.
В Vernik/Kenar - 'Vekil-Anahtar: makale: 42 etiket: yazar: 7' + 'BAN etiket: yazar: 7'.
5. 3 Olay odaklı sakatlık
Pub/Sub (Kafka/NATS): Kaynak değiştiğinde "invalidate" olayını yayınlıyoruz.
Önbellek tüketicileri, anahtarları dinler ve siler/günceller.
5. 4 İki fazlı
İlk olarak, anahtar eskimiş (yumuşak TTL) işaretlenir, bayat servis yapılır, arka planda güncellenir ve atomik olarak değiştirilir.
6) İzdiham/dogpile ve sıcak tuşlarla uğraşmak
6. 1 İstek birleştirme (singleflight)
Bir üretici anahtarı günceller, gerisi sonucu bekler (mutex/etiket "güncellemeler").
6. 2 Jitter к TTL
Eşzamanlı şişmeyi önlemek için TTL'ye rastgelelik (± %10-20) ekleyin.
6. 3 Yumuşak-TTL + sert-TTL
Soft-TTL'den önce, yenileme tetikleyicisine paralel olarak önbellekten hizmet veriyoruz; Hard-TTL ile - biz bir özledim düşünün.
6. 4 sıcak tuşları
Paylaşılan (iki katmanlı) üzerinde yerel önbellekler.
Birden çok parçaya ve rastgele seçime (salt okunur) hot-key çoğaltma.
Belirli bir anahtarı güncellemek için hız sınırı.
6. 5 Redis + Lua örneği (singleflight-sketch)
lua
-- SETNX lock with TTL to avoid deadlocks local ok = redis. call("SET", KEYS[1], "1", "NX", "EX", ARGV[1])
if ok then return "LOCKED"
else return "WAIT"
end
7) Ön alım politikaları ve önbellek alımı
7. 1 Tahliye
LRU: yerellik için basit ve iyi.
LFU: "Uzun ömürlü" kısayol tuşları için daha iyi.
ARC/TinyLFU: sonluk/frekans dengesi.
7. 2 Kabul
Dev nadir nesneleri içeri almayın (TinyLFU/Bloom filtreleri).
Boyut/gecikme sınırında büyük değerlerin (LZ4/Zstd) sıkıştırılması.
8) Charding ve topolojiler
8. 1 Tutarlı karma
Anahtarları düğümlere kararlı bir şekilde dağıtır, küme büyümesi/sıkıştırması sırasında hareketi azaltır.
8. 2 Redis/Memcached topolojileri
Redis Cluster (yuvalar/parçalar), Sentinel (feilover), salt okunur çoğaltma.
Memcached, sunucu düzeyinde çoğaltma olmadan istemci tarafında bir sharding (ketama hashing) işlemidir.
8. 3 Yerel + Dağıtılmış
Cascade: In-proc (micro-TTL/LRU) - Redis (TTL daha uzun) - kaynak.
TTL kolonlarına ve önbellek doğrulayıcılarına dikkat edin.
9) Kenar, CDN ve L7 önbellek
9. 1 Mikro önbellek на Nginx
nginx proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api:100m inactive=10m;
map $request_method $skip_cache { default 0; POST 1; PUT 1; DELETE 1; }
server {
location /api/list {
if ($skip_cache) { add_header Cache-Control "no-store"; }
proxy_cache api;
proxy_cache_valid 200 2s; # micro-cache proxy_cache_use_stale error timeout updating;
proxy_cache_background_update on; # SWR add_header X-Cache $upstream_cache_status;
proxy_pass http://upstream;
}
}
9. 2 Elçi (SWR ve koşullar)
yaml http_filters:
- name: envoy. filters. http. cache typed_config:
"@type": type. googleapis. com/envoy. extensions. filters. http. cache. v3. CacheConfig typed_config:
"@type": type. googleapis. com/envoy. extensions. http. cache. file_system_http_cache. v3. FileSystemHttpCacheConfig cache_path: "/var/cache/envoy"
9. 3 Vernik (Vekil anahtarlar)
Toplu sakatlık için etiketlerde 'Surrogate-Key've' ban 'kullanın.
10) Önbellek ve veri tutarlılığı
10. 1 Yazılarınızı okuyun
Kullanıcı profilleri/geri dönüşüm kutusu için, kısa TTL'ler, yazma veya istemci işaretlemesi sağlayın (yazdıktan sonra N saniye boyunca atlayın).
10. 2 Nihai vs Güçlü
Tavsiye/analitik için - nihai + uzun TTL.
Para/sipariş durumları için - kısa TTL, doğrulama, bazen kritik yollarda önbellek olmadan.
10. 3 Değişmezler
Sıkı TTL'ler ve yeniden doğrulama olmadan güvenlik/ACL'leri etkileyen alanları önbelleğe almayın.
11) Gözlemlenebilirlik, SLO ve yönetim
11. 1 Metrikler
hit_ratio (rota başına общий и), byte_hit_ratio, miss_rate.
stampede_prevented_total, refresh_ahead_total, ban/purge_total.
Gecikme: Önbellekten p50/p95/p99 vs kaynaktan.
hot_keys_topN ve QPS/baytları.
11. 2 Günlükler ve izler
Log 'X-Cache: HIT/MISS/STALE/UPDATING'.
İzlerde, yanıtın kaynağını işaretleyin ('cache = true', 'tier = edge' service 'local').
11. 3 SLO yaklaşımı
Örnek: "API/katalog p99 ≤ 250 ms için önbellek isabeti ≥ %85, izdiham ≤ 0. Taleplerin %1'i"
11. 4 Runbooks
"Miss grow" - TTL, ısınma/sakatlık, kısayol tuşları, önbellek boyutu ve kabul politikasını kontrol edin.
12) Güvenlik ve çoklu kiracılık
Kiracı kimliğini anahtarlara (ve HTTP için 'Vary'ye) gömün.
Özel yanıtları 'public'olarak önbelleğe almayın.
Önbelleği hassas verilerle şifreleyin veya yalnızca PII olmayan/ID depolayın.
13) Tipik tarifler
13. 1 Katalog/Bant (neredeyse dinamik)
Edge-microcash 1-3 s + SWR, içeride - 15-60 s için Redis, güncelleme olaylarıyla engellilik.
13. 2 Kullanıcı profili
TTL 30-120 s ile önbellek kenara, profil güncellemesinden sonra 5-10 s atlayın (çerez/başlık) veya yazma.
13. 3 Döviz kursları/referans kitapları
Yeni veriler yayınlandığında uzun TTL (dakika-saat) + hedef engellilik; Koşullu GET'ler için 'ETag'.
13. 4 Arama sonuçları
Edge-microcash 1-2 s, içeride - yenileme ve birleştirme, anahtardaki sorgu parametrelerinin normalleştirilmesi.
14) Anti-desenler
Engelsiz nakit: sadece TTL için umut - uzun ilgisizlik pencereleri.
Giant 'Vary': Seçeneklerin "patlaması" - düşük isabet oranı.
Prod/deneyler için tek önbellek - kirlenme.
İzdihama karşı koruma yok - TTL süresi dolduğunda kaynak sivri uçları.
Kesin garantiler olmadan nakit/haklar/ACL önbelleği.
"Üst üste her şeyin" sıkıştırılması - ekstra CPU'lar, küçük nesnelerde p99'un bozulması.
15) Uygulama kontrol listesi
- Önbellek seviyelerini ve hedeflerini tanımlayın (edge/service/local).
- Tasarım anahtarları (sürüm oluşturma, kiracı, parametre normalleştirme).
- Deseni seçin (önbellek-kenara/okuma/yenileme-ileri).
- TTL/soft-TTL/jitter yapılandırın, SWR'yi etkinleştirin.
- Birleştirme/singleflight, izdiham koruması uygulayın.
- Engelliliği düzenleyin (etkinlikler, etiketler, temizleme/yasaklama).
- Hit-ratio/latency metrics ve 'X-Cache' panolarını girin.
- Sıcak anahtar yük testleri gerçekleştirin.
- SLO ve runbooks yazın.
- Güvenlik/kiracı izolasyonunu ve 'Vary'i kontrol edin.
16) SSS
S: Ne seçmeli - önbellek veya okuma?
C: Basit hizmetler için - önbellek kenara. Merkezileşmeye ve tek bir politikaya - okumaya - ihtiyacımız var.
S: Optimal TTL nasıl anlaşılır?
C: İzin verilen eskime, güncelleme sıklığı ve hedef isabet oranından başlayın; jitter ekleyin ve p95/p99/maliyeti gözlemleyin.
S: Geri yazma ne zaman uygundur?
C: Nihai tutarlılığın kabul edilebilir olduğu ve "ekleme" için güvenilir bir kuyruk/günlük bulunan yüksek yüklü akışlar için.
S: Yetkili yanıtlar önbelleğe alınabilir mi?
C: Evet, ancak 'özel'olarak işaretleyin ve/veya/' Farklılık' anahtarına kiracı/kullanıcı ekleyin. Gerçekten özel - istemci önbelleği için.
S: Önbellek nasıl ısıtılır?
C: Popüler anahtarların listeleri, arka plan solucanı, günlüklerden tekrar oynatma, serbest bırakılmadan/zirveden önce ısınma (kara Cuma, vb.).
17) Toplam
Etkili önbellekleme anahtar tasarım + makul TTL + iyi seçilmiş bir desen, olay sakatlık, SWR/refresh-ahead ve izdiham koruması ile geliştirilmiş. Önbelleği katın (istemci/kenar/hizmet), gözlemlenebilirlik ve SLO ekleyin - ve istikrarlı gecikme kuyrukları, öngörülebilir maliyet ve en yüksek esneklik elde edin.