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.86</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를 사용하여 생성된 스레드에서 호출해야 합니다.
애플리케이션은 다음을 수행할 수 있습니다.
java.lang.Runnable
을 구현합니다.com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
를 호출하여 스레드 팩토리를 만듭니다.- 팩토리의
newRequestThread
메서드를 호출하여Runnable
,newRequestThread(runnable)
에서 전달하거나com.google.appengine.api.ThreadManager.currentRequestThreadFactory()
에서 반환되는 팩토리 객체를ExecutorService
와 함께 사용합니다(예:Executors.newCachedThreadPool(factory)
호출).
currentRequestThreadFactory()
와 함께 ThreadPoolExecutor
를 만드는 경우 서블릿 요청이 완료되기 전에 shutdown()
을 명시적으로 호출해야 합니다. 그렇지 않으면 요청이 완료되지 않으며 앱 서버가 실패합니다.
일부 라이브러리는 ThreadPoolExecutor를 생성할 수 있습니다.
애플리케이션은 thread.interrupt()
와 같은 현재 스레드에 대해 작업을 수행할 수 있습니다.
각 요청은 50개의 동시 App Engine API 요청 스레드로 제한됩니다.
스레드를 사용할 때는 Executor
및 Runnable
과 같은 높은 수준의 동시성 객체를 사용하세요. 이러한 객체는 중단, 일정 예약 및 부기와 같이 까다롭지만 중요한, 동시성을 갖는 여러 세부정보를 처리합니다.
도구
지원되는 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
파일에 추가 환경 변수를 정의할 수 있지만 위의 값을 재정의할 수 없습니다.