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

12 篇文章 0 订阅
6 篇文章 1 订阅

之前的一篇文章(<线性一致性(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)的结构。这种结构并没有采用线性一致性来解决并发冲突,而是采用一种没有冲突的数据结构来解决并发问题。这样结构比线性一致性具有更好的并发能力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值