S3を利用した場合どのくらいの処理能力を持つのだろうと疑問に思って調べてたら大量のリクエストを処理するためにはキー名に気をつける必要があるらしい。面白かったから紹介。
参考URL
キー名は連続するパターンにしない
該当箇所を以下に引用していますが、簡単に説明します。
S3ではオブジェクトキー名のインデックスを作成しており、インデックス内の複数のパーティションに UTF-8 バイナリ順でオブジェクトキー名を格納しています。以下の例のようにキー名が連続している場合同じパーティションばかりに処理が発生するのでパフォーマンスが低下する原因になるそうです。なるほど。
だからキー名はMD5とかでランダムにすると良いよ〜とか対策についても書かれています。(対策については参照URL先で確認ください。)
大量のオブジェクトをアップロードする場合、キー名の一部として連番や日付と時刻の値を使用することがあります。たとえば、日付と時刻を組み合わせたキー名を選択できます。次の例では、タイムスタンプがプレフィックスに含まれています。
examplebucket/2013-26-05-15-00-00/cust1234234/photo1.jpg
examplebucket/2013-26-05-15-00-00/cust3857422/photo2.jpg
examplebucket/2013-26-05-15-00-00/cust1248473/photo2.jpg
examplebucket/2013-26-05-15-00-00/cust8474937/photo2.jpg
examplebucket/2013-26-05-15-00-00/cust1248473/photo3.jpg
...
examplebucket/2013-26-05-15-00-01/cust1248473/photo4.jpg
examplebucket/2013-26-05-15-00-01/cust1248473/photo5.jpg
examplebucket/2013-26-05-15-00-01/cust1248473/photo6.jpg
examplebucket/2013-26-05-15-00-01/cust1248473/photo7.jpg
...
キー名を連続するパターンにすると、パフォーマンス上の問題が発生します。この問題を理解するため、キー名が Amazon S3 でどのように保存されるかを説明します。Amazon S3 では、各 AWS リージョンにオブジェクトキー名のインデックスを保持しています。オブジェクトキーは、インデックス内の複数のパーティションに UTF-8 バイナリ順で格納されます。キー名により、自動的にそのキーが格納されるパーティションが決まります。タイムスタンプやアルファベット順などの順次プレフィックスを使用すると、Amazon S3 が対象とする特定のパーティションに大量のキーが集中し、そのパーティションの I/O 容量がひっ迫する可能性が増大します。キー名のプレフィックスをランダムにすると、キー名、したがって I/O ロードは複数のパーティションに分散されます。
ワークロードが 1 秒あたり 100 個のリクエストを常に超えることが予想される場合、連続するキー名は避けてください。キー名で連番や日付と時刻のパターンを使用する場合は、キー名にランダムなプレフィックスを追加します。プレフィックスがランダムであることで、キー名が複数のインデックスパーティションに均等に分散されます。
結局どのくらいの処理能力を実現できるの?
ちなみに処理能力の最大値は明示はされていないので検証が必要そう。以下のようには書かれているけど具体的にはどうなんでしょうね。
Amazon S3 は非常に高いリクエストレートをサポートするように拡張されます。
ただガイドラインに従えばGET、PUT、DELETE、GET Bucketなど様々なリクエストなら毎秒100個、GETのみなら毎秒800個のリクエストに対応できるというような書き振りだったのでこの値は参考になりそう。ガイドラインではGETが多いならCloudFront利用するというのも紹介されているので、もっと詳しいことを知りたい方は確認してみてください。