Önbellekleme

Statigo, optimal performans için iki katmanlı önbellekleme sistemi sunar: bellek içi önbellekleme ve disk kalıcılığı.

Mimari

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   İstek     │────▶│ Bellek Önbellek│────▶│Disk Önbellek│
└─────────────┘     └─────────────┘     └─────────────┘
                          │
                          ▼
                     ┌─────────────┐
                     │  Brotli     │
                     │ Sıkıştırılmış│
                     └─────────────┘

Önbellek Stratejileri

Her rota farklı bir önbellekleme stratejisine sahip olabilir:

StratejiAçıklamaKullanım Durumu
immutableAsla sona ermezStatik varlıklar, sürümlü dosyalar
staticUzun önbellek, eski işaretlendiğinde yeniden doğrularNadiren değişen sayfalar
incremental24 saat sonra otomatik yeniden doğrularBlog gönderileri, makaleler
dynamicHer zaman eski olduğunda yeniden doğrularKullanıcıya özgü içerik

config/routes.json içinde tanımlayın:

{
  "canonical": "/",
  "paths": {"en": "/en"},
  "strategy": "static",
  "template": "index.html",
  "handler": "index"
}

Başlatma

import "statigo/framework/cache"

cacheManager, err := cache.NewManager("data/cache", logger)
if err != nil {
    log.Fatal(err)
}

Önbellek Ara Yazılımı

r.Use(middleware.CacheMiddleware(cacheManager, logger))

Ara yazılım otomatik olarak:

  1. Mevcut yanıt için bellek önbelleğini kontrol eder
  2. Bellek isabeti yoksa disk önbelleğini kontrol eder
  3. Her ikisi de isabet yoksa işleyiciyi çalıştırır
  4. Yanıtı her iki katmana da depolar

Önceden Oluşturma

Tüm sayfaları başlangıçta oluşturun:

# Uygulamayı derle
go build -o statigo

# Tüm sayfaları önceden oluştur
./statigo prerender

Veya programatik olarak:

cacheManager.RebuildAll(r, appLogger)

Önbellek Geçersiz Kılma

Manuel Geçersiz Kılma

Bir rotayı eski olarak işaretleyin:

cacheManager.MarkStale("/en/about")

Webhook Geçersiz Kılma

Webhook uç noktasını yapılandırın:

r.Post("/cache/webhook", middleware.WebhookInvalidate(
    cacheManager,
    os.Getenv("WEBHOOK_SECRET"), // Ortam değişkeninden
    logger,
))

Webhook gönderin:

curl -X POST http://localhost:8080/cache/webhook \
  -H "X-Webhook-Secret: your-secret-key" \
  -H "Content-Type: application/json" \
  -d '{"canonical": "/about"}'

Strateji Tabanlı Geçersiz Kılma

Stratejiye göre yeniden oluşturun:

// Tüm statik sayfaları yeniden oluştur
cacheManager.RebuildByStrategy("static", r, logger)

// Belirli bir rotayı yeniden oluştur
cacheManager.RebuildByCanonical("/about", r, logger)

Önbellek Depolama

Bellek Önbelleği

  • Eşzamanlı erişim için sync.Map içinde depolanır
  • Brotli ile sıkıştırılır
  • Otomatik ETag oluşturma

Disk Önbelleği

  • data/cache/ dizininde depolanır
  • Kanonik yolun SHA256 hash'i ile adlandırılır
  • Uygulama yeniden başlatmalarından sonra hayatta kalır

ETag Desteği

Statigo önbellek girdileri için otomatik olarak ETag'ler oluşturur:

ETag: "a1b2c3d4e5f6..."

If-None-Match başlığına sahip istemciler 304 Not Modified yanıtları alır.

Yapılandırma

Ortam değişkenleri:

# Önbellek dizini
CACHE_DIR=./data/cache

# Önbellekleme devre dışı (test için)
DISABLE_CACHE=false

İzleme

Önbellek sağlığını kontrol edin:

stats := cacheManager.GetStats()
fmt.Printf("Bellek girdileri: %d\n", stats.MemoryEntries)
fmt.Printf("Disk girdileri: %d\n", stats.DiskEntries)

En İyi Uygulamalar

  1. Gerçekten statik içerik için immutable kullanın

    • Sürüm hash'li varlıklar: /style.v1.css
    • Belge sayfaları
  2. Nadiren değişen sayfalar için static kullanın

    • Ana sayfa
    • Hakkında sayfaları
    • Özellik sayfaları
  3. İçerik sayfaları için incremental kullanın

    • Blog gönderileri
    • Makaleler
    • Haber öğeleri
  4. Kişiselleştirilmiş içerik için dynamic kullanın

    • Kullanıcı panelleri
    • Admin panelleri
    • Hesap ayarları
  5. Dağıtımdan sonra önceden oluşturun

    go build -o app
    ./app prerender
    ./app serve
    
  6. Webhook geçersiz kılma ayarlayın

    • CMS entegrasyonu için
    • İçerik güncellemeleri için
    • Otomatik dağıtımlar için