자바 8 런타임 환경

App Engine을 사용하면 Google의 확장 가능한 인프라와 서비스를 사용하는 웹 애플리케이션을 빌드할 수 있습니다. App Engine은 자바 8 JVM을 사용하여 웹 애플리케이션을 실행합니다. App Engine은 앱의 서블릿 클래스를 호출하여 이 환경에서 요청을 처리하고 응답을 준비합니다.

App Engine 플랫폼은 코드에서 호출할 수 있는 다양한 기본 제공 API 서비스를 제공합니다. 애플리케이션에서 지정된 간격으로 실행되는 예약된 작업을 구성할 수도 있습니다.

앱에 자바 8 런타임 지정하기

애플리케이션에서 자바 8 런타임을 사용하도록 설정하려면 appengine-web.xml 파일에 다음 줄을 추가합니다.

<runtime>java8</runtime>

이렇게 하면 이전에 자바 7 런타임을 사용한 기존 App Engine 애플리케이션을 자바 8 런타임에서 실행할 수 있습니다.

자바용 App Engine API는 Cloud SDK의 일부로 App Engine SDK와 함께 포함된 appengine-api-*.jar로 표시됩니다. 여기서 *는 API 및 App Engine SDK의 버전을 나타냅니다.

이 JAR을 애플리케이션의 WEB-INF/lib/ 디렉터리에 포함시켜 애플리케이션이 사용하는 API 버전을 선택하거나 Maven을 사용하여 종속 항목을 처리합니다. 기존 앱과 호환되지 않는 변경사항을 포함한 새 버전의 자바 런타임 환경이 출시될 경우, 이 환경에는 새로운 주 버전 번호가 부여됩니다.

Maven을 사용하여 종속 항목 처리

Maven을 사용하여 모든 종속 항목을 관리할 수 있습니다. 예를 들어 이 pom.xml 항목에는 Maven Central에서 제공하는 최신 App Engine API(Rappengine-api-1.0-sdk)가 포함되어 있습니다.

<dependency>
    <groupId>com.google.appengine</groupId>
    <artifactId>appengine-api-1.0-sdk</artifactId>
    <version>1.9.88</version>
</dependency>

샌드박스

App Engine 자바 런타임은 애플리케이션에 대한 요청을 여러 웹 서버로 분산하고 애플리케이션 간에 간섭이 발생하지 않도록 합니다. App Engine 앱의 응답 속도는 느려서는 안 됩니다. 애플리케이션에 대한 웹 요청은 요청 제한 시간 한도 내에서 처리되어야 합니다. 이 응답 한도를 초과하는 프로세스는 웹 서버 과부하를 막기 위해 종료됩니다.

사용자가 파일을 쓸 수 있는 유일한 위치는 /tmp 디렉터리입니다. /tmp의 파일은 인스턴스에 할당된 메모리를 사용합니다. 이 위치에 저장된 파일은 이 인스턴스만 사용할 수 있으며, 이 특정 인스턴스의 수명 동안만 사용할 수 있습니다.

애플리케이션이 리소스 파일을 가져오는 일반적인 방법은 사용하는 파일을 WEB-INF에 있는 애플리케이션과 함께 패키징한 다음 Class.getResource(), ServletContext.getResource() 또는 비슷한 메서드를 사용하여 앱에서 로드하는 것입니다. 기본적으로 WAR에 있는 모든 파일은 '리소스 파일'입니다. appengine-web.xml 파일을 사용하여 여기에서 파일을 제외시킬 수 있습니다.

클래스 로더 JAR 순서 지정

때로는 클래스 이름 간의 충돌을 해결하기 위해 클래스를 찾기 위해 JAR 파일을 검색하는 순서를 다시 정의해야 할 수도 있습니다. 이러한 경우, appengine-web.xml 파일에서 <priority-specifier> 요소를 포함하는 <class-loader-config> 요소를 추가하여 특정 JAR 파일에 로드 우선 순위를 부여할 수 있습니다. 예를 들면 다음과 같습니다.

<class-loader-config>
  <priority-specifier filename="mailapi.jar"/>
</class-loader-config>

이 명령어는 war/WEB-INF/classes/ 디렉터리에 있는 파일은 제외시키고 'mailapi.jar'를 클래스를 검색할 첫 번째 JAR 파일로 지정합니다.

여러 개의 JAR 파일에 우선 순위가 지정되면 (서로에 대해) 원래 로드 순서가 사용됩니다. 즉, <priority-specifier> 요소 자체의 순서는 중요하지 않습니다.

스레드

자바 8 런타임을 사용하면 App Engine의 ThreadManager API 및 자바의 내장 API(예: new Thread())를 사용하여 스레드를 생성할 수 있습니다. 현재 App Engine API(com.google.appengine.api.*)를 호출하려면 요청 스레드 또는 ThreadManager API를 사용하여 생성된 스레드에서 호출해야 합니다.

애플리케이션은 다음을 수행할 수 있습니다.

currentRequestThreadFactory()와 함께 ThreadPoolExecutor를 만드는 경우 서블릿 요청이 완료되기 전에 shutdown()을 명시적으로 호출해야 합니다. 그렇지 않으면 요청이 완료되지 않으며 앱 서버가 실패합니다. 일부 라이브러리는 ThreadPoolExecutor를 생성할 수 있습니다.

