Amazon S3 Consistency
事情是這樣的,我在 S3 的文件上面看到下面這段。
Amazon S3 Data Consistency Model
Amazon S3 provides read-after-write consistency for PUTS of new objects in your S3 bucket in all regions with one caveat. The caveat is that if you make a HEAD or GET request to the key name (to find if the object exists) before creating the object, Amazon S3 provides eventual consistency for read-after-write.
看了一下子發現他的 caveat 部分我看不太懂。於是搜尋了一下,發現這篇說的蠻清楚的。
簡單的解釋一下, S3 在大部分的情形下,都是 eventually consistent 。除了一種情況,那就是 PUT new object 且前面沒有緊跟著 HEAD 或是 PUT 。
Read-After-Write Consistency
以範例來解釋一下,如果我現在 PUT 一個新 object。然後再完成 (得到 200) 之後馬上再傳一個 GET 去取回資料。
PUT a.jpg 200
GET a.jpg 200
這時候就滿足文件說的 read-after-write consistency 。也就是說,我們應該會在 GET 拿到我們要的資料,也就是剛剛才上傳的熱呼呼的圖片 a.jpg
。
Eventually Consistency
如果說 PUT 的東西不是新的物件,而是取代原本物件,那就不是 read-after-write consistency 了。
PUT a.jpg 200
PUT a.jpg 200 // overwrite object
GET a.jpg 200
這個時候,由於是 eventually consistency ,所以並不能保證最後 GET 得到的是第二個 PUT 的結果,也有可能是拿到第一個 PUT 的結果。
Caveat
眼尖的觀眾應該有注意到我還是沒有解釋那個 caveat 倒底是什麼意思。
意思是說,就算你是使用 PUT 加入一個 new object ,只要你在 PUT 前一刻先用 GET 或 HEAD 嘗試取得該物件 (雖然一定會 404) ,你這個 PUT 就會變成 eventually consistency 。
GET b.jpg 404
PUT b.jpg 200
GET b.jpg 200/404
這時候由於是 eventually consistency ,所以你不能確定,最後 GET 回來的一定有東西,也有可能拿到 404 。