运行时环境(The Runtime Environment)

By | 07月13日
Advertisement

App Engine应用响应网络请求。当一个客户端(典型的是用户的Web浏览器)使用HTTP请求(比如获取在URL上的网页)连接上应用的时候,网络请求就开始了。当App Engine接收到请求时,它会从地址的域名中识别应用,.appspot.com子域名(为每个应用免费提供的)或你在Google Apps中已经注册创建了的自定义的子域名。App Engine从众多可能的服务中选择一个服务来处理这个请求。选择的依据是哪个服务最可能提供一个快速的响应。然后它使用Http请求的内容调用应用,从应用中获取响应的数据,并且将响应返回给客户端。

从应用的角度看(perspective),这个运行时环境在请求处理开始的时候存在(spring into existence),在请求处理结束时消失。App Engine提供了几种在请求之间保存数据的方法,但是这些机制在运行时环境之外存在(live outside of the runtime environment)。在运行时环境中请求之间的状态不保留,或者至少不希望在请求之间保留状态,App Engine可以在众多的需要用的服务间分发流量来给予每个请求相同的对待,而不管它一次处理的流量是多少。

从全局来看(in the complete picture),App Engine 允许运行时环境在请求处理之后还存在,并且尽可能地重用环境来避免不必要的初期化。你的应用的每个实例都拥有本地内存来缓存导入的代码和初期化的数据结构。App Engine会按需创建或销毁实例来适应你的应用的流量(traffic)。如果你允许多线程的特性,那么一个实例可以充分利用它的资源并发地处理多个请求。

传统意义上,应用代码不能访问运行它的服务器。一个应用可以从文件系统中读取它自己的文件。但是不能向文件中写,也不能读取属于其他应用的文件。应用可以看到App Engine设置的环境变量,这些变量的操纵在请求之间没有必要继续存在。尽管应用可以使用服务来执行网络操作,但是应用不能访问服务器硬件的网络设备。

总之,每个请求存在于它自己的沙箱中。这允许App Engine使用最快的响应服务器来处理这个请求(估算的)。对于我们的向这个应用发出的请求,无法保证同一个应用实例来处理两个请求,尽管这些请求来自于同一个客户端并且都相对很快地到达了。

沙箱也允许App Engine在同一个服务器上运行多个应用而不会出现一个应用影响另一个应用。除了限制对操作系统的访问,运行时环境也限制了时钟的数量以及一个请求可以得到的内存。App Engine使得这些限制有伸缩性,并且对应用使用了更严格的限制,防止应用耗尽资源来保护共享资源。

一个请求处理器(request handler)最多有60秒(up to 60s)的时间将响应返回给客户端。尽管看上去对于一个Web应用来讲这是相当多的,但是App Engine还是会优化应用使其响应时间小于1秒。并且(also),如果一个应用使用了很多的CPU周期的话,App Engine 可能会使它慢下来,那么在提供多个应用的机器上这个应用不会强占处理器(processor)。对于一个CPU密集型的请求处理器,如果它需要很多的处理的话会使用比本来更多的时钟时间(clock time)。当App Engine侦查出CPU的使用方式时时钟时间会响应地改变,分配。(A CPU-intensive request handler may take more clock time to complete than it would if it had expensive use of the processor,and clock time may vary as App Engine detects patterns in CPU usage and allocates accordingly)

Google App Engine为应用提供了三种可用的运行时环境:Java 环境,Python环境,Go环境(Google开发的新的系统语言)。你选择的环境取决于你开发应用使用的语言和相关的技术。

