AmazonS3,同步,修改日期与上传日期

本文关键字:日期 修改 同步 AmazonS3 | 更新日期: 2023-09-27 18:25:50

我们使用的是用于.NET的AWS SDK,我正试图找出我们与消费者应用程序的同步问题。基本上,我们有一个推送服务,它生成上传到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,也可能没有得到a,错误地处理它,认为它是新的,而事实并非如此?

编辑2

正如我和下面的人所怀疑的那样,我们有一些比赛条件,试图在盲目依赖S3的日期戳的同时按顺序应用变更集。作为一个附录,我们最终进行了2次修复,试图解决这个问题,这可能对其他人也有用:

首先,为了解决上传完成和S3报告的修改日期之间的竞争条件,我们决定让所有查询在从S3中的拉取文件中读取的最后一个修改日期后1秒内查看过去。在检查此修复程序时,我们在S3中发现了另一个以前不明显的问题,即S3没有在时间戳上保留毫秒,而是在所有时间戳上将其四舍五入到下一秒。时光倒流1秒就避开了这一点。

其次,由于我们回顾过去,如果没有任何新的变更集文件可供下载,我们将面临多次下载同一文件的问题,因此我们为上次请求中看到的文件添加了文件名缓冲区,跳过了我们已经看到的任何文件,并在看到新文件时刷新了缓冲区。

希望这能有所帮助。

AmazonS3,同步,修改日期与上传日期

在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请求中使用自定义元数据头。