4

我有一个非常简单的应用程序引擎应用程序,提供存储在 blobstore 中的 1.8Kb - 3.6Kb gzipped 文件。从数字文件 ID 到 blobkey 的映射存储在数据存储中并缓存在 memcache 中。servlet 实现很简单:在请求中接收到一个数字文件 ID;从 memcache/datastore 中检索 blobkey,并BlobstoreService.serve(blobKey, resp)调用标准来提供响应。正如预期的那样,应用日志显示响应大小始终与提供的 blobstore 文件大小相匹配。

我一直在进行一些重点容量测试,这表明传出带宽配额利用率一直报告为大约是我预期收到的请求的 2 倍。我一直在一次运行 100k 请求,将客户端收到的字节相加,将其与应用程序日志进行比较,除传出带宽配额利用率外,所有内容均保持平衡。

对于我上面描述的简单应用程序如何确定传出带宽配额利用率有什么帮助吗?我错过了什么或没有考虑什么?为什么它与应用日志中显示的响应大小总数不相符?

[2013.03.04 更新:我放弃了使用 blobstore 并恢复为将 blob 直接存储在数据存储中。传出带宽利用率现在完全符合预期。似乎 2x 乘数在某种程度上与 blobstore 的使用有关(但仍然无法解释)。我在使用 blobstore 服务时遇到了其他几个问题;最成问题的是额外的数据存储读取和写入(这与数据存储中管理的 blobinfo 和 blobindex 元数据有关 - 这是我最初试图通过将数据迁移到 blobstore 来减少的)。对我来说一个特别严重的问题是:https ://code.google.com/p/googleappengine/issues/detail?id=6849. 我认为这是 blobstore 服务内存泄漏;创建 Blob 后,您将永远无法删除数据存储中的 Blob 元数据。我将永远为此付出代价,因为我愚蠢地进行了 24 小时的容量和性能测试,现在无法释放测试期间使用的存储空间。看来,blobstore 目前只适用于非常特定的场景(即永久静态数据)。具有大量流失或频繁刷新或更改的数据的对象不应存储在 blobstore 中。]

4

1 回答 1

0

可以删除 blobstore 数据(我不建议这样做,因为它会导致意外行为),但前提是您知道它保存在的表__BlobInfo____BlobFileIndex__. 这样就完成了,所以你上传的文件没有相同的名字,并且不小心替换了一个旧文件。

对于存储在数据存储中的表的完整列表,您可以运行SELECT * FROM __kind__.

我不确定为什么您的应用引擎应用会消耗 2 倍的传出带宽,但我会自己进行测试。

另一种方法是使用谷歌云存储。如果您为应用引擎应用使用默认存储桶,您将获得 5GB 的免费存储空间

具有大量流失或频繁刷新或更改的数据的对象不应存储在 blobstore 中。

没错,您可以使用云存储或数据存储(云存储是一种不可变的对象存储服务)。Blobstore 更适合通过<input type='file' />表单上传文件。(从最近开始,从应用程序内部写入文件已被弃用,取而代之的是云存储)

于 2015-05-25T12:48:59.013 回答