Java环境在Java 6 VM上运行应用。一个应用可以使用Java语言开发,或者大部分其他的可以在JVM上编译或运行的语言,比如PHP(使用Quercus),Ruby(使用JRuby),JavaScript(使用Rhino 解释器),Scala,Groovy和Clojure。应用使用基于Web工业标准的接口访问环境和服务,包括Java Servlets和Java Persistence API (JPA)。任何在沙箱约束中起作用的Java技术都可以在App Engine中运行,使得许多存在的框架和库适用于它。尤其是,App Engine完全支持Google Web Tookit(GWT),一个富Web应用程序框架,使我们可以用Java语言写所有的应用代码(包括在浏览器中运行的用户接口),并且使富图形应用能够在绝大多数浏览器上工作而不需要插件。

Python环境运行由Python2.7编程语言编写的应用,使用自定义的CPython版本,官方的Python解释器。App Engine使用WSGI调用Python 应用,一个广泛使用的应用接口标准。应用可以使用大部分Python的大型的杰出的标准库,以及访问服务和模型数据(modeling data)的富APIs和库。许多开源的Python web应用框架和App Engine一起工作,比如Django,web2py,Pyramid,Flask。App Engine 甚至有一个自己的叫做webapp的轻量级的框架。

这三个运行时环境使用相同的应用服务模型:一个请求路由到app server,应用实例初期化(必要的话),应用代码被调用来处理这个请求,生成响应,响应返回客户端。每个环境都在沙箱约束中运行应用代码,所以任何使用语言本身或某个库来访问沙箱以外的东西都会返回一个错误。

你可以配置实例的创建、销毁和初期化的任何一个方面。如何配置应用取决于花费与性能之间的平衡点。如果倾向于性能,就可以多配置一些运行的实例。开启多个实例处理需要。如果预算有限就调整限制,使用最少的实例来控制请求的排队等候。(if you have a limited budget,you can adjust the limits that control how requests queue up to use a minimum number of instances)

现在还没有说到任何关于App Engine使用的操作系统和硬件配置。有办法知道一个服务器使用的操作系统和硬件,不过这是没有必要的:运行时环境是操作系统之上的一个抽象。允许App Engine管理资源的分配、计算、请求处理、规模扩大(scaling)、负载分布而没有应用的参与。那些需要用到操作系统的特性是由运行环境之外的服务提供,由标准库的调用来提供或仿真,或者在沙箱的定义中以理智的方法(in sensible way)限制。

上述内容描述了App Engine会根据应用的流量动态地分配应用实例来扩展。你也可以在指定的手动分配的实例上运行代码,这些实例就是backends(or simply,"servers")。这些指定的实例十分适合于后台作业和自定义服务,有它们自己的参数来执行代码(have their own parameters for how they execute code)。然而它们不会自动扩展(scale)。当达到了一个服务器的容量时,它根据你的代码来决定下面怎么做。Backends是App Engine的一个新特性,这个体系结构正在演化。在这个版本的书中不会详细谈及这个特性。

