3

AWS SDK for .NET を使用しており、コンシューマー アプリケーションとの同期に問題があると思われる場所を特定しようとしています。基本的に、S3 にアップロードされる変更セット ファイルを生成するプッシュ サービスがあり、コンシューマ アプリケーションはこれらのファイルをダウンロードして適用し、正しい状態に同期する必要がありますが、これは行われていません。

正しい日付スタンプがどこでどのように表されているかについて、いくつかの矛盾する見解があります。私たちの消費者は、s3 ファイルの「LastModified」フィールドを見て、ダウンロードされたファイルを処理のために並べ替えるように書かれていましたが、このフィールドが何を表しているのかわかりません。最初は、アップロードしたファイルの変更/作成日を表していると思っていましたが、(ここで見られるように)実際には、ファイルがアップロードされたときの新しい日付スタンプを表しています。同様に、同じリンクでは、ファイルがダウンロードされると、古い日付スタンプに戻ります (ただし、確認できません)。

このコード スニペットを使用してファイルをプルしています

// 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 の LastModified で並べ替えます (これは、私たちの仮定が間違っていると思います)。

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
    }
}

カスタムヘッダー/メタデータオブジェクトを使用して、必要なファイルに正しい日付スタンプを配置したり、ファイル名自体に配置したりするなど、必要な独自の日付スタンプを保持するために、さらに何かを行う必要があると想定するのは正しいですか?

編集

おそらく、この質問は私の問題に答えることができます: 私のサービスに S3 にアップロードする 2 つのファイルがあり、それを行うプロセスを経る場合、これらのファイルが(LastModified を介して)アップロードされた順序で S3 に表示されることが保証されていますか?私のファイルが S3 オブジェクトのリストに順不同で表示される可能性がある非同期処理をいくらか実行しますか? たとえば、サービスがファイル A をアップロードしてから B をアップロードし、B が S3 で最初に表示され、コンシューマーが + プロセス B を取得し、次に A が表示され、その後、コンシューマーが A を取得する場合と取得しない場合があることを心配しています。そうではないのに新しいと思って誤って処理しますか?

編集2

それは私と以下の人が疑ったとおりで、S3 の日付スタンプにやみくもに頼りながら、変更セットを順番に適用しようとするいくつかの競合状態がありました。補遺として、問題に対処するために 2 つの修正を行うことになりました。これは、他の人にも役立つ可能性があります。

まず、アップロードの終了時と S3 によって報告された変更日との間の競合状態に対処するために、すべてのクエリで、S3 でプルされたファイルから読み取った最後の変更日から 1 秒だけ過去を調べることにしました。この修正を調査したところ、以前は明らかではなかった S3 の別の問題が見つかりました。つまり、S3 はタイムスタンプでミリ秒を保持せず、すべてのタイムスタンプでミリ秒を次の秒に切り上げていました。時間を 1 秒遡ることで、これを回避できました。

次に、時間をさかのぼってダウンロードする新しいチェンジセット ファイルがない場合、同じファイルを複数回ダウンロードするという問題が発生するため、最後のリクエストで見たファイルのファイル名バッファを追加し、既に見たファイルを表示し、新しいファイルが表示されたときにバッファを更新しました。

お役に立てれば。

4

1 に答える 1

5

S3 バケット内のオブジェクトを一覧表示する場合、S3 から受信した API 応答は常にアルファベット順にそれらを返します。

S3 API では、LastModified 値に基づいてオブジェクトをフィルタリングまたはソートすることはできません。このようなフィルタリングまたはソートは、S3 への接続に使用するクライアント ライブラリでのみ行われます。

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

LastModified 値の精度と、アップロードされた時間に基づいてオブジェクトのリストを並べ替えるために使用できる可能性については、私の知る限り、LastModified 値はアップロードが終了した時間に設定されます (サーバーが 200 OK 応答を返したとき)。 ) であり、アップロードが開始された時間ではありません。

つまり、サイズが 100MB の A のアップロードを開始し、1 秒後にサイズが 1K しかない B のアップロードを開始すると、最終的に、A の最終変更タイムスタンプは B の最終変更タイムスタンプよりも後になります。

アップロードが開始された時刻を保持する必要がある場合は、元の PUT 要求でカスタム メタデータ ヘッダーを使用することをお勧めします。

于 2013-08-01T10:03:14.803 に答える