Google App Engine增加了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初始化时抛出异常。

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

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

你可能感兴趣的:(Google App Engine增加了Java支持:喜忧参半)