Google app engine 使用REST接口进行内部Google AppEngine查询

Google app engine 使用REST接口进行内部Google AppEngine查询,google-app-engine,rest,Google App Engine,Rest,我已经开始为我的GoogleAppEngine应用程序编写RESTAPI。我读了一篇关于构建REST应用程序的好文章,其中建议我将数据服务封装在RESTAPI后面。考虑到这一点,如果原型获得了足够的吸引力,那么我愿意转向类似于AmazonWeb服务的体系结构,这种封装级别是有意义的 其思想是请求进入网页,应用服务器接受HTTP请求。然后应用服务器本身向数据库服务器发出HTTP REST请求,而不是直接通过数据存储对象。在GoogleAppEngine的例子中,它实际上是同一台服务器,但很容易更改

我已经开始为我的GoogleAppEngine应用程序编写RESTAPI。我读了一篇关于构建REST应用程序的好文章,其中建议我将数据服务封装在RESTAPI后面。考虑到这一点,如果原型获得了足够的吸引力,那么我愿意转向类似于AmazonWeb服务的体系结构,这种封装级别是有意义的

其思想是请求进入网页,应用服务器接受HTTP请求。然后应用服务器本身向数据库服务器发出HTTP REST请求,而不是直接通过数据存储对象。在GoogleAppEngine的例子中,它实际上是同一台服务器,但很容易更改实际响应数据请求的服务器(或服务器集群)

例如:

    • 导致应用服务器处理HTTP请求
    • app server从远程服务器调用数据
  • 应用服务器
    • 解析远程响应
    • 将数据插入HTML模板
    • 将结果返回给客户端
  • 注意:这不包括任何缓存


    这意味着,对于单个客户端HTTP请求,我可能会发出4-5个额外的HTTP请求来构建响应。这是一种架构模式,在Google AppEngine上还是在一般情况下都能很好地工作?Google是否以高效的方式处理内部请求(appserver实例appserver实例)?

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

    考虑到某些AppEngine资源(如URLFetch)有固定的限制,这些资源可能会迅速耗尽。此外,可计费的资源,如CPU时间、传入带宽和传出带宽,都将以比实际需要快得多的速度使用

    此外,它极大地限制了AppEngine应用程序的扩展能力。事实上,这是一个负反馈回路。随着外部请求数量的增加,应用程序的负载将急剧增加。这与AppEngine应用程序应该实现的目标相反


    最后,我认为这对于任何平台上的应用程序来说都是一个可疑的体系结构,而不仅仅是AppEngine。软件工程师很容易爱上抽象,为了模块化、可移植性、松散耦合等价值观而一层一层地产生抽象——这一列表层出不穷。然而,任何出于抽象原因而做出的导致性能非常真实和显著下降的决策都是事实上的反模式。

    首先,从架构角度来看,在存储上构建REST数据访问层是可以的,例如,请参见Microsoft的Azure文档

    在移动到应用程序引擎之外并通过urlfetch进行查询时,您自然会遇到某种性能问题。我建议在采取行动之前,先比较一下datastore和urlfetch上的账单


    如果您确实创建了一个DAL来对远程数据库进行这些REST调用,那么就没有理由实际对GAE数据存储进行URLEFETCH。只需编写一个应用程序引擎提供商,直接使用数据存储API调用这些DB

    我会犹豫是否建议开发人员使用自己的基于REST的DAL,仅仅因为Microsoft使用Azure。我发现微软很可能有很多非常聪明的人致力于确保端到端it的全面性能。对于一个人来说,要想出一个经过充分调整以避免成为瓶颈的实现要困难得多。我当时在想,我的数据将放在一个单独的EC2实例上,其中一个快速内部IP地址将使用REST DAL公开。这样,我就不需要更改用于访问数据的应用程序代码——我只需将它指向新数据实例的IP地址并编写一个访问层(可能由一个合适的db而不是NoSQL支持)。如果我不清楚,我很抱歉。我并不是建议您构建自己的REST数据存储。。。因为这不是问题。我指出Azure API是一个参考示例,说明了包装器DAL需要处理什么。当然,在迁移时,这个DAL包装器是唯一需要更改的东西。现在,考虑到你的包装器API公开了你需要的方法,我看不到在你的GAE数据存储上增加REST层的好处,也看不到直接调用它的好处…我在谷歌的收费明细中没有看到任何url获取的成本:。。。只需输入/输出带宽和CPU时间。我想知道内部请求(在同一个应用程序中发起和终止)是否会增加传入/传出带宽…@James,你是对的,URLFetch不是计费配额的一部分;它是固定的。不过,这对您的体系结构来说是一个更大的负担。我编辑了我的答案,以更准确地反映计费/非计费资源。当我查看固定配额时,它们大约是每秒500个请求和每分钟3000个URLfetch调用。我觉得如果我达到这样的流量水平,我将是过渡到EC2或类似版本的主要途径。我不认为配额是限制因素,但我对延迟和效率感兴趣。我这样做的原因是为了实现更简单的迁移(避免在我的应用程序代码中出现太多或任何数据存储逻辑),并为我提供一个扩展数据库的清晰路径(负载平衡http请求对于大部分将被读取的数据库是有意义的)。这将花费您大量的延迟,这将使应用程序对用户的响应大大降低,而且,如果不需要向自己发出HTTP请求,它也不会为您带来任何在代码中使用架构抽象无法做到的东西。