从磁盘(文件)而不是memcache / datastore获取数据?

时间:2013-12-11 05:26:53

标签: google-app-engine

我依赖于返回json结果的外部服务/ API。 Urlfetch或该服务非常慢,无论如何性能变化很大。此外,如果该服务出现故障,我的网站上的内容就会变坏。我已经看到我的页面加载为1秒或更糟,没有选择但只返回404,因为外部服务的时间不好。

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

一般问题是:

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

GAE专为大规模并行应用而设计,其中写入磁盘不够好,性能和冗余。您将获得数据存储区,blob存储区和内存缓存区的选项,这些选项在实例之间共享并稍微同步。

从GAE中的静态磁盘映像读取是可能的,但速度很慢。没有好的指标,但一直在讨论邮件列表的缓慢。我自己尝试过小数据,它肯定比数据存储区慢。

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

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

答案 1 :(得分:0)

如果您想在本地存储它们,那么在应用程序的文件系统中执行它的方法要好得多。您可以使用数据存储区将JSON字符串存储为blob,也可以直接使用Blobstore。你提到数据存储是“昂贵的”,但实际上并不是那么昂贵,因为如果数据从memcache到期,你只会从那里读取。