2013-07-31 67 views
0

我們正在使用適用於.NET的AWS開發工具包,並且正在努力查明我們似乎與我們的客戶應用程序存在同步問題的位置。基本上我們有一個推送服務,可以生成上傳到S3的變更集文件,我們的客戶應用程序應該下載這些文件並應用它們,以便同步到正確的狀態,這種情況不會發生。Amazon S3,正在同步,修改日期與上傳日期

對於代表正確的日期戳記的地方存在一些相互衝突的觀點。我們的消費者編寫的目的是查看s3文件的「LastModified」字段以對下載的文件進行排序以進行處理,而我不知道該字段代表什麼。起初我以爲它代表了我們上傳文件的修改/創建日期,然後(如看到here)它實際上代表了文件上傳時間的新日期戳,同樣在同一鏈接中,似乎暗示當文件被下載後恢復到舊的日期戳(但我無法證實這一點)。

我們使用這個代碼片段中提取文件的

// Get a list of the latest changesets since the last successful full update. 
Amazon.S3.AmazonS3Client client = ...; 

List<Amazon.S3.Model.S3Object> listObjects = client.GetFullObjectList(
    this.Settings.GetS3ListObjectsRequest(this.Settings.S3ChangesetSubBucket), 
    Amazon.S3.AmazonS3Client.DateComparisonType.GreaterThan, 
    lastModifiedDate, 
    Amazon.S3.AmazonS3Client.StringTokenComparisonType.MustContainAll, 
    this.Settings.RequiredChangesetPathTokens); 

然後排序由S3Object的上次更改時間(我認爲這是我們的假設是錯誤的)

foreach (Amazon.S3.Model.S3Object obj in listObjects) 
{ 
    if (DateTime.Parse(obj.LastModified) > lastModifiedDate) 
    { 
     //it's a new file, so we use insertion sort to put this file in an ordered list 
     //based on LastModified 
    } 
} 

我是正確假設我們應該做更多的事情來保存我們自己需要的日期標記,例如使用自定義標題/元數據對象將正確的日期戳放在我們需要的文件上,或者甚至將它放在文件名本身中?

編輯

也許這個問題可以回答我的問題:如果我的服務有2個文件上傳到S3,並通過這樣做的過程中去,我保證,這些文件顯示在S3 他們上傳的順序(通過LastModified)還是S3做了一些異步處理,可能導致我的文件出現在S3對象列表中亂序?我擔心的情況是,例如,我的服務上傳了文件A然後B,B在S3中首先顯示,我的消費者獲得了+處理B,然後A出現,然後我的消費者可能會或可能不會獲得A和錯誤地處理它認爲它不新時更新?

EDIT 2

那是因爲我和下面的嫌疑人,我們有一些比賽條件試圖以申請的變更,而一味依靠S3的日戳。作爲一個附錄,我們最終做出了兩個修補程序來嘗試解決這個問題,這對其他人可能也有用:

首先,爲了解決上傳完成時和S3報告的修改日期之間的競爭狀態,我們決定讓我們的所有查詢都從過去的日期開始查看,過去的日期是從S3中拉取的文件中讀取的。在檢查此修復程序時,我們看到S3中另一個前所未有的問題,即S3在時間戳上不保留毫秒,而是將它們四捨五入到所有時間戳的下一秒。回顧1秒鐘的時間規避了這一點。其次,由於我們在回顧時間,如果沒有任何新的變更集文件需要下載,我們可能會多次下載相同的文件,因此我們爲我們上次看到的文件添加了一個文件名緩衝區請求,跳過我們已經看到的任何文件,並在看到新文件時刷新緩衝區。

希望這會有所幫助。

回答

2

在S3存儲桶中列出對象時,從S3接收到的API響應將始終按字母順序返回。

S3 API不允許您基於LastModified值過濾或排序對象。任何此類過濾或排序都是在用於連接到S3的客戶端庫中完成的。

http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html

至於上次更改時間值的準確度和它的可能的用途進行分類基礎上,他們上傳時間對象的名單,據我所知,上次更改時間值設置爲時間上傳完成(當服務器返回200 OK響應時),而不是開始上傳的時間。

這意味着如果您開始上傳A的大小爲100MB,並且一秒鐘之後您開始上傳只有1K大小的B,最後A的上次修改時間戳會在B的上次修改時間戳之後。

如果您需要保留開始上傳的時間,最好使用自定義元數據標題和原始PUT請求。