使用S3实现一致性和数据存储的无数据库应用程序

时间:2012-08-01 11:13:02

标签: php amazon-s3

我正在使用一个简单的提交申请,为每位访客提供以下服务:

  • 检查目录列表以找到标题中编号最大的目录
  • 将该数字递增1并创建新目录
  • 将上传内容存储到新目录中

我知道有两个同步客户端获取目录列表并为它们确定相同的下一个最大数字可能存在经典竞争条件。为了缓解这个问题,我使用了以下步骤:

  • 首先,像以前一样获得最大数量并增加它
  • 由于S3的目录是文件,因此将随机数存储到新创建的目录
  • 获取目录的内容(实际文件的内容)并与存储在其中的内容进行比较
  • 如果数字不同,这意味着其他一些线程已“赢得”比赛,因此该过程将从第一步开始。

这看起来有足够的步骤吗?我在想,网络拥塞会导致进程A存储和读取自己的数字并确定它已经赢了,然后进程B会得出相同的结论。我该如何缓解这种情况?我正在考虑为操作引入明确的超时时间 - 例如目录创建需要最多n秒,这将是进程在检查随机数之前等待的时间。

或者有没有办法检查FS内容和创建目录的原子操作,或者至少做创建但不替换操作?或者创建失败而不是替换现有文件?

顺便说一下 - 我正在使用PHP和官方SDK。

1 个答案:

答案 0 :(得分:0)

我对Amazon S3没有多少经验,但有以下声明here

  

Amazon S3目前不支持对象锁定。如果有两个看跌期权   同时制作同一把钥匙,放最新时间   邮票获胜。如果这是一个问题,您将需要构建一个   对象锁定机制进入你的应用程序。

除了“Amazon S3数据一致性模型”部分的其他内容之外,它还表明您不希望仅使用对Amazon S3 SDK的请求来实现您想要执行的操作,而是需要外部同步。使用SimpleDB的一个可能的方法是here