App Engine을 사용하면 Google의 확장 가능한 인프라와 서비스를 사용하는 웹 애플리케이션을 빌드할 수 있습니다. App Engine은 자바 8 JVM을 사용하여 웹 애플리케이션을 실행합니다. App Engine은 앱의 서블릿 클래스를 호출하여 이 환경에서 요청을 처리하고 응답을 준비합니다.
App Engine 플랫폼은 코드에서 호출할 수 있는 다양한 기본 제공 API 서비스를 제공합니다. 애플리케이션에서 지정된 간격으로 실행되는 예약된 작업을 구성할 수도 있습니다.
앱에 자바 8 런타임 지정하기
애플리케이션에서 자바 8 런타임을 사용하도록 설정하려면 appengine-web.xml
파일에 다음 줄을 추가합니다.
<runtime>java8</runtime>
platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar
아래의 Google Cloud CLI와 함께 포함된 appengine-api.jar
파일은 자바용 App Engine API를 나타냅니다. 모든 버전이 나열된 Maven 저장소를 사용하여 이 파일에 액세스할 수도 있습니다.
이 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></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
IntelliJ용 Cloud Tools를 사용하면 IntelliJ IDEA 내에서 App Engine 애플리케이션을 실행 및 디버깅할 수 있습니다. 또한 IDE 내에서 App Engine 프로젝트를 실시간으로 프로덕션에 배포할 수 있습니다.
지원되는 빌드 도구
개발 프로세스의 속도를 높이기 위해 Apache Maven 또는 Gradle용 App Engine 플러그인을 사용할 수 있습니다.
로컬 개발 서버
개발 서버는 개발 및 테스트 목적으로 로컬 컴퓨터에서 애플리케이션을 실행합니다. 이 서버는 Datastore 서비스를 시뮬레이션합니다. 또한 개발 서버는 테스트 중에 앱이 수행하는 쿼리를 기반으로 Datastore 색인의 구성을 생성할 수 있습니다.
동시성 및 지연 시간
애플리케이션의 지연 시간은 트래픽을 처리하는 데 필요한 인스턴스 수에 가장 큰 영향을 줍니다. 요청을 신속하게 처리하면 단일 인스턴스로 많은 요청을 처리할 수 있습니다.
단일 스레드 인스턴스는 동시 요청 한 개를 처리할 수 있으므로 지연 시간과 초당 인스턴스에서 처리할 수 있는 요청 수 사이에는 직접적인 관계가 있습니다. 예를 들어 10ms 지연 시간은 100 요청/초/인스턴스에 해당됩니다.다중 스레드 인스턴스는 다수의 동시 요청을 처리할 수 있으므로, 소비된 CPU와 초당 요청 수 사이에는 직접적인 관계가 있습니다.
자바 앱은 동시 요청을 지원하므로 단일 인스턴스가 다른 요청이 완료될 때까지 기다리는 동안 새 요청을 처리할 수 있습니다. 동시 실행으로 인해 앱에 필요한 인스턴스 수가 상당히 줄어들지만 앱을 멀티 스레딩을 사용하도록 설계해야 합니다.
예를 들어 B4 인스턴스(약 2.4GHz)가 요청당 10Mcycle을 소비하는 경우 인스턴스별로 초당 요청 240개를 처리할 수 있습니다. 인스턴스가 요청당 100Mcycle을 소비하는 경우, 초 및 인스턴스당 요청 24개를 처리할 수 있습니다. 이러한 수치는 이상적인 경우이지만 하나의 인스턴스에서 달성할 수 있는 결과라는 측면에서 상당히 현실적입니다.
App Engine 자바 출시 버전
2.x.x
버전으로 시작하는 모든 출시 아티팩트는 오픈소스 출시 메커니즘을 사용합니다. 1.9.9xx
이전 버전으로 시작하는 출시 아티팩트는 내부 빌드 시스템을 사용합니다. 자세한 내용은 GitHub 저장소를 참조하세요.
환경 변수
다음 환경 변수는 런타임에서 설정됩니다.
환경 변수 | 설명 |
---|---|
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 |
애플리케이션과 연결된 Google Cloud 프로젝트 ID입니다. |
PORT |
HTTP 요청을 수신하는 포트입니다. |
app.yaml
파일에 추가 환경 변수를 정의할 수 있지만 위의 값을 재정의할 수 없습니다.