İçeriğe atla

Önbellek Mimarisi

Note

Bu sayfa, Tuist önbellek hizmeti mimarisinin teknik bir özetini sunar. Hizmetin iç işleyişini anlaması gereken kendi sunucularında barındıran kullanıcılar ve katkıda bulunanlar için tasarlanmıştır. Önbelleği yalnızca kullanmak isteyen genel kullanıcıların bunu okumasına gerek yoktur.

Tuist önbellek hizmeti, yapı yapıtları için İçerik Adreslenebilir Depolama (CAS) ve önbellek meta verileri için bir anahtar-değer deposu sağlayan bağımsız bir hizmettir.

Genel Bakış#

Hizmet, iki katmanlı bir depolama mimarisi ve yerel SQLite meta verileri kullanır:

  • Yerel disk: Düşük gecikmeli önbellek isabetleri için birincil depolama
  • S3: Yapıtları kalıcı olarak saklayan ve silindikten sonra kurtarmaya olanak tanıyan dayanıklı depolama
  • SQLite: Yapıt erişim izleme, sahipsiz dosya temizliği, arka plan işleri ve anahtar-değer önbellek verileri için yerel meta veriler
flowchart LR
    CLI[Tuist CLI] --> NGINX[Nginx]
    NGINX --> APP[Cache service]
    NGINX -->|X-Accel-Redirect| DISK[(Local Disk)]
    APP --> S3[(S3)]
    APP -->|auth| SERVER[Tuist Server]

Bileşenler#

Nginx#

Nginx giriş noktası olarak görev yapar ve X-Accel-Redirect kullanarak verimli dosya teslimatını yönetir:

  • İndirmeler: Önbellek hizmeti kimlik doğrulamayı doğrular, ardından bir X-Accel-Redirect başlığı döndürür. Nginx dosyayı doğrudan diskten veya S3 üzerinden vekil sunucu olarak sunar.
  • Yükleme: Nginx istekleri önbellek hizmetine vekil olarak iletir; hizmet veriyi diske aktarır.

İçerik Adreslenebilir Depolama#

Yapıtlar, parçalara ayrılmış bir dizin yapısında yerel diskte depolanır:

  • Yol: {account}/{project}/cas/{shard1}/{shard2}/{artifact_id}
  • Parçalama: Yapıt kimliğinin ilk dört karakteri iki düzeyli bir parça oluşturur (ör. ABCD1234 → AB/CD/ABCD1234)

SQLite Meta Verileri#

Önbellek hizmeti iki SQLite veritabanı kullanır:

  • Birincil meta veri veritabanı: cache_artifacts, sahipsiz tarama imleçlerini, Oban işlerini ve diğer hizmet meta verilerini saklar.
  • Anahtar-değer veritabanı: key_value_entries ve key_value_entry_hashes öğelerini ayrılmış bir SQLite dosyasında saklar.

Anahtar-değer deposu, yapıt meta verilerini ve sahipsiz temizleme durumunu etkilemeden SQLite artımlı otomatik vakumlama kullanabilmesi için kendi veritabanına ayrılır.

S3 Entegrasyonu#

S3 dayanıklı depolama sağlar:

  • Arka plan yüklemeleri: Diske yazıldıktan sonra yapıtlar, her dakika çalışan bir arka plan işçisi aracılığıyla S3’e yüklenmek üzere sıraya alınır
  • Talebe bağlı yükleme: Yerel bir yapıt eksik olduğunda istek, yapıt yerel diske arka planda indirilmek üzere sıraya alınırken imzalı bir S3 URL’si aracılığıyla anında sunulur

Disk Silme#

Hizmet, birden çok arka plan işlemi kullanarak disk alanını yönetir:

  • CAS disk silme, cache_artifacts tarafından desteklenen LRU semantiğini kullanır
  • Disk kullanımı %85’i aştığında, kullanım %70’e düşene kadar en eski yapıtlar silinir
  • Yerel silmeden sonra yapıtlar S3’te kalır
  • KV silme, eski anahtar-değer girdilerini tutma süresine göre kaldırır ve ayrılmış KV veritabanı yapılandırılmış boyut bütçesini aştığında onu da küçültebilir

Sahipsiz Temizliği#

Hizmet ayrıca diskteki yapıtlar için bir sahipsiz temizlik işçisi çalıştırır:

  • Diskte var olan ancak karşılık gelen bir cache_artifacts satırı bulunmayan dosyalar için depolama ağacını tarar.
  • Bu durum, bir dosya diske yazıldığında ancak SQLite arabellek boşaltması tamamlanmadan önce meta veri yazımı kaybolduğunda gerçekleşebilir.
  • Devam eden yüklemelerle çakışmayı önlemek için güvenlik penceresinden daha yeni olan dosyalar yoksayılır.
  • Bir sahipsiz dosya silinir ve daha sonra tekrar istenirse, sonraki önbellek ıskalaması onun yeniden yüklenmesine neden olur; böylece sistem kendini onarır.

Kimlik Doğrulama#

Önbellek, kimlik doğrulamayı /api/projects uç noktasını çağırarak ve sonuçları önbelleğe alarak (başarı için 10 dakika, hata için 3 saniye) Tuist sunucusuna devreder.

İstek Akışları#

İndirme#

sequenceDiagram
    participant CLI as Tuist CLI
    participant N as Nginx
    participant A as Cache service
    participant D as Disk
    participant S as S3

    CLI->>N: GET /api/cache/cas/:id
    N->>A: Proxy for auth
    A-->>N: X-Accel-Redirect
    alt On disk
        N->>D: Serve file
    else Not on disk
        N->>S: Proxy from S3
    end
    N-->>CLI: File bytes

Yükleme#

sequenceDiagram
    participant CLI as Tuist CLI
    participant N as Nginx
    participant A as Cache service
    participant D as Disk
    participant S as S3

    CLI->>N: POST /api/cache/cas/:id
    N->>A: Proxy upload
    A->>D: Stream to disk
    A-->>CLI: 201 Created
    A->>S: Background upload

API Uç Noktaları#

Uç NoktaYöntemAçıklama
/upGETSağlık kontrolü
/metricsGETPrometheus metrikleri
/api/cache/cas/:idGETCAS yapıtını indir
/api/cache/cas/:idPOSTCAS yapıtını yükle
/api/cache/keyvalue/:cas_idGETAnahtar-değer girdisini al
/api/cache/keyvaluePUTAnahtar-değer girdisini sakla
/api/cache/module/:idHEADModül yapıtının var olup olmadığını denetle
/api/cache/module/:idGETModül yapıtını indir
/api/cache/module/startPOSTÇok parçalı yüklemeyi başlat
/api/cache/module/partPOSTParça yükle
/api/cache/module/completePOSTÇok parçalı yüklemeyi tamamla