Amazon S3,同步,修改日期与上载日期

Tom*_*Tom 2 .net c# amazon-s3 amazon-web-services

我们正在使用适用于.NET的AWS开发工具包,但我试图指出我们的使用者应用程序似乎出现同步问题的地方。基本上,我们有一个推式服务,该服务生成更改集文件并上载到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);
Run Code Online (Sandbox Code Playgroud)

然后按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
    }
}
Run Code Online (Sandbox Code Playgroud)

我是否假设我们应该做更多的事情来保留我们自己需要的日期戳,例如使用自定义标头/元数据对象将正确的日期戳放置在所需的文件上,或者甚至将其放置在文件名中?

编辑

也许这个问题可以回答我的问题:如果我的服务有2个文件要上传到S3并经过此过程,我是否保证这些文件按它们上传(通过LastModified)的顺序显示在S3 中?异步处理是否会导致我的文件在S3对象列表中出现乱序?我担心的情况是,例如,我的服务上传了文件A,然后B,B在S3中首先出现,我的使用者获得+进程B,然后出现A,然后我的使用者可能获得或可能不获得A,错误地处理它,以为它不是较新的吗?

编辑2

就像我和下面的人所怀疑的那样,我们在某些赛车条件下试图盲目地依赖S3的日期戳来应用变更集。作为附录,我们最终进行了2个修复,以尝试解决该问题,这对其他人也可能有用:

首先,为了解决我们的上传完成时间与S3报告的修改日期之间的竞争状况,我们决定使所有查询都比从S3中提取的文件中读取的最后修改日期早1秒。在检查此修复程序时,我们看到了S3中另一个以前未发现的问题,即S3不保留时间戳的毫秒数,而是所有时间戳都舍入到下一秒。时光倒流1秒钟可以避免这种情况。

其次,由于回溯时间太长,如果没有新的变更集文件要下载,我们将有多次下载相同文件的问题,因此我们为上次请求中看到的文件添加了文件名缓冲区,并跳过了我们已经看过的文件,并在看到新文件时刷新缓冲区。

希望这可以帮助。

dcr*_*cro 5

在S3存储桶中列出对象时,从S3收到的API响应将始终按字母顺序返回它们。

S3 API不允许您根据LastModified值对对象进行过滤或排序。任何此类过滤或排序都专门在用于连接到S3的客户端库中完成。

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

至于LastModified值的准确性,并且可以根据上载对象的时间对对象列表进行排序,据我所知,LastModified值设置为上载完成的时间(服务器返回200 OK响应时) ),而不是开始上传的时间。

这意味着,如果您开始上传大小为100MB的A,然后再上传一秒钟大小仅为1K的B,最后,最后一次为A修改的时间戳将在最后一次为B修改的时间戳之后。

如果您需要保留开始上传的时间,则最好在原始PUT请求中使用自定义元数据标头。