애플리케이션은 thread.interrupt()와 같은 현재 스레드에 대해 작업을 수행할 수 있습니다.

각 요청은 50개의 동시 App Engine API 요청 스레드로 제한됩니다.

스레드를 사용할 때는 ExecutorRunnable과 같은 높은 수준의 동시성 객체를 사용하세요. 이러한 객체는 중단, 일정 예약 및 부기와 같이 까다롭지만 중요한, 동시성을 갖는 여러 세부정보를 처리합니다.

App Engine API에서 생성되는 동시 백그라운드 스레드의 최대 개수는 인스턴스별로 10개입니다. (이 한도는 App Engine API와 관련되지 않은 일반 자바 스레드에 적용되지 않습니다.)

도구

지원되는 IDE

Eclipse용 Cloud Tools는 App Engine 프로젝트용 Eclipse IDE에 새 프로젝트 마법사와 디버그 구성을 추가합니다. Eclipse 내에서 App Engine 프로젝트를 프로덕션 환경에 라이브로 배포할 수 있습니다.

IntelliJ용 Cloud Tools를 사용하면 IntelliJ IDEA 내에서 App Engine 애플리케이션을 실행 및 디버깅할 수 있습니다. 또한 IDE 내에서 App Engine 프로젝트를 실시간으로 프로덕션에 배포할 수 있습니다.

지원되는 빌드 도구

개발 프로세스의 속도를 높이기 위해 Apache Maven 또는 Gradle용 App Engine 플러그인을 사용할 수 있습니다.

로컬 개발 서버

개발 서버는 개발 및 테스트 목적으로 로컬 컴퓨터에서 애플리케이션을 실행합니다. 이 서버는 Datastore 서비스를 시뮬레이션합니다. 또한 개발 서버는 테스트 중에 앱이 수행하는 쿼리를 기반으로 Datastore 색인의 구성을 생성할 수 있습니다.

AppCfg

AppCfg는 자바용 App Engine SDK에 포함되어 있습니다. 이 도구는 App Engine에서 실행되는 애플리케이션과의 명령줄 상호 작용을 처리하는 다용도 도구입니다. AppCfg는 App Engine에 애플리케이션을 업로드하거나 Cloud Datastore 색인 구성만 업데이트할 수 있으므로 코드를 업데이트하기 전에 새 색인을 작성할 수 있습니다. 또한 앱의 로그 데이터를 다운로드할 수도 있으므로 자체 도구를 사용하여 앱의 성능을 분석할 수 있습니다.

동시성 및 지연 시간

애플리케이션의 지연 시간은 트래픽을 처리하는 데 필요한 인스턴스 수에 가장 큰 영향을 줍니다. 요청을 신속하게 처리하면 단일 인스턴스로 많은 요청을 처리할 수 있습니다.

단일 스레드 인스턴스는 동시 요청 한 개를 처리할 수 있으므로 지연 시간과 초당 인스턴스에서 처리할 수 있는 요청 수 사이에는 직접적인 관계가 있습니다. 예를 들어 10ms 지연 시간은 100 요청/초/인스턴스에 해당됩니다.

다중 스레드 인스턴스는 다수의 동시 요청을 처리할 수 있으므로, 소비된 CPU와 초당 요청 수 사이에는 직접적인 관계가 있습니다.

자바 앱은 동시 요청을 지원하므로 단일 인스턴스가 다른 요청이 완료될 때까지 기다리는 동안 새 요청을 처리할 수 있습니다. 동시 실행으로 인해 앱에 필요한 인스턴스 수가 상당히 줄어들지만 앱을 멀티 스레딩을 사용하도록 설계해야 합니다.

예를 들어 B4 인스턴스(약 2.4GHz)가 요청당 10Mcycle을 소비하는 경우 인스턴스별로 초당 요청 240개를 처리할 수 있습니다. 인스턴스가 요청당 100Mcycle을 소비하는 경우, 초 및 인스턴스당 요청 24개를 처리할 수 있습니다. 이러한 수치는 이상적인 경우이지만 하나의 인스턴스에서 달성할 수 있는 결과라는 측면에서 상당히 현실적입니다.

환경 변수

다음 환경 변수는 런타임에서 설정됩니다.

환경 변수 설명
GAE_APPLICATION App Engine 애플리케이션 ID입니다. 이 ID는 유럽에 배포된 애플리케이션의 'e~'와 같이 'region code~'로 시작됩니다.
GAE_DEPLOYMENT_ID 현재 배포 ID입니다.
GAE_ENV App Engine 환경입니다. standard로 설정합니다.
GAE_INSTANCE 서비스가 현재 실행되고 있는 인스턴스 ID입니다.
GAE_RUNTIME app.yaml 파일에 지정된 런타임입니다.
GAE_SERVICE app.yaml 파일에 지정된 서비스 이름입니다. 서비스 이름을 지정하지 않으면 default로 설정됩니다.
GAE_VERSION 서비스의 현재 버전 라벨입니다.
GOOGLE_CLOUD_PROJECT 애플리케이션과 연결된 Cloud 프로젝트 ID입니다.
PORT HTTP 요청을 수신하는 포트입니다.

app.yaml 파일에 추가 환경 변수를 정의할 수 있지만 위의 값을 재정의할 수 없습니다.