0

基本上我已经在 Rackspace Cloud Files 中创建了一个容器,比如说work. 在里面work我有这么多的用户名文件夹(新用户注册并分配 1 GB 空间的动态文件夹)。每次用户上传文件时,我想在允许他上传之前检查用户是否超过了他的限制。我正在使用 Laravel PHP 框架和 Rackspace 开放云 SDK。

问题:

  1. 我想获取在主容器(“xyz”)下创建的特定用户文件夹的文件夹大小。

  2. 有没有其他方法可以实现用户是否超过限制?

4

1 回答 1

2
  1. 我想获取在主容器(“xyz”)下创建的特定用户文件夹的文件夹大小。

执行容器列表时,您可以提供“前缀”和“格式”查询参数以仅返回以特定前缀(在您的情况下为用户名)开头的对象,并以 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"
    },
    ...
]

注意:使用此解决方案,如果您返回 10k 个对象,您将需要考虑使用“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 回答