InfoQ

新闻

Google App Engine增加了Java支持:喜忧参半

作者 Scott Delap 译者 张龙 发布于 2009年4月17日 上午12时2分

社区
Java
主题
云计算,
集群与缓存

除了Python以外,Google App Engine(GAE)又增加了Java支持,这对Java生态圈相关的工具、框架及语言(像JRuby和Clojure)都产生了很大的影响。然而这么做的结果将对GAE Java应用造成很多限制,使其无法轻松扩展和集成这些应用。Google官方博客对此说到:

...我们想给开发者一些惊喜,但深知必须要将Google App Engine的简单性与Java平台的强大功能及灵活性结合起来,同时我们还想利用App Engine的基础设施,尽量去扩展这些内容,但又要保持与现有的Java标准和工具的兼容性。

我们就是这么做的。现在App Engine对标准(这些标准对Java工具起到了至关重要的作用)提供了支持(我们也从事着工具的开发——Google Plugin for Eclipse),它使用标准(如Java Servlet API、JDO、JPA、javax.cache及javax.mail)对当前的App Engine API进行了包装,同时还提供了足够强大的安全的沙箱,这样你的代码就可以安全地运行在Google Server上而又不会丧失灵活性...

CNet注意到GAE运行的是Java 6。但就像上面提到的,Java要想融入到GAE模型上还不是那么容易的事情,因为限制实在太多。GAE Java基于Java 2.4 Servlet API:

  • 一旦请求发送到客户端就无法进行进一步的处理了,包括数据流。
  • 请求在30秒内没有完成就会被终止,此时会抛出异常。如果没有捕获该异常,那么用户就会看到一个500错误。

再往上就是几个沙箱限制了:

  • 应用无法对文件系统进行写操作,必须要通过App Engine datastore才行。
  • 应用可能不会打开socket。
  • 应用无法创建自己的线程,也无法使用一些辅助工具,如计时器。

java.lang.System有如下限制:

  • exit()、gc()、runFinalization()及runFinalizersOnExit()什么都不做
  • 不允许进行JNI访问。

除此以外,还有其他一些限制,如JRE类加载的白名单等等。从文档来看,GAE通过自定义的类装载器对此作了很好的处理,然而应该让其他应用级的类装载器也可以处理上面这些限制,这是一个不足之处。

接下来的问题是上面这些限制能给GAE应用带来什么好处呢?首先就是可伸缩性。App Engine使用多个Web Server运行应用并能自动调整所使用的服务器数量。它可以将到来的请求路由到任意的服务器上,而该服务器很可能并不是处理该用户前一个请求的那个服务器。以下内容来自于文档:

...一个应用可以同时处理大约30个动态请求,这意味着平均的服务器请求处理时间为75毫秒的应用可以处理(1000 ms/second / 75 ms/request)*30=400 requests/second的请求量而不会出现延时。CPU处理密集的应用可能会在长时间的请求中出现延时,这是为了让其他应用可以共享同一个服务器。对静态文件的请求不会受到该限制的影响...

Google还提供了一个BigTable版的JPO和JPA以及Google Plugin for Eclipse,以此简化GAE的开发。

尽管还处在开发当中,但Google已经让为数不少的开发者试用GAE的Java支持了。Paul Hammant说到

...还要注意来自于同一客户端的多个并发请求也不一定会被同一个Servlet容器处理。即使来自于同一个域名(没有资源转发的情况出现),响应请求的Servlet容器实例也很可能是不同的。对于无状态应用来说这没什么问题,但对于那些利用session存储属性的应用来说就会出现并发问题了:向同一个资源写两次...

...Google已经实现了一个完善的沙箱。毋庸置疑,这会防止恶意代码的侵袭...而XStream是Java社区所推崇的一个工具,其最新版为1.3.1,但它却在GAE初始化时抛出异常。

其他一些工程师正在着手ClojureJRubyGroovy的支持开发工作,而ThoughtWorks的Ola Bini则在其博客上详述了GAE对动态语言的处理。

查看英文原文:Google Brings App Engine's Pros and Cons to Java

