使用REST界面进行内部Google AppEngine查询

时间:2011-03-01 10:53:58

标签: google-app-engine rest

我已经开始为我的Google AppEngine应用程序编写REST API。我读了一篇关于构建REST应用程序的好文章,建议我将我的数据服务封装在REST API之后。考虑到我想准备转移到像Amazon Web Services这样的架构,如果原型获得牵引力,这种封装水平是有道理的。

这个想法是Web页面的请求,应用程序服务器接受HTTP请求。然后,应用程序服务器本身向数据库服务器发出HTTP REST请求,而不是直接通过数据存储区对象。对于Google AppEngine,它实际上是相同的服务器,但很容易更改哪个服务器(或服务器群集)实际响应数据请求。

例如:

  1. http://example.com/index.html
    • 导致应用服务器处理的HTTP请求
  2. http://example.com/remote/data?filter=all
    • app server从远程服务器调用数据
  3. 应用服务器
    • 解析远程响应
    • 将数据插入HTML模板
    • 将结果返回给客户
  4. 注意:这不包括我的任何缓存。

    这意味着对于单个客户端HTTP请求,我最终可能会产生4-5个额外的HTTP请求来构建响应。这是一种在Google AppEngine或一般情况下运行良好的架构模式吗? Google是否以有效的方式处理内部请求(appserver instance-appserver实例)?

2 个答案:

答案 0 :(得分:3)

这种模式对AppEngine没有多大意义。

考虑到某些AppEngine资源存在固定限制,例如可能会快速耗尽的URLFetch。此外,可计费的资源(例如CPU时间,传入带宽和传出带宽)的使用速度都比所需的速度快得多。

此外,它极大地限制了AppEngine应用程序的扩展能力。实际上,它是一个负反馈循环。随着外部请求数量的增加,应用程序的负载将非常陡峭。这就是您应该尝试使用AppEngine应用程序实现的对立

最后,我建议这是任何平台上应用程序的可疑架构,而不仅仅是AppEngine。软件工程师很容易爱上抽象,为了模块化,可移植性,松散耦合等价值而生成层上层 - 这个列表一直在进行。但是,任何因抽象原因而导致性能严重下降的决定都是事实上的反模式。

答案 1 :(得分:1)

首先在架构方面,可以在存储上方构建REST数据访问层,请参阅Microsoft的Azure文档,例如http://msdn.microsoft.com/en-us/library/dd179423.aspx

当你移出app引擎并通过urlfetch进行查询时,自然会遇到某种性能损失。我建议在进行移动之前比较数据存储区与urlfetch的计费。

如果您确实创建了DAL以对远程数据库进行这些REST调用,则没有理由为您的GAE数据存储区实际创建urlfetches。只需编写一个应用程序引擎提供程序,直接使用DataStore API http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/package-summary.html

进行这些数据库调用