Similar Posts:

  • JRE(Java运行时环境)和windows装载JVM

    上次简单说明了JDK,JRE和JVM的概念,这次说一下java程序从源码到可执行机器码的过程 先看一个简单的流程图(来自 http://baike.baidu.com/picview/160708/160708/0/ac75478285acf3b90cf4d213.html#albumindex=0&picindex=5) 其中从java源代码到java字节码的详细编译过程看下图(来自 http://baike.baidu.com/picview/160708/160708/0/ac754782

  • Java运行时环境JPEGImageWriter.writeImage函数整数溢出漏洞_

    在使用PDFBOX的接口,代码如下: PDFImageWriter imageWriter = new PDFImageWriter(); imageWriter.writeImage(pdDoc, imageType, null, startPage, endPage, imageFilePath, 1, Constants.NUM_TWO_HUNDRED),发现图片生成了,但是报内存溢出错误.后面看了下源代码搜寻相关资料发现存在这样一个问题,所以更换JDK就OK了. Java运行时环境的JP

  • ActionScript 3 Cookbook 中文版 第三章. 运行时环境

    第三章. 运行时环境 第 1 页 共 17 页 第三章. 运行时环境 3.0.简介 3.1.检测播放器版本 3.2.检测操作系统 3.3.检测播放器类型 3.4.检测系统语言 3.5.检测显示设置 3.6.缩放影片 3.7.改变对齐方式 3.8.隐藏Flash播放器的菜单项 3.9.检测设备音频 3.10.检测设备视频 3.11.提示用户改变播放器设置 3.12.处理系统安全 ActionScript 3 Cookbook 中文版 第三章. 运行时环境 第 2 页 共 17 页 3.0. 简介

  • 如何安装和配置 DB2 V8.1 for Linux 和 Java 运行时环境

    如何安装和配置 DB2 V8.1 for Linux 和 Java 运行时环境 http://www-900.ibm.com/developerWorks/cn/linux/linux-speed-start/l-ss3-db2/index.shtml

  • PostgreSQL数据库学习手册之服务器运行时环境(转)

    PostgreSQL数据库学习手册之服务器运行时环境(转)[@[email protected]] Chapter 3. 服务器运行时环境 Table of Contents 3.1. PostgreSQL 用户帐户 3.2. 创建数据库集群 3.3. 启动数据库服务器 3.3.1. 服务器启动失败 3.3.2. 客户端联接问题 3.4. 运行时配置 3.4.1. pg_settings 3.4.2. 规划器和优化器调节 3.4.3. 日志和调试 3.4.4. 一般操作 3.4.5. WAL 3.4.6. 短选项 3.

  • [置顶] iOS运行时编程-使用runtime方法给一个类添加属性

    看过一些第三方开源类库的源代码,经常发现他们 给一个 类 添加了一个原本不存在的属性, 比如PPrealSideController 就给 UIViewController添加了一个 self.pprealSideController的属性? 他是如何实现的呢? 1.基本的实现思路 首先我们需要了解,实际上 在我们使用 类似于self.newProperty的语句的时候, 根据点语法的规则实际上是调用的 setNewProperty方法,和 newProperty方法, 那我们可以知道他肯定是给

  • 自定义注解之运行时注解(RetentionPolicy.RUNTIME)

    对注解概念不了解的可以先看这个:Java注解基础概念总结 前面有提到注解按生命周期来划分可分为3类: 1.RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃: 2.RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期: 3.RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在: 这3个生

  • TMS320C6000 C/C++运行时环境笔记

    一.存储器模型 C6000编译器把整个存储区当作单个线性存储块,并将其分配为代码区和数据区,一个C程序产生的代码和数据被放在各自连续的存储空间中,编译器假定存储器的32位地址空间都是可用的,但需要注意的是,连接器才是最终决定存储器映像(定义存储器映像并将代码和数据分配到目标存储器的是连接器,)编译器不对可用的存储器作任何假设,也不关心哪个地址不能被代码或者数据占用,以用哪些地址是保留给I/O设备或控制寄存器. 1.段: 编译器生成的可重定位的代码块和数据块称为段,系统设置不同,段分配到存储器的方

  • ICE运行时环境备忘三

    1.ICE是一个多线程的运行环境,每个communicator通信器中都有一个Leader-Follower的线程池负责处理客户端的服务请求, ICE的线程池有一系列的属性用以来控制线程池的运行,主要包含如下内容: ThreadPoolName.Size = 3 # 线程池初始线程个数3个,注意默认大小1个 ThreadPoolName.SizeMax = 10 # 线程池最大线程个数10个,注意默认大小1个,大于等于初始大小 ThreadPoolName.sizeWarn = 8 # 线程池告

  • 搭建java运行时环境之tomcat

    在官方下载: http://java.sun.com/javase/download/ 1 JDK安装 jdk1.6 tomcat7 chmod +x jdk-6u24-linux-x64.bin ./ jdk-6u24-linux-x64.bin 2 配置java环境 mv jdk-6u24 /usr/local/jdk vim /etc/profile添加环境变量 JAVA_HOME="/usr/local/jdk" CLASS_PATH="$JAVA_HOME/lib:

Tags: