我们正在使用AWS SDK for .NET,我试图找出我们的消费者应用程序与同步问题出在哪里。基本上,我们有一个推送服务,生成变更文件并上传到S3,我们的消费者应用程序应下载这些文件并按顺序应用它们以达到正确的状态进行同步,但实际情况并非如此。
关于正确时间戳的表示方式存在一些冲突的观点。我们的消费者应用程序是根据s3文件的"LastModified"字段来对下载的文件进行排序处理的,而我不再知道这个字段代表什么含义了。起初,我认为它代表我们上传文件的修改/创建日期,然后(如此处所示)它实际上代表了文件上传时的新时间戳,同样在相同的链接中似乎暗示当文件被下载时,它会恢复到旧的时间戳(但我无法确认这一点)。
我们正在使用以下代码片段拉取文件:
我是否正确地认为我们应该做更多的工作来保留我们需要的日期戳,比如使用自定义头/元数据对象将正确的日期戳放在我们需要的文件上,甚至将它放在文件名中?
编辑
也许这个问题可以回答我的问题:如果我的服务有2个文件要上传到S3,并经过了这个过程,那么我能保证这些文件会按照它们被上传的顺序显示在S3中(通过LastModified),还是S3会进行一定量的异步处理,可能导致我的文件以S3对象列表的形式显示出来?我担心的是这样一种情况:例如,我的服务上传文件A然后B,B先出现在S3中,我的消费者获取并处理B,然后A出现,然后我的消费者可能会或可能不会获取A并错误地处理它,认为它是新的,而实际上不是?
编辑2
正如我和下面的人怀疑的那样,我们在盲目依赖S3的日期戳时遇到了一些竞争条件。作为补充,我们最终采取了两种修复措施来解决问题,这对其他人也可能有用:
首先,为了解决我们上传完成和S3报告的修改日期之间的竞争条件,我们决定使所有查询从我们从S3中拉取的文件的最后修改日期开始向过去1秒钟。在检查这个修复程序时,我们看到了S3中以前没有明显的问题,即S3不保留时间戳的毫秒数,而是将它们舍入到下一秒的时间戳中。向过去1秒钟回溯解决了这个问题。
其次,由于我们正在回望过去,如果没有新的变更集文件可供下载,我们会遇到多次下载同一文件的问题,因此我们添加了一个文件名缓冲区,用于在上次请求中看到的文件,跳过我们已经看到的任何文件,并在看到新文件时刷新缓冲区。
希望这能有所帮助。
关于正确时间戳的表示方式存在一些冲突的观点。我们的消费者应用程序是根据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秒钟回溯解决了这个问题。
其次,由于我们正在回望过去,如果没有新的变更集文件可供下载,我们会遇到多次下载同一文件的问题,因此我们添加了一个文件名缓冲区,用于在上次请求中看到的文件,跳过我们已经看到的任何文件,并在看到新文件时刷新缓冲区。
希望这能有所帮助。