亚马逊S3,同步,修改日期与上传日期

5
我们正在使用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
    }
}

我是否正确地认为我们应该做更多的工作来保留我们需要的日期戳,比如使用自定义头/元数据对象将正确的日期戳放在我们需要的文件上,甚至将它放在文件名中?
编辑
也许这个问题可以回答我的问题:如果我的服务有2个文件要上传到S3,并经过了这个过程,那么我能保证这些文件会按照它们被上传的顺序显示在S3中(通过LastModified),还是S3会进行一定量的异步处理,可能导致我的文件以S3对象列表的形式显示出来?我担心的是这样一种情况:例如,我的服务上传文件A然后B,B先出现在S3中,我的消费者获取并处理B,然后A出现,然后我的消费者可能会或可能不会获取A并错误地处理它,认为它是新的,而实际上不是?
编辑2
正如我和下面的人怀疑的那样,我们在盲目依赖S3的日期戳时遇到了一些竞争条件。作为补充,我们最终采取了两种修复措施来解决问题,这对其他人也可能有用:
首先,为了解决我们上传完成和S3报告的修改日期之间的竞争条件,我们决定使所有查询从我们从S3中拉取的文件的最后修改日期开始向过去1秒钟。在检查这个修复程序时,我们看到了S3中以前没有明显的问题,即S3不保留时间戳的毫秒数,而是将它们舍入到下一秒的时间戳中。向过去1秒钟回溯解决了这个问题。
其次,由于我们正在回望过去,如果没有新的变更集文件可供下载,我们会遇到多次下载同一文件的问题,因此我们添加了一个文件名缓冲区,用于在上次请求中看到的文件,跳过我们已经看到的任何文件,并在看到新文件时刷新缓冲区。
希望这能有所帮助。
1个回答

6
当在S3存储桶中列出对象时,从S3收到的API响应将始终按字母顺序返回它们。
S3 API不允许您基于LastModified值过滤或排序对象。任何这样的过滤或排序都是在您用于连接到S3的客户端库中进行的。

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

就最后修改时间值的准确性及其可能用于基于上传时间对对象列表进行排序而言,据我所知,LastModified值设置为上传完成时的时间(当服务器返回200 OK响应时),而不是上传开始时的时间。
这意味着,如果您开始上传大小为100MB的A文件,并在一秒钟后开始上传大小只有1K的B文件,则最终A文件的最后修改时间戳将晚于B文件的最后修改时间戳。
如果您需要保留上传开始的时间,最好使用自定义元数据头与原始PUT请求一起使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接