(1)—個(gè)進(jìn)程寫入一個(gè)新的對象并立即嘗試讀取它,但在該改變被傳送到S3的多個(gè)服務(wù)器前,服務(wù)器對該操作可能返回“鍵不存在”。
(2)—個(gè)進(jìn)程;入一個(gè)新的對象并立即嘗試列出桶中已有的對象,但在該改變被傳送到S3的多個(gè)服務(wù)器前,該對象很可能不會出現(xiàn)在列表中。
(3)—個(gè)進(jìn)程用新數(shù)據(jù)替換現(xiàn)有的對象并立即嘗試讀取它,但在該改變被傳送到S3 P的多個(gè)服務(wù)器前,S3可能會返回以前的數(shù)據(jù)。
(4)—個(gè)進(jìn)程刪除現(xiàn)有的對象并立即嘗試讀取它,但在該改變被傳送到S3的多個(gè)服務(wù)器前,S3可能會返回被刪除的數(shù)據(jù)。
(5)—個(gè)進(jìn)程刪除現(xiàn)有的對象并立即嘗試列出桶中的所有對象,但在該改變被傳送到S3的多個(gè)服務(wù)器前,S3可能會列出被刪除的對象。
出現(xiàn)這些現(xiàn)象是因?yàn)镾3為了保證用戶數(shù)據(jù)的一致性而采取的一種折中手段,即在數(shù)據(jù)被充分傳播到所有的存放節(jié)點(diǎn)之前返回給用戶的仍是原數(shù)據(jù),這其實(shí)也就是前面提到的Dynamo架構(gòu)中采用的最終一致性模型。圖3-16給出了一個(gè)簡單的示意圖。
和前面提到的Dynamo架構(gòu)不同,當(dāng)用戶對同一桶的同一對象先后進(jìn)行兩次不同的操作時(shí),后一次操作值會直接覆蓋前一次操作。比如,對于名為chinacloud的桶中的對象A先設(shè)定一個(gè)值為100,后來又設(shè)定其值為150,則A的最后值為150。這種方法看似簡單卻很有效。