喜悦远大于忧虑 发表人 Alan Wu 发表于 2009年4月17日 上午1时17分
Re: 喜悦远大于忧虑 发表人 Heston Lee 发表于 2009年4月17日 上午7时55分
翻译的水平真的无语了 发表人 asdt asdytadty 发表于 2009年4月17日 下午7时24分
Re: 翻译的水平真的无语了 发表人 long zhang 发表于 2009年4月17日 下午11时53分
Re: 翻译的水平真的无语了 发表人 yazhou li 发表于 2009年4月18日 上午4时29分
Re: 翻译的水平真的无语了 发表人 long zhang 发表于 2009年4月18日 上午7时20分
  1. 返回顶部

    喜悦远大于忧虑

    2009年4月17日 上午1时17分 发表人 Alan Wu

    GAE的这些限制对于大多数对性能要求不高的应用来说都不成大问题

    只是希望JAVA社区能保持一致,不要因为GOOGLE加入而引起兼容性问题。

  2. 返回顶部

    Re: 喜悦远大于忧虑

    2009年4月17日 上午7时55分 发表人 Heston Lee

    自说自话, 如果你要用到这些,你就不会这么说了

  3. 返回顶部

    翻译的水平真的无语了

    2009年4月17日 下午7时24分 发表人 asdt asdytadty

    Google已经实现了一个完善的沙箱。毋庸置疑,这会防止恶意代码的侵袭...XStream是Java社区所推崇的一个工具,其最新版为1.3.1,它会在GAE抛异常时进行初始化。
    原文的意思是:
    xstream运行在GAE上面,初始化时会抛异常。XStream is one that is particularly beloved of a section of the Java community. The latest version is 1.3.1 and on initialization anywhere within the realm of GAE is throws exceptions. These are security exceptions that cause the entire app to not function. Exceptions have a way of curtailing the fun of running code. In the case of XStream it is possible to fix it to be compatible with GAE (and all security constrained environments).

  4. 返回顶部

    Re: 翻译的水平真的无语了

    2009年4月17日 下午11时53分 发表人 long zhang

    你好,此文是我翻译的。对于你所说的原文这块我觉得本身语法就有些问题,拿捏了很久,如果翻译错误的话最主要的原因还在于对XStream不甚了解,不管怎样,谢谢你的指出。如有进一步的信息可以与我联系:zhanglong217@yahoo.com.cn

  5. 返回顶部

    Re: 翻译的水平真的无语了

    2009年4月18日 上午4时29分 发表人 yazhou li

    xstream是thoughtworks公司的一个java转XML的一个工具,按照原文的意思应该是stream在GAE初始化的时候会出异常。

  6. 返回顶部

    Re: 翻译的水平真的无语了

    2009年4月18日 上午7时20分 发表人 long zhang

    ok,已经更新了,多谢指正!

深度内容

模块化Java:声明式模块化

本文是模块化Java系列文章的第4篇,介绍的是声明式模块化。文中描述了组件如何以声明的方式来定义并组织在一起,而无需让代码依赖于OSGI API。

Ian Robinson和Jim Webber谈论基于Web的整合

本采访是在伦敦举行的QCon2009上记录的,Ian Robinson和Jim Webber探讨了如何将Web作为整合平台以及REST在理论上和实践中的好处。

项目管理修炼之道(精选版)

项目管理对于项目成败至关重要,但实践中每个项目都有自己的独特性,没有现成的解决方案可以套用。书中从应对实际风险的角度出发,讲述了从项目启动、项目规划到项目结束的整个管理流程,展示了作者的思考过程。本迷你书从原书中精选出5个章节。

那是鸟,还是飞机?不,那是超人!

在这个演讲中,Fred将会揭示敏捷的一些外在因素,并会重点关注敏捷获得成功的内在原因。从案例研究和真实的项目经验来看,Fred认为:工具、管理体系都不能让你变得敏捷。敏捷的成功,植根于士气高涨、充分授权的工作者身上,他们能够以不同以往的方式思考问题。

访谈和书摘:Eben Hewitt的新书《Java SOA Cookbook》

Java SOA Cookbook

Eben Hewitt的新书《Java SOA Cookbook》从Java实现的角度讨论了面向服务架构。Eben在书中讨论了SOA基础、工具、最佳实践和SOA治理等主题。

Mark Richard的《Java消息服务》第二版

Mark Richards的新书《Java消息服务》第二版覆盖了JMS的许多主题, 包括发布和订阅模式以及点对点模式,消息过滤和事务等。InfoQ与Mark谈论了跟他的新作。

模块化Java:动态模块化

本文是“模块化Java”系列文章的第三篇,讨论动态模块化,内容涉及如何解析bundle类、bundle如何变化、以及bundle之间如何通信。

让测试也敏捷起来

对于测试组织来说,敏捷方法带来的快速迭代却让测试本身变得困难起来:缺乏“足够详细的文档”,缺乏“仔细设计用例的时间”等等。在本演讲中,段念将与大家探讨如何在敏捷过程中进行测试。