【问题标题】:Getting data from disk (files) instead of memcache/datastore?从磁盘(文件)而不是 memcache/datastore 获取数据?
【发布时间】:2013-12-11 05:26:52
【问题描述】:

我依赖于返回 json 结果的外部服务/API。 Urlfetch 或该服务非常慢,并且性能无论如何都非常可变。此外,如果该服务出现故障,我的网站就会出现问题。我已经看到我的页面在 1 秒或更短的时间内加载完毕,因为外部服务运行不佳,所以别无选择,只能返回 404。

我正在考虑在我的应用中缓存或存储这些结果。给定请求的这些结果不会改变(或极少改变)。所以 memcache 很快,但我可以使用一些持久性,比如数据存储。

一般问题是:

为什么不简单地将这些 json 结果存储在我的应用程序的磁盘上?

由于我无法写入磁盘,我必须在我的机器上获取/写入 json(使用脚本/cron/whatever),然后部署应用程序以更新文件。我可能不需要每天部署超过一次来更新 json 文件。

一些注意事项(和问题):

  • 用最小的实例,从磁盘读取需要 1.6ms 到 5ms(似乎相当于 memcache)
  • 我不记得看到任何文件读取配额。有什么我忘记了吗?
  • 磁盘是持久的,memcache 不是
  • Datastore 速度慢得多,成本也高得多。
  • 我不知道从磁盘读取处理负载的效果如何(django 的 template.render() 不会从磁盘读取并遇到同样的问题吗?)
  • 如果我有多个实例正在运行并且流量很大,并发文件读取会使其变得非常慢吗?这里有人有指标吗?
  • 还有其他/更好的选择吗?

【问题讨论】:

    标签: google-app-engine


    【解决方案1】:

    想想 App Engine 的工作方式。每当您需要更多处理能力来处理您的请求时,就会启动一个新的“实例”。任何给定的实例都像虚拟机一样工作——有 CPU 资源和内存。唯一的“磁盘”是包含启动实例(以及所有其他实例)的映像的磁盘。所以实例没有自己的磁盘。

    您不想让每个实例都有自己的磁盘的一个非常重要的原因是您无法解析数据。如果实例 1 写了一些东西,而实例 2 写了其他东西怎么办?你如何合并这些磁盘?甚至将请求路由回实例 1 或 2?

    GAE 专为大规模并行应用程序而设计,在这些应用程序中,写入磁盘的性能和冗余性不够好。您可以选择在实例之间共享和同步的数据存储、blobstore 和 memcache。

    可以在 GAE 中读取静态磁盘映像,但速度较慢。没有好的衡量标准,但在邮件列表中一直在讨论缓慢。小数据我自己试过了,肯定比datastore慢。

    GCS 是一种类似磁盘的替代方案。还是不快。

    如果您不需要 GAE 的扩展,您可以使用像亚马逊这样的 IaaS 服务或其他可以让您访问磁盘的 VPS 主机。请记住,即使使用 Amazon,网络安装的磁盘映像也可能很慢。

    【讨论】:

    • 我了解多个实例写入磁盘的问题。但我不太看好它的阅读。具体来说,我不明白为什么从磁盘读取(小)json文件会比django的template.render()更糟糕。不是为每个请求从磁盘读取模板吗?在这里,我将直接从 id 读取 json 文件(无需搜索或任何东西)。你说它很慢,但我测量了 1.5ms 到 5ms,这并不比 memcache/datastore 慢。你的意思是高负载时它很慢?如果它那么糟糕,为什么我们不将我们的 django html 模板缓存到 memcache 或其他东西?
    • 我确实缓存了我的 django html 模板:P 你是对的,磁盘不会那么慢,因为它从磁盘加载整个虚拟机,但我已经看到它需要 10 毫秒打开并读取文件,因此它可能取决于您的整个文件系统有多大,以及您的文件是否以某种方式缓存。如果 json 数据是静态的,最好的方法是: 1. 将其存储在磁盘上并部署。 2. 当您的实例启动时,将值读入您的实例的内存中, 3. 从内存而不是磁盘提供服务。
    【解决方案2】:

    如果您想将它们存储在本地,有比在应用的文件系统中存储更好的方法。您可以使用数据存储将 JSON 字符串存储为 Blob,也可以直接使用 Blobstore。您提到数据存储“昂贵”,但实际上它并没有那么昂贵,因为如果数据从 memcache 过期,您只会从那里读取。

    【讨论】:

    • 我在下面对 Dragonx 的答案给出了更详细的评论,但它也适用于您的答案。另外,具体到您的建议:为什么使用 blobstore 或 BlobProperty 而我可以使用 TextProperty(据我所知,这不是索引,这对我的情况很好)。
    • 我没有评论速度。我的问题更多是关于使您的开发机器 - 以及部署过程 - 成为生产服务的一部分,这似乎不必要地脆弱。生产任务应该发生在生产中。是的,您可以轻松地使用 TextProperty。
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 2016-12-02
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多