0

基本的に、Rackspace Cloud Files 内にコンテナーを作成しましたwork。内部workには、ユーザー名ごとに非常に多くのフォルダーがあります(新しいユーザーが登録して1 GBのスペースを割り当てると、動的フォルダーになります)。ユーザーがファイルをアップロードするたびに、アップロードを許可する前に、ユーザーが制限を超えているかどうかを確認したいと思います。Rackspace オープン クラウド SDK と共に Laravel PHP フレームワークを使用しています。

質問:

  1. メインコンテナ(「xyz」)の下に作成された特定のユーザーのフォルダーのフォルダーサイズを取得したい。

  2. ユーザーが制限を超えているかどうかを達成する他の方法はありますか?

4

1 に答える 1

2
  1. メインコンテナ(「xyz」)の下に作成された特定のユーザーのフォルダーのフォルダーサイズを取得したい。

コンテナーの一覧表示を実行するときに、"prefix" および "format" クエリ パラメーターを指定して、特定のプレフィックス (この場合はユーザー名) で始まるオブジェクトのみを返し、結果を JSON/XML 形式で返すことができます。結果が JSON または XML で返される場合、オブジェクトに関する追加情報が含まれます。以下は、JSON 応答の例です。

[
    {
        "bytes": 13,
        "content_type": "text/plain",
        "hash": "8ddd8be4b179a529afa5f2ffae4b9858",
        "last_modified": "2015-01-27T00:08:44.671230",
        "name": "<username>/some_object.txt"
    },
    ...
]

注:このソリューションでは、10,000 個のオブジェクトが返された場合、「marker」クエリ パラメータを使用して結果をページングすることを検討する必要があります。

さらに、ユーザーを複数のコンテナーに分割することを検討することもできます。結果整合性ウィンドウ (これについては後で詳しく説明します) に関する限り、より正確な結果を取り戻すために、これを行うことをお勧めします。たとえば、コンテナー「work_0」から「work_9999」を作成し、次のような内容でどのユーザーがどのコンテナーに移動するかを決定します。

$user_md5 = md5($username);
// Only use part of the md5sum, unless you have support for big (128-bit) integers
$user_int = hexdec(str_split($user_md5, 7)[0]);
$container_id =  $user_int % 10000;
$container_name = "work_$container_id";
print "Container for user \"$username\" is \"$container_name\"\n";
  1. ユーザーが制限を超えているかどうかを達成する他の方法はありますか。

ユーザーの成長速度に制限がある場合、または合計ユーザー数を制限できる場合は、ユーザーごとにコンテナーを作成することを検討してください。これの欠点は、サポートできるユーザー数が、アカウントあたりのコンテナーの最大数 (500,000) によって制限されることです。ただし、コンテナ クォータ機能を使用できるようになります。この機能を使用して、オブジェクトを PUT しようとしてクォータを超えた場合、HTTP 413 応答を受け取ります。「X-Container-Bytes-Used」ヘッダーを使用して、ユーザーの使用状況を確認することもできます。

注:以前、「結果整合性ウィンドウ」について言及しました。場合によっては、コンテナーのリスト/クォータがすぐに更新されないことがありますが、最終的には更新されます。ほとんどの場合、この遅延は目立たないか、最小限です。ただし、ユース ケースで、ユーザーがクォータを超えてアップロードすることを絶対に許可しないことが必要な場合は、ユーザーの使用状況を追跡する別の方法 (ローカル データベースなど) を探す必要がある場合があります。

于 2015-01-28T20:12:56.750 に答える