雖然Cassandra不是CP但Cassandra是安全的

之前的一篇文章(<線性一致性(Linearizability)是併發控制的基礎>),討論過具有線性一致性的系統可以很好的控制併發訪問。

在另外一篇文章裏(< Tunable Consistency不能讓Cassandra成爲CP系統>),已經討論過,Cassandra不是一個CP系統。所以Cassandra會出現丟失更新的情況(lost write)的情況。

那麼Cassandra是不是就是一個有問題的分佈式系統,不適合使用那?

答案是否定的。具有線性一致性的系統能很好的控制併發。但是逆命題是不成立的:系統不具有線性一致性不等於不能很好的控制併發。Cassandra也能很好的控制併發,讓系統具有安全性(Safety)。線性一致性不等於安全性(Safety)。安全性是指我們的系統具有正確的行爲,不會出現丟失更新(lost write)這樣的行爲。其實,我們在開發一個應用時,最終追求的是安全性(Safety)。線性一致性只是我們實現安全性的其中一種手段,安全性纔是我們的目的。

那麼我們能不能,在不實現線性一致性的條件下,讓系統具有安全性那?答案是肯定的。

下面我們來舉個例子。比如Cassandra的某個cell保存着A,進程1讀取這個值,並且追加一個值B,並且將A+B保存到cell中。與此同時,進程B讀取cell,追加一個值C。在這種場景下,不管進程1和進程2,誰先誰後,我們希望cell的值最終是A+B+C,三個值(A+B+C的結果,系統纔是安全的-Safety)。但是實際上在Cassandra中,cell可能會是A+B,也可能是A+C,最終是哪個值取決於時間戳。(關於Cassandra的時間戳可以參看< Tunable Consistency不能讓Cassandra成爲CP系統>)

那麼在Cassandra中我們應該怎麼處理這種場景那?我們可以使用Cassandra的Set結構。Cassandra的Set結構中的每個cell是獨立,你可以併發的往Set中添加B和C,Cassandra保證B和C寫入操作不會有任何衝突。不管進程1和進程2誰先誰後,或者同時,最終的結果都是Set中包含A,B,C三個值。

Cassandra的Set結構,是一種叫做Conflict-free Replicated Data Types(CRDTs)的結構。這種結構並沒有採用線性一致性來解決併發衝突,而是採用一種沒有衝突的數據結構來解決併發問題。這樣結構比線性一致性具有更好的併發能力。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章