我正在使用一个简单的提交应用程序,它为每个访问者执行以下操作:
- 检查目录列表以找到标题中数字最大的目录
- 将该数字加一并创建新目录
- 将上传内容存储到该新目录中
我知道可能存在两个同时客户端获取目录列表并为它们确定相同的下一个最大数字的经典竞争条件。为了缓解这个问题,我正在使用以下步骤:
- 首先,像以前一样获取最大的数字并增加它
- 由于 S3 的目录是文件,所以在新创建的目录中存储一个随机数
- 获取目录的内容(实际文件的内容)并与其中存储的内容进行比较
- 如果数字不同,则意味着其他线程“赢得”了比赛,因此该过程从第一步重新开始。
这看起来像足够的步骤吗?我在想,网络拥塞是否会导致进程 A 存储和读取自己的号码并确定它已经获胜,然后进程 B 会得出相同的结论。我怎样才能减轻这种情况?我正在考虑为操作引入显式超时 - 例如,目录创建需要最多 n 秒,这将是进程在检查随机数之前等待的时间。
或者有没有办法进行检查 FS 内容和创建目录的原子操作,或者至少做创建但不替换操作?或者创建会失败而不是替换现有文件?
顺便说一句 - 我正在使用 PHP 和官方 SDK。