先说结论
对于一个新上传的对象,S3提供写后读写一致性(read-after-write consistency)
对于已存在对象的复写,S3提供最终读写一致性(eventual consistency)
举几个栗子。
什么意思呢?https://codeburst.io/quick-explanation-of-the-s3-consistency-model-6c9f325e3f82 这篇文章写得挺清楚的,有兴趣可以看一下,这里我们来总结一下
1.假设我们有一个崭新的文件img.jpg,put之后马上get ,OK,没有问题。这里就是read-after-write consistency的体现。
PUT /img.jpg 200
GET /img.jpg 200
2.假设我们上传了一个img.jpg,之后再put一个和这个img.jpg的key一样,但是内容不同的新文件,之后再get。这个时候get请求的结果很可能还是旧的文件。
PUT /img.jpg 200
PUT /img.jpg 200 (new content)
GET /img.jpg 200
3.假设我们get一个不存在的对象,会返回一个404结果,之后我们再put这个对象,随后再次的get可能还是会返回404
GET /img.jpg 404
PUT /img.jpg 200
GET /img.jpg 404
上述例子2和3就是S3最终一致性(eventual consistency)的体现。
关于最终一致性的解释
因为s3是一个分布式系统,变更传播到每个节点需要一定的时间,所以如果在变更还没有传播到所有节点之前就执行get请求,很有可能就会得到一个旧的结果。
S3的这种特性其实是CAP定理的一种体现。简单解释一下CAP定理
CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer's theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
一致性(Consistency) (等同于所有节点访问同一份最新的数据副本)
可用性(Availability)(每次请求都能获取到服务器非错的响应)
分区容错性(Partition tolerance)(以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择)
一般来说P属性都是不可避免的,而S3的做法就是在P的前提下,保证高可用性,根据CAP定理,就会牺牲掉一致性。
当然,CAP定理并不是绝对的,有兴趣的话可以参考一下这篇文章。 https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed/
参考资料:
https://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel
https://codeburst.io/quick-explanation-of-the-s3-consistency-model-6c9f325e3f82
https://www.infoq.cn/article/cap-twelve-years-later-how-the-rules-have-changed/
网友评论