1

訪問者ごとに次のことを行う単純な送信アプリケーションを使用しています。

  • ディレクトリのリストをチェックして、タイトルの番号が最大のものを見つけます
  • その番号を1つ増やして、新しいディレクトリを作成します
  • アップロードをその新しいディレクトリに保存します

2 つのクライアントが同時にディレクトリ リストを取得し、それらの次に大きい数を決定するという従来の競合状態が発生する可能性があることは承知しています。問題を軽減するために、次の手順を使用しています。

  • 最初に、以前と同じように最大数を取得し、それをインクリメントします
  • S3のディレクトリはファイルなので、乱数を新しく作成したディレクトリに保存します
  • ディレクトリの内容(実際のファイルの内容)を取得し、そこに保存されていたものと比較します
  • 数値が異なる場合は、他のスレッドがレースに「勝った」ことを意味し、プロセスはステップ 1 から再開されます。

これで十分な手順のように見えますか? 私が考えていたのは、ネットワークの輻輳により、プロセス A が自身の番号を保存および読み取り、勝ったと判断した場合、プロセス B が同じ結論に達する可能性があるということです。どうすればこれを軽減できますか? 操作に明示的なタイムアウトを導入することを考えていました-たとえば、ディレクトリの作成には最大n秒かかる必要があり、それはプロセスが乱数をチェックする前に待機する時間になります。

または、FS の内容をチェックしてディレクトリを作成するアトミック操作を行う方法、または少なくとも作成するが置換しない操作を行う方法はありますか? または、既存のファイルを置き換える代わりに失敗する作成を行いますか?

そしてところで-私はPHPと公式SDKを使用しています。

4

1 に答える 1

0

Amazon S3 の経験はあまりありませんが、次のステートメントがあります

Amazon S3 は現在、オブジェクトのロックをサポートしていません。同じキーに対して 2 つのプットが同時に行われた場合は、タイムスタンプが最新のプットが勝ちます。これが問題になる場合は、アプリケーションにオブジェクト ロック メカニズムを組み込む必要があります。

「Amazon S3 データ整合性モデル」セクションの残りの内容と同様に、実行したいことは Amazon S3 SDK へのリクエストのみを使用して実装することはできず、外部同期が必要であることを示唆しています。SimpleDB を使用した考えられるレシピの 1 つがここにあります

于 2012-08-01T16:06:15.330 に答える