Lingkungan Runtime Java 8

Dengan App Engine, Anda dapat membangun aplikasi web yang menggunakan infrastruktur dan layanan Google yang skalabel. App Engine menjalankan aplikasi web Anda menggunakan JVM Java 8. App Engine memanggil class servlet aplikasi Anda untuk menangani permintaan dan menyiapkan respons di lingkungan ini.

Platform App Engine menyediakan banyak layanan API bawaan yang dapat dipanggil oleh kode Anda. Aplikasi Anda juga dapat mengonfigurasi tugas terjadwal yang berjalan pada interval yang ditentukan.

Menentukan runtime Java 8 untuk aplikasi Anda

Agar aplikasi Anda menggunakan runtime Java 8, tambahkan baris berikut ke file appengine-web.xml:

<runtime>java8</runtime>

File appengine-api.jar yang disertakan dengan Google Cloud CLI pada platform/google_appengine/google/appengine/tools/java/lib/impl/appengine-api.jar mewakili App Engine API untuk Java. Anda juga dapat mengakses file ini menggunakan repositori Maven yang mencantumkan semua versi.

Pilih versi API yang digunakan aplikasi Anda dengan menyertakan JAR ini dalam direktori WEB-INF/lib/ aplikasi, atau gunakan Maven untuk menangani dependensi. Jika versi baru lingkungan runtime Java dirilis yang memperkenalkan perubahan yang tidak kompatibel dengan aplikasi yang sudah ada, lingkungan tersebut akan memiliki nomor versi utama baru.

Menggunakan Maven untuk menangani dependensi

Anda dapat menggunakan Maven untuk mengelola semua dependensi. Misalnya, entri pom.xml ini menyertakan App Engine API terbaru (Rappengine-api-1.0-sdk) yang tersedia dari Maven Central:

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

Sandbox

Runtime Java App Engine mendistribusikan permintaan untuk aplikasi di beberapa server web dan mencegah satu aplikasi mengganggu aplikasi lainnya. Aplikasi App Engine tidak boleh merespons dengan lambat. Permintaan web ke aplikasi harus ditangani dalam batas waktu tunggu permintaan. Proses yang melampaui batas respons ini akan dihentikan untuk menghindari kelebihan muatan pada server web.

Perhatikan bahwa satu-satunya tempat pengguna dapat menulis file adalah direktori /tmp. File di /tmp akan menggunakan memori yang dialokasikan untuk instance Anda. File yang disimpan di lokasi ini hanya tersedia untuk instance ini dan hanya selama masa aktif instance spesifik ini.

Cara biasa bagi aplikasi untuk mendapatkan file resource adalah memaketkan file yang Anda andalkan dengan aplikasi di bagian WEB-INF, lalu memuatnya dari aplikasi menggunakan Class.getResource(), ServletContext.getResource(), atau metode serupa. Secara default, semua file dalam WAR merupakan "file resource". Anda dapat mengecualikan file dari kumpulan ini menggunakan file appengine-web.xml.

Pengurutan JAR loader class

Terkadang, mungkin Anda perlu menentukan ulang urutan file JAR dipindai untuk class guna mengatasi konflik antara nama class. Dalam kasus ini, prioritas pemuatan dapat diberikan ke file JAR tertentu dengan menambahkan elemen <class-loader-config> yang berisi elemen <priority-specifier> di file appengine-web.xml. Contoh:

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

Tindakan ini menempatkan "mailapi.jar" sebagai file JAR pertama yang akan ditelusuri untuk class, kecuali class yang ada dalam direktori war/WEB-INF/classes/.

Jika beberapa file JAR diprioritaskan, urutan pemuatan aslinya (satu sama lain) akan digunakan. Dengan kata lain, urutan elemen <priority-specifier> itu sendiri tidak menjadi masalah.

Thread

Dengan runtime Java 8, Anda dapat membuat thread menggunakan ThreadManager API App Engine dan API bawaan Java, misalnya new Thread(). Saat ini, jika ingin memanggil API App Engine (com.google.appengine.api.*), Anda harus memanggil API tersebut dari thread permintaan atau dari thread yang dibuat menggunakan ThreadManager API.

Aplikasi dapat

Jika Anda membuat ThreadPoolExecutor dengan currentRequestThreadFactory(), shutdown() harus dipanggil secara eksplisit sebelum permintaan servlet selesai. Jika hal ini tidak dilakukan, permintaan tidak akan selesai dan server aplikasi pada akhirnya akan gagal. Perlu diketahui bahwa beberapa library dapat membuat ThreadPoolExecutors untuk Anda.

