Anda dapat menggunakan warmup request untuk mengurangi latensi permintaan dan respons saat kode aplikasi sedang dimuat ke instance yang baru dibuat.
App Engine sering kali perlu memuat kode aplikasi Anda ke instance baru. Pemuatan instance dapat terjadi dalam situasi berikut:
- Saat Anda men-deploy ulang versi aplikasi.
- Saat instance baru dibuat karena beban dari permintaan yang melebihi kapasitas kumpulan instance yang sedang berjalan saat ini.
- Saat pemeliharaan dan perbaikan infrastruktur atau hardware fisik yang mendasarinya terjadi.
Pemuatan kode aplikasi Anda ke instance baru dapat menyebabkan permintaan pemuatan. Permintaan pemuatan dapat menyebabkan peningkatan latensi permintaan bagi pengguna, tetapi Anda dapat menghindari latensi ini menggunakan warmup request. Warmup request memuat kode aplikasi Anda ke dalam instance baru sebelum permintaan langsung mencapai instance tersebut.
Jika warmup request diaktifkan untuk aplikasi Anda, App Engine akan mencoba mendeteksi kapan aplikasi memerlukan instance baru dan memulai warmup request untuk melakukan inisialisasi instance baru. Namun, upaya deteksi ini tidak berfungsi pada setiap kasus. Akibatnya, Anda mungkin menemukan permintaan pemuatan, meskipun warmup request diaktifkan di aplikasi Anda. Misalnya, jika aplikasi Anda tidak melayani traffic, permintaan pertama ke aplikasi akan selalu berupa permintaan pemuatan, bukan warmup request.
Warmup request menggunakan jam instance seperti permintaan lainnya ke
aplikasi App Engine Anda. Dalam sebagian besar kasus jika warmup request diaktifkan,
Anda tidak akan melihat peningkatan jam kerja instance karena aplikasi
hanya melakukan inisialisasi dalam warmup request, bukan permintaan pemuatan. Penggunaan
jam instance dapat meningkat jika Anda memutuskan untuk melakukan lebih banyak pekerjaan, seperti
pra-caching selama warmup request. Jika menetapkan min_idle_instances
ke lebih besar dari 0
, Anda mungkin akan menerima warmup request saat instance tersebut pertama kali dimulai, tetapi akan tetap tersedia setelah itu.
Mengaktifkan warmup request
Warmup request digunakan oleh scheduler App Engine, yang mengontrol penskalaan otomatis instance berdasarkan konfigurasi yang disediakan pengguna.
Pada runtime Java App Engine, warmup request diaktifkan secara default, sehingga App Engine mengeluarkan permintaan GET
ke /_ah/warmup
sehingga Anda dapat merespons dan menginisialisasi kode aplikasi sesuai kebutuhan. Anda dapat merespons warmup request menggunakan salah satu metode berikut:
- Menggunakan servlet
<load-on-startup>
- Cara termudah untuk menyediakan logika warmup adalah dengan menandai servlet Anda sendiri sebagai
<load-on-startup>
di file konfigurasiweb.xml
. - Menggunakan
ServletContextListener
- Memungkinkan Anda menjalankan logika kustom sebelum servlet apa pun pertama kali dipanggil melalui warmup request atau permintaan pemuatan.
- Menggunakan servlet warmup kustom
- Penggunaan servlet warmup kustom hanya akan memanggil metode
service
servlet selama warmup request, bukan selama permintaan pemuatan.
Anda mungkin perlu menerapkan pengendali Anda sendiri untuk /_ah/warmup
, bergantung pada
metode mana yang Anda pilih.
Sebelum memulai
Saat warmup request diaktifkan, scheduler akan memulai instance saat menentukan bahwa instance lainnya diperlukan. Scheduler menggunakan warmup request untuk memulai aplikasi, sehingga Anda akan melihat log meskipun aplikasi tidak memproses warmup request tersebut.
Pesan berikut menunjukkan warmup request di log /_ah/warmup
:
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.
Perhatikan bahwa warmup request tidak dijamin akan dipanggil. Dalam beberapa situasi, permintaan pemuatan akan dikirim: misalnya, jika instance tersebut adalah yang pertama dimulai, atau jika ada peningkatan traffic yang tajam. Namun, akan ada "upaya terbaik" untuk mengirim permintaan ke instance yang sudah dipanaskan jika warmup request diaktifkan.
Di Java 8, warmup request diaktifkan secara default. Untuk mengaktifkannya,
tambahkan - warmup
ke
perintah inbound_services
di appengine-web.xml
. Karena secara default, warmup diaktifkan, Anda hanya perlu mengaktifkannya secara eksplisit jika sebelumnya telah men-deploy aplikasi dengan warmup request yang dinonaktifkan di appengine-web.xml
.
Jika demikian, Anda perlu menetapkan nilai <warmup-requests-enabled>
ke true
, lalu deploy ulang.
Menggunakan servlet <load-on-startup>
Cara termudah untuk menyediakan logika warmup adalah dengan menandai servlet Anda sendiri sebagai
<load-on-startup>
di web.xml
. Metode ini tidak memerlukan perubahan pada kode aplikasi Anda, dan melakukan inisialisasi semua servlet yang ditentukan saat aplikasi Anda melakukan inisialisasi.
Di file web.xml
, untuk servlet yang ingin dimuat saat sistem dimulai,
tambahkan elemen <load-on-startup>1</load-on-startup>
ke elemen
<servlet>
. Contoh:
<servlet>
<servlet-name>my-servlet</servlet-name>
<servlet-class>com.company.MyServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Baris ini memuat class servlet yang ditentukan dan memanggil metode init()
servlet. Warmup request melakukan inisialisasi servlet yang ditentukan sebelum melayani
permintaan live apa pun. Namun, jika tidak ada warmup request, servlet
yang ditentukan dalam <load-on-startup>
akan didaftarkan berdasarkan permintaan pertama ke instance
baru, yang menghasilkan permintaan pemuatan. Seperti yang telah disebutkan sebelumnya, App Engine mungkin
tidak mengeluarkan warmup request setiap kali aplikasi Anda memerlukan instance baru.
Menggunakan ServletContextListener
Jika Anda memiliki logika kustom yang ingin dijalankan sebelum servlet dipanggil:
Daftarkan
ServletContextListener
di fileweb.xml
Anda.<listener> <listener-class>com.company.MyListener</listener-class> </listener>
Sediakan class bersama kode filter dan servlet:
public class MyListener implements ServletContextListener { public void contextInitialized(ServletContextEvent event) { // This will be invoked as part of a warmup request, or // the first user request if no warmup request was invoked. } public void contextDestroyed(ServletContextEvent event) { // App Engine does not currently invoke this method. } }
ServletContextListener
berjalan selama warmup request. Jika tidak ada warmup request, permintaan akan dijalankan berdasarkan permintaan pertama ke instance baru. Hal ini dapat menyebabkan
permintaan pemuatan.
Menggunakan servlet warmup kustom
Servlet warmup kustom memanggil metode service
servlet hanya selama
warmup request. Dengan menempatkan logika yang mahal di servlet warmup kustom, Anda dapat
menghindari peningkatan waktu pemuatan pada permintaan pemuatan.
Untuk membuat servlet warmup kustom, cukup ganti definisi servlet
bawaan untuk _ah_warmup
di web.xml
:
<servlet>
<servlet-name>_ah_warmup</servlet-name>
<servlet-class>com.company.MyWarmupServlet</servlet-class>
</servlet>