2015-04-01 20 views
29

"Güçlü Durumsal Tutarlılık" kavramına rastladım. "Tutarlı Tutarlılık" dan daha güçlü, fakat "Güçlü Tutarlılık" dan daha zayıf mı olmalı? Birisi bu üç kavram arasındaki farklılıkları uygulanabilir örnekler ile açıklayabilir mi? "Güçlü Tutarlılık" ile "Güçlü Tutarlılık" ve "Güçlü Tutarlılık" mı?

http://en.wikipedia.org/wiki/Eventual_consistency#Strong_Eventual_Consistency http://en.wikipedia.org/wiki/Conflict-free_replicated_data_type

çok teşekkürler

.

cevap

86

YASAL UYARI: Aşağıdaki metin, Tutarlı Tutarlılık, Güçlü Tutarlı Tutarlılık ve Güçlü Tutarlılık arasındaki farklar hakkında size kaba bir fikir vermelidir. Ama bir şekilde aşırı basitleştiriliyorlar. Biz farklı kişiler (düğümler) bazı veri nesnesinin kendi kopyasına sahip bir senaryoya bakın yaklaşık tutarlılık konuşurken: İlk)


İlk şeyler; Yani inanmayarak ile götürün. Artık, her düğümün kendi kopyasını güncelleyebilmesi için çakışmalar ortaya çıkmaktadır (örneğin, istemciler, her biri bir düğüme bağlanmış, bunu yapmasını istemektedir), böylece farklı düğümlerden verileri okursam farklı değerler göreceğim. Burada, Olay Tutarlılığı (EC), Güçlü Sonuç Tutarlılığı (SEC) ve Güçlü Tutarlılık (SC) devreye girer.

Eventual Tutarlılık Çatışmalar ortaya çıkabilir, ancak düğümlerin zamanla onlar kesin değeri üzerinde mutabık yüzden, bu çatışmaları çözmek için birbirlerine yaptıkları değişiklikleri iletişim kurarlar. Dolayısıyla, belirli bir süre için verilere daha fazla değişiklik uygulanmazsa, tüm düğümler veri değerinde (yani sonunda kabul edecekler) aynı fikirde olacaklardır, böylece veri okuyucuları sonuçta aynı değeri görecektir.

Örnek: iki düğüm A ve B (nA ve nB) işlemleri read() ve write(string) ile güncelleme bir dizi, her biri bir kopyası vardır. Her birinin kendi müşterisine (cliA ve cliB) sahip olduğunu varsayalım. Başlangıçta her iki düğümün de "Joe" aynı değeri sakladığını varsayalım, fakat bir anda nA onu "Frank" (write("Frank") numaralı telefonu arayarak) olarak değiştirir. Sonra nA, değerin güncellendiğini nB söyleyecektir; her iki değerde de bir çelişki ortaya çıkmakta, ancak bazı politikalar (örneğin son yazma-kazançlar) kullanılarak çözülebilmektedir, böylece nB nihayet kayıtlarını da "Frank" olarak güncellemektedir. Çatışma çözülmeden önceveve cliB verilerin farklı sürümlerini görecektir (read() op sonucu değişecektir), ancak sonunda her ikisi de aynı değeri tekrar görecektir.

Her iki düğümün de aynı anda değerlerini güncelleştirmesi durumunda çakışma çözümünün hala mümkündür, ancak daha karmaşık olduğunu unutmayın. SEC burada parlıyor.

Güçlü Sonuç Tutarlılık Bu, belirli veri türleri için geçerli olan özel bir EC durumudur.

Paylaşılan veri nesnesinin bir sayaç olduğunu ve güncelleştirmelerin add(int value) ve substract(int value) işlemleri tarafından yapıldığını varsayalım. Bu durumda, güncellemelerini uygulamamızın sırasının bir önemi yok!Yani eğer nA ve nB 0 bir sayaç değeri ile başlangıç ​​ve ardından nA çalıştırırsa add(10) ve hem nB çalışır substract(5) (simultaneosly), sadece uyuşmazlık çözümü için önemsemeden birbirlerine güncelleme işlemini göndermek gerekir nihayetinde aynı değere ulaşmaları sağlanacaktır (tersine, AB için önceki örnekte bazı çatışma çözümlerinin gerekli olabileceğini unutmayın)!

Ne yazık ki, SEC yalnızca belirli özelliklere (değişebilirlik ve diğerleri) sahip belirli veri türlerinde ve işlemlerde geçerlidir. Bu tür veri türleri Çakışma içermeyen Çoğaltılmış Veri Türü (CRDT) olarak belirtilmiştir.

Güçlü kıvam Diğer ikisi için oldukça farklı. Burada, güncelleme işlemlerinin tüm düğümlerin yeni değeri müşterilere görünür hale getirmeden önce yeni değer üzerinde hemfikir olduğu bir gerekliliktir. Bu şekilde güncellemeler, tüm istemciler tarafından aynı anda görülebilir. Bu nedenle, her zaman aynı değeri okuyacaktır. Şimdi bu, güncelleme işlemlerinde bazı engelleme gereksinimlerini ortaya koymaktadır. Hem EC hem de SEC'de, yerel kopya güncellendiğinde güncelleme işlemi sona erdi (daha sonra işlem diğer düğümlere yayınlandı). Burada bir istemci güncellemesi, tüm düğümler veri değerine karar verene kadar geri dönmez ve bu işlem yapılırken, bu verinin herhangi bir kopyasına erişilmesi 'kilitlenir' (diğer istemcilerin okuduğu engellenir). write("Frank") çalışanClia, Clia bloke edilecektir EC için Örneğimizde, güncelleme hem nA ve NB tarafından kabul edilene kadar ve daha sonra her iki Clia ve clib de görebilir yapılan edecek Aynı zamanda, yani read() işlemi, o andan itibaren aynı değeri döndürmelidir.

+1

Açıkladı, teşekkürler! – njzhxf

+0

Çok güzel bir açıklama, güzel! –

+4

Açıklığa kavuşturmak için, güçlü tutarlılık yalnızca tüm düğümlerin geçerli değer üzerinde hemfikir olmasını gerektirir. Bir düğüm gerçekleştiğinde düğüm bloklarının okuduğu bir zorunluluk değildir, bunun yerine yazının gecikmesine neden olabilirler. Temel olarak, tüm düğümler tutarlı bir şekilde yeni değeri kullanmaya karar verene kadar yazma işlemi bekleme durumunda olacaktır. – AffluentOwl

İlgili konular