Mengonfigurasi Warmup Request untuk Meningkatkan Performa

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.

Warmup request default menyebabkan semua file JAR diindeks dalam memori dan menginisialisasi aplikasi dan filter Anda.

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 konfigurasi web.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:

  1. Daftarkan ServletContextListener di file web.xml Anda.

    <listener>
      <listener-class>com.company.MyListener</listener-class>
    </listener>
    
  2. 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>