Aplikasi dapat menjalankan operasi terhadap thread saat ini, seperti thread.interrupt().

Setiap permintaan dibatasi hingga 50 thread permintaan App Engine API secara serentak.

Saat menggunakan thread, gunakan objek serentak tingkat tinggi, seperti Executor dan Runnable. Keduanya menangani banyak detail konkurensi yang halus tetapi penting seperti Interupsi serta penjadwalan dan pembukuan.

Jumlah maksimum thread latar belakang serentak yang dibuat oleh App Engine API adalah 10 per instance. (Batas ini tidak berlaku untuk thread Java reguler yang tidak terkait dengan App Engine API.)

Alat

IDE yang Didukung

Cloud Tools for Eclipse menambahkan wizard project baru dan konfigurasi debug ke Eclipse IDE untuk project App Engine. Anda dapat men-deploy project App Engine secara langsung ke produksi dari dalam Eclipse.

Cloud Tools for IntelliJ memungkinkan Anda menjalankan dan men-debug aplikasi App Engine di dalam IntelliJ IDEA. Anda dapat men-deploy project App Engine secara live ke produksi tanpa keluar dari IDE.

Alat build yang didukung

Untuk mempercepat proses pengembangan, Anda dapat menggunakan plugin App Engine untuk Apache Maven atau Gradle:

Server pengembangan lokal

Server pengembangan menjalankan aplikasi Anda di komputer lokal untuk pengembangan dan pengujian. Server menyimulasikan layanan Datastore. Server pengembangan juga dapat membuat konfigurasi untuk indeks Datastore berdasarkan kueri yang dilakukan aplikasi selama pengujian.

Konkurensi dan latensi

Latensi aplikasi Anda memiliki dampak terbesar pada jumlah instance yang diperlukan untuk melayani traffic Anda. Jika Anda memproses permintaan dengan cepat, satu instance dapat menangani banyak permintaan.

Instance thread tunggal dapat menangani satu permintaan serentak. Oleh karena itu, ada hubungan langsung antara latensi dan jumlah permintaan yang dapat ditangani pada instance per detik. Misalnya, latensi 10 md sama dengan 100 permintaan/detik/instance.

Instance multi-thread dapat menangani banyak permintaan serentak. Oleh karena itu, ada hubungan langsung antara CPU yang dipakai dan jumlah permintaan/detik.

Aplikasi Java mendukung permintaan serentak, sehingga satu instance dapat menangani permintaan baru sambil menunggu permintaan lain selesai. Konkurensi secara signifikan mengurangi jumlah instance yang dibutuhkan aplikasi, tetapi Anda perlu mendesain aplikasi untuk multithreading.

Misalnya, jika instance B4 (sekitar 2,4 GHz) menggunakan 10 Mcycles/permintaan, Anda dapat memproses 240 permintaan/detik/instance. Jika menggunakan 100 Mcycles/permintaan, Anda dapat memproses 24 permintaan/detik/instance. Angka-angka ini merupakan kasus yang ideal, tetapi cukup realistis dalam hal hal yang dapat Anda capai pada instance.

Rilis Java App Engine

Semua artefak yang dirilis yang dimulai dengan versi 2.x.x menggunakan mekanisme rilis open source. Artefak yang dirilis yang dimulai dengan versi 1.9.9xx atau sebelumnya akan menggunakan sistem build internal. Lihat repositori GitHub untuk mengetahui detail selengkapnya.

Variabel lingkungan

Variabel lingkungan berikut ditetapkan oleh runtime:

Variabel lingkungan Deskripsi
GAE_APPLICATION ID aplikasi App Engine Anda. ID ini diawali dengan 'region code~' seperti 'e~' untuk aplikasi yang di-deploy di Eropa.
GAE_DEPLOYMENT_ID ID deployment saat ini.
GAE_ENV Lingkungan App Engine. Tetapkan ke standard.
GAE_INSTANCE ID instance tempat layanan Anda saat ini berjalan.
GAE_RUNTIME Runtime yang ditentukan dalam file app.yaml Anda.
GAE_SERVICE Nama layanan yang ditentukan dalam file app.yaml Anda. Jika tidak ada nama layanan yang ditentukan, nama akan ditetapkan ke default.
GAE_VERSION Label versi layanan Anda saat ini.
GOOGLE_CLOUD_PROJECT ID project Google Cloud yang terkait dengan aplikasi Anda.
PORT Port yang menerima permintaan HTTP.

Anda dapat menentukan variabel lingkungan tambahan dalam file app.yaml, tetapi nilai di atas tidak dapat diganti.