System Design

Tutarlılık Modellerini Anlamak: CAP Teoreminden Öte

Dağıtık sistem tasarımında, bir mimarinin yapması gereken en kritik kararların başında veri tutarlılığını nasıl ele alacağı gelir. Tek düğüm veritabanlarından dağıtık kümelere geçiş yaptıkça, veri görünürlüğü konusunda aldığımız garantiler temelde değişir. CAP teoremi ünlü bir şekilde, bir dağıtık sistemin ancak üç özelliğin (Tutarlılık, Kullanılabilirlik ve Bölüm Toleransı) ikisini garanti edebileceğini belirtir; ancak modern uygulama geliştirme gerçekliği, farklı tutarlılık modellerinin incelikli bir şekilde anlaşılmasını gerektirir.

Tutarlılık Spektrumu

Tutarlılık ikili bir anahtar değildir; sıkı doğrusallıktan gevşek nihai tutarlılığa uzanan bir spektrumdur. Bu modellerin anlaşılması, geliştiricilerin sistem davranışlarını belirli kullanım durumlarına göre özelleştirmesini, performans, maliyet ve kullanıcı deneyimi arasında denge kurmasını sağlar.

Güçlü Tutarlılık

Güçlü tutarlılık (veya doğrusallık), herhangi bir okuma işleminin en son yazılan veriyi döndürmesini sağlar. Güçlü tutarlılığa sahip bir sistemde, bir istemci bir değeri güncellerse, tüm sistemdeki sonraki tüm okumalar bu güncellemeyi hemen yansıtır. Bu model, veri doğruluğunun hayati önem taşıdığı finansal işlemler, envanter yönetimi ve kimlik doğrulama sistemleri için kritik öneme sahiptir.

Bununla birlikte, güçlü tutarlılık genellikle ağ bölünmeleri sırasında gecikme ve kullanılabilirlik açısından yüksek bir maliyet gerektirir; çünkü düğümlerin veri durumuna ilişkin anlaşmaya varmadan önce yanıt vermeden önce koordine etmeleri gerekir.

Nihai Tutarlılık

Nihai tutarlılık daha zayıf bir garantidir. Yeterli zaman ve daha fazla güncelleme olmadığı sürece, tüm kopyaların aynı duruma ulaşacağını vaat eder. Yakınsama penceresi sırasında, farklı düğümler aynı anahtar için farklı değerler döndürebilir. Bu model, DNS, sosyal medya akışları ve önbellek katmanları gibi küresel olarak dağıtılmış sistemlerde, acil doğruluktan önce yüksek kullanılabilirlik ve düşük gecikme süresinin önceliklendirildiği durumlarda popülerdir.

// Örnek: Nihai tutarlılık davranışını gösteren sahte kod
class ReplicatedDatabase {
    constructor(replicas) {
        this.replicas = replicas;
    }

    write(key, value) {
        // Yerel kopyaya hemen yaz
        this.replicas[0].put(key, value);
        
        // Diğer düğümlere asenkron kopyalama
        this.replicas.slice(1).forEach(replica => {
            setTimeout(() => replica.put(key, value), Math.random() * 1000);
        });
    }

    read(key) {
        // Asenkron kopyalama tamamlanana kadar
        // 2 veya 3 numaralı kopyadan eski veri dönebilir
        return this.replicas[Math.floor(Math.random() * 3)].get(key);
    }
}

Ara Tutarlılık Modelleri

Güçlü ve nihai tutarlılık uçlarının arasında, farklı ödünleşimler sunan birkaç ara model yer alır:

  • Yazdıklarını Okuma: Bir istemci veri yazarsa, aynı istemci tarafından yapılan sonraki okumaların bu veriyi görmesini sağlar, diğer istemciler görmese bile.
  • Oturum Tutarlılığı: "Yazdıklarını Okuma"yı, monoton okumalar (bir değeri gördüğünüzde, daha eski bir sürümünü asla görmemezsiniz) ve monoton yazmalar (eşzamanlı yazmalar istemci başına sıralanır) dahil olacak şekilde genişletir.
  • Nedensel Tutarlılık: Nedensel olarak ilişkili işlemlerin, tüm istemciler tarafından aynı sırada görüldüğünü sağlar. Örneğin, kullanıcı A bir gönderiyi görürse ve ardından kullanıcı B bu gönderiye yorum yaparsa, kullanıcı A sonunda bu yorumu görmelidir.

Doğru Modelin Seçimi

Bir tutarlılık modeli seçmek tek tip bir karar değildir. Uygulamanın gereksinimlerinin derinlemesine bir anlaşılmasını gerektirir. Bir banka uygulaması için güçlü tutarlılık tartışmasızdır. Statik resimler sunan bir içerik dağıtım ağı (CDN) için ise nihai tutarlılık mükemmel bir şekilde kabul edilebilir ve genellikle performans için tercih edilir.

Amazon DynamoDB, Cassandra ve CockroachDB gibi modern dağıtık veritabanları, geliştiricilerin tutarlılık düzeylerini istek başına ayarlamasına olanak tanır. Bu esneklik, mimarların her belirli iş mantığı yoluna hem son derece kullanılabilir hem de uygun ölçüde tutarlı sistemler inşa etmelerini sağlar.

Sonuç

Tutarlılık modellerine hakim olmak, dayanıklı ve ölçeklenebilir dağıtık sistemler oluşturmak için esastır. "Tutarlı vs. tutarsız" ikili düşüncesinin ötesine geçerek, geliştiriciler performans ve veri bütünlüğü arasında doğru dengeyi sunan sistemler tasarlayabilir. Kritik finansal işlemler için güçlü tutarlılığı veya yüksek ölçekli sosyal özellikler için nihai tutarlılığı seçin, temel ödünleşimleri anlamak başarılı sistem mimarisi için anahtardır.

Share: