GH GambleHub

Ö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.
Tipik seviyeler:

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.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Telegram
@Gamble_GC
Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.