【问题标题】:Deleting Blobstore orphans删除 Blobstore 孤儿
【发布时间】:2012-10-22 14:18:47
【问题描述】:

从 Blobstore 中删除孤立 Blob 最有效的方法是什么?

应用功能和范围:

  • 一个(登录的)用户想要创建一个包含一些正常的帖子 数据存储字段(例如姓名、姓氏、cmets)和 blob(图像)。
  • 此外,blob 在恢复之前异步上传 数据通过 POST 发送
    • 这留下了产生孤儿的好机会,例如,用户可能会上传图像但出于某种原因未完成表单。通过在发送其余数据之前不使用 blob 的异步上传,可以最大限度地减少此问题,但是,此问题在较小的范围内仍然存在。

可能但低效的解决方案:

  • 只要完成了一个帖子(即发送了其余数据),就将 blob 键添加到“已用 blob”表中。然后,您可以每隔一段时间运行一个 cron 并将所有 blob 与“已用 blob”表进行比较。一个多小时前上传但仍“未使用”的将被删除。
    • 我的理解是,遍历可能包含数十万个 Blob 键的列表并将其与另一个包含数十万个“已使用 Blob 键”的表进行比较是非常低效的。

有没有更好的方法来做到这一点?我搜索了类似的帖子,但找不到任何提及的有效解决方案。

提前致谢!

【问题讨论】:

    标签: google-app-engine python-2.7 google-cloud-datastore blobstore


    【解决方案1】:

    使用草稿!每次上传后另存为草稿。那就别打扫了!让用户为自己选择抹杀。

    如果您打算发布 Facebook 风格的帖子,请使用草稿或将其设为私有。为什么要删除用户的数据?

    【讨论】:

      【解决方案2】:

      感谢 cmets。但是,我很了解这些解决方案,我发现它们效率太低。查询数千个标记为“未使用”的条目并不理想。

      我相信我想出了一个更好的方法,并想听听您的想法:

      保存 blob 后,会立即创建一个延迟任务以在一小时内删除同一个 blob。如果创建并保存了帖子,则会删除延迟任务,因此不会在一个小时内删除 blob。

      我相信这可以让您不必每小时查询数千个条目。

      您对此解决方案有何看法?

      【讨论】:

      • 1000 万只键查询成本为 6 美元(2016 年 2 月)。以每小时 1 次计算,相当于 1,141 年的查询。您的解决方案可能更昂贵。
      【解决方案3】:

      您可以创建一个将 blob 链接到用户的实体。当用户上传 Blob 时,您会立即使用 Blob ID、用户 ID(或帖子 ID)和创建时间创建新记录。当用户提交帖子时,您向该实体添加一个标志,指示使用了一个 blob。

      现在,您的 cron 作业需要获取标志不等于“true”且创建时间超过一小时前的所有此类实体。此外,您只能获取键,这是一种比获取完整实体更有效的操作。

      【讨论】:

        【解决方案4】:

        一个 blob 也有一个文件名。发布后,您可以删除所有具有相同文件名的旧 blob。要删除的重复项必须具有相同的所有者或没有所有者。您还必须删除没有所有者的 blob。

        这是一个在上传后删除重复项的示例。

        blobs = blobstore.BlobInfo.gql("WHERE filename = '%s'" %(filename))
        for blob in blobs :
            if blob.key() != userdata.blob_ref.key()  : blob.delete()
        

        要清理“未使用”的 blob,您可以在每次上传后安排一个任务,在一个小时后运行。

        【讨论】:

        • 您假设用户永远不会使用同名文件(例如“Picture.jpg”)
        • 我不知道您的业务案例,但我相信您可以找到解决方案,因为您必须决定它是新文件还是新版本。
        猜你喜欢
        • 2011-01-02
        • 2012-02-07
        • 2010-09-23
        • 2014-10-07
        • 2013-06-05
        • 2011-02-09
        • 2012-08-16
        • 1970-01-01
        相关资源
        最近更新 更多