Düşük gecikme süreli mimari
Neden Düşük Gecikme Süreli Mimari
Düşük gecikme sadece "hızlı bir ortalama'değil, gerçek yük altında stabil kuyruklardır (p95/p99). Bunun yolu gecikme bütçesi, kuyruk/yeniden ödeme disiplini, veri ve önbellek yakınlığı, doğru protokoller/bağlantılar ve katı kullanımdır (sınırlar, gözlemlenebilirlik, bozulma).
Gecikme hedefleri ve bütçesi
1. SLO'yu tanımlayın: "P95 ≤ 120ms, p99 ≤ 250ms, hata ≤ 0. 3%».
2. Bütçeyi topla: client ^ edge ^ region ^ services ^ stor ^ answer.
- İstemci kenarı: 15 ms
- Kenar bölgesi: 15ms
- Gateway/L7: 10 ms
- İş servisi: 40 ms
- Depolama/Önbellek: 25ms
- Stok/Jitter: 15ms
Metrikler ve kuyruklar
Her atlama boyunca ve üzerinde p50/p90/p95/p99 ölçün.
Etiketlere göre parçala: bölge, yöntem, istemci sürümü, ağ türü (mobil/geniş bant), yük boyutu.
Kuyruk süresi ile yürütme süresi arasında ayrım yapın (bkz. Little's Law: L = λ· W).
Kuyruğa duyarlı teknikler: hedged istekler (nadiren ve koruma ile), basamaklı retrays yasağı.
Ağ ve Protokoller
QUIC/HTTP/3: mobil/dolaşımda daha az kayıp, satır başı olmadan çoğullama.
TLS 1. 3 ve 0-RTT (yalnızca güvenli idempotent sorgular için).
DNS: Dinamik rotalar için kısa TTL, POP için Anycast.
TCP: 'TCP _ NODELAY' (ihtiyatlı), haklı olduğu durumlarda ekstra 'Nagle'/' Gecikmeli ACK'yi devre dışı bırakır; Bağlantıların canlı ve hızlı bir şekilde kurtarılmasını sağlayın.
gRPC/HTTP/2: multiplex, akış kontrolü ve pencere ayarları; Küçük yüklerde aşırı sıkıştırmadan kaçının.
Bağlantılar ve Havuzlar
Etki alanına/hedefe göre ayrı havuzlar (böylece "yavaş komşular" yuvaları götürmez).
Isınma/Canlı tutma: Sabit sayıda sıcak bağlantı sağlayın.
Yeniden kullanım HTTP/2/3 bağlantı birleştirme (и).
Zaman aşımları: 'connect', 'TLS handshake', 'request', 'idle'. Farklı şerbetçiotunda farklı değerler.
Veri ve hesaplama lokalitesi
Kenar/bölge: Okumaları ve kolay hesaplamaları kullanıcıya yaklaştırın (bkz. Kenar düğümleri ve bölgesel mantık).
Read-local/Write-global: okumak için replica, yazmak için global true.
Önbellek hiyerarşisi: CDN/edge önbellek ^ bölgesel KV/Redis ^ servis önbelleği ^ yerel in-proc.
Isınma: serbest bırakma/ölçekleme sırasında sıcak tuşları yükleme.
Düşük riskli veriler için bayat iken yeniden değerleme.
Depolar ve Dizinler
Erişim şemalarını seçin O (1 )/O (logN); Sık sorgular altında dar indeksler tutun.
Kısayol tuşları: 'Hash (id)'ile parçalayın veya düzgünlük için' tuz 'ekleyin.
Düzinelerce tek çağrı yerine veritabanına/önbelleğe (makul bir boyuta) çıkışta toplu olarak.
OLTP için, mümkün olan en kısa işlemler; Seri kilitler yerine okuma-taahhüt/anlık görüntü.
Rekabetçi ve engellemesiz
İlk olarak, kuyruklarda beklemeyi ortadan kaldırın, ardından CPU'yu optimize edin.
Async I/O ve engellemeyen sürücüler; Uygun olan yerlerde kilitsiz yapılar.
Küresel mutekslerden kaçının; Granüler kilitler, CAS/sürüm oluşturma.
İplik havuzları: Boyutları sabitleyin, böylece bağlam anahtarlarına girmezsiniz.
NUMA farkındalığı: soketlere bağlanan iplikler, yerel ayırıcılar.
JVM/GC ve çalışma zamanı ayarı (varsa)
Kod oluşturma ve ayırma: daha az yan etki - daha az GC duraklaması.
Hedef duraklamaları ile modern rezervuarlar (G1/ZGC/Shenandoah); Kaçışlar ve tampon kiralama.
Sınıf/Veri paylaşımı, JIT ısınma, başlangıç bağımlı fonksiyonlar için AOT/yerel görüntü.
Toplam gecikme bütçesine GC duraklatma histogramlarını ekleyin.
Kuyruklar, geri basınç, aşırı yük koruması
Kuyruk boyutu = küçük: uzun kuyruklar "güzel p50" verir ve p99'u öldürür.
Açık geri basınç: kaydetmekten'daha yavaş "cevabını verin.
Uyarlanabilir eşzamanlılık: Artan hata/gecikme ile paralelliği azaltın (VEGAS/gradyan algoritmaları, AIMD).
Devre kesici: yukarı akış bozulması sırasında hızlı arızalar, havuzlar ve kaynaklar için bölme (kabin şirketleri).
Hız sınırı: kayan pencere/belirteçler, önceliklendirme (kullanıcı katmanı/kritik yol).
Retrai, hedging ve idempotency
Sadece geçici hatalar için, jitter ve maksimum denemelerle Retrai.
Tekrarlamalar için idempotent işlemler ve 'Idempotency-Key' gereklidir.
Hedged istekler: eşikten sonra iki katına çıkar (örneğin, p95 + 10 ms) ve her zaman fazlalığı iptal edin.
Koordinasyon olmadan her katmanın içinde asla geri çekilmeyin - bir fırtına olsun.
Önbelleğe alma ve ısınma
Sıcak yol tipik yükte ağ olmadan olacaktır (in-proc/LRU).
Eksik anahtarları çekiçlememek için 10-60 sn negatif önbellek.
Sürüm/ölçekleme sırasında kitlesel ısınma: sıcak tuş listeleri, ileride okuma, arka plan yenileme.
Bozulma ve follbecks
Zarif Bozulma: Gecikme yükseldiğinde küçük özellikleri azaltın (daha az ayrıntılı yanıt, zenginleştirme yok).
Yumuşak zaman aşımları: 5xx yerine temel yanıtı/önbelleği döndürür.
Fail-open/Fail-closed - her çağrı için açıkça belge.
Gözlemlenebilirlik ve profilleme
Dağıtımsal izleme: her atlama, kuyruk tabanlı örnekleme üzerine yayılır.
KIRMIZI/KULLANIM метрики: Oran, Hatalar, Süre/Kullanım, Doygunluk, Hatalar.
Top-N "yavaş" günlük rotalar.
Düşük havai bir üründe profiler (alloc/cpu/lock) (eBPF/async-profiler/Flight Recorder).
Farklı ASN/ağlardan ve mobil kanallardan sentetikler.
Performans Testi
Gerçek yük ve değişkenlik ile gecikme-SLO testleri (p95/p99).
Kaos senaryoları: DNS bozulması, artan paket kaybı, TLS gecikmeleri, yavaş depolama.
Soğuk başlatma/ölçekleme: Önbellekler boş olduğunda serbest bırakıldıktan sonraki ilk dakikaları ölçün.
Komut dosyalarına göre ayrı yükleme havuzları (okuma/yazma testlerine müdahale etmeyin).
Mini Şablonlar
Zaman aşımı/Geri Çekme Politikası (Sözde)
yaml timeouts:
connect: 100ms tls_handshake: 150ms request_p95_budget: 80ms retries:
max_attempts: 2 backoff: exp_jitter(10ms..60ms)
retry_on: [CONNECT_ERROR, TIMEOUT, 502, 503, 504]
hedging:
enabled: true threshold: p95 + 10ms cancel_extra_on_first_success: true circuit_breaker:
error_rate_threshold: 5%
p95_threshold_increase: 30%
half_open_after: 10s
Havuzlar ve bölmeler
yaml pools:
checkout:
max_conns: 256 per_host: 64 queue: 8 # small analytics queue:
max_conns: 64 queue: 4
Bozulma ile yanıt
json
{
"status": "ok",
"profile": { "id": "u123", "name": "…"},
"recommendations": "degraded, "//disabled the heavy part
"served_from": "edge-cache",
"trace_id": "…"
}
Uygulama durumları
IGaming/finans: ödeme yetkisi <200 ms p95, limitler/bakiye - bölgesel projeksiyonlardan okuma, kayıtlar - sürüm ile idempotent.
Pazarlama/öneriler: cevaplar <100 ms p95, kenardaki özellik bayraklarının önbelleği, modeller - ön puanlama + sıcak yolda hızlı kurallar.
Mobil istemciler: HTTP/3, agresif yeniden kullanım bağlantıları, azaltılmış yük (Protobuf), güvenlik zaman aşımları ve çevrimdışı önbellek.
Anti-desenler
İşçilerin önünde uzun çizgiler: "güzel ortalama've öldürülen p99.
Cascade her katmanda koordinasyon olmadan yeniden çalışır.
Engelsiz ve ısınmadan küresel "mega önbellek".
Bulanık zaman aşımları (her yerde "varsayılan olarak") - kontrolsüz kuyruklar.
Tüm trafik için ortak bir bağlantı havuzu, hat başı engellemedir.
Durumsal efektlerle kenarda ağır mantık.
Devre dışı kuyruk telemetri - sen "göremiyorum" p99.
Üretim kontrol listesi
- Bunun için bir hop gecikme bütçesi ve zaman aşımları var.
- Etkin HTTP/2/3, TLS 1. 3, bağlantı havuzları ve ısınma.
- Önbellek hiyerarşisi, sıcak anahtar listesi ve ısınma stratejileri.
- Read-local/Write-global ve hot key sharding.
- Açık geri basınç, küçük kuyruklar, devre kesiciler ve bölmeler.
- jitter, idempotency, sınırlı hedging ile Retrai.
- Bölge/sürüm/istemci etiketleriyle izleme; İzleme p95/p99.
- ASN/Mobil sentetik perf testleri, soğuk başlangıç ve kaos komut dosyaları.
- Bozulma prosedürleri ve follbacks belgelenmiştir.
- p95/p99 gerçek yükte SLO'lara karşılık gelir.
SSS
P99 neden ortalamadan daha önemlidir?
Çünkü kullanıcılar ortalama değil, kuyruklarla karşı karşıyadır. P99 "gerçekten ne kadar acı verdiğini" gösterir.
Hedging'i her yere dahil etmeli misiniz?
Hayır. Kritik yollarda ve sadece katı sınırlar/idempotency altında nadir kuyruklar için yararlıdır.
Soğuk bir başlangıç nasıl azaltılır?
Önbellekleri/bağlantıları ısıtın, önceden derleyin/JIT ısıtın, tembel başlatmaları en aza indirin, sıcak havuzlar.
"Ağı yenmek" mümkün mü?
Kısmen: HTTP/3, kenar-POP, Anycast, kompakt yük, bağlantı yeniden kullanımı ve makul zaman aşımları.
Toplam
Düşük gecikmeli mimari, bir düzenleme ve disiplin sistemidir: gecikme bütçesi, veri yakınlığı, küçük kuyruklar, öngörülebilir retrays, önbellek hiyerarşileri, doğru protokoller ve acımasız kuyruk gözlemlenebilirliği. Bu ilkeleri izleyerek, p95/p99'u istikrar ve cüzdandan ödün vermeden aynı hizada tutarsınız.