我正在编写一些端到端测试,这些测试重用和改变测试数据,因此需要在外部中央位置存储和修改文件。由于用例的原因,并发访问将受到限制,因此我决定在 s3 上采用乐观并发解决方案,而不是创建数据库,这对于少量测试数据来说似乎有点大材小用。
我的计划是在s3上创建一个小文件列表,每次测试需要数据时,获取一个文件,从服务器上删除它,然后在数据发生变异后写回一个新文件。
为了最大限度地减少两个用户访问同一文件的机会,我想以原子方式获取和删除该文件。这可能吗?或者 s3 对象删除的延迟时间是否足够大以至于没有意义?
最佳答案
删除操作并不完全是您所需要的原子操作。
Amazon S3 offers eventual consistency for overwrite PUTS and DELETES in all regions.
http://docs.aws.amazon.com/AmazonS3/latest/dev/Introduction.html#ConsistencyModel
删除对象后,无法保证对该对象的后续请求不会成功,特别是在接下来的几秒钟内。这通常非常快,但显然仍然是可能的。 S3 的设计优先考虑新创建的对象立即可用,而代表删除和覆盖的存储桶索引更改可能最好描述为以较低优先级处理(尽管我认为有些天真)。
此外,您删除了其他人正在下载的对象,删除操作成功,但下载过程永远不会中断,无论文件大小或下载需要多长时间。
关于java - 从 s3 存储桶中原子获取和删除对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43644277/