Saat penerapan, rollback, event skala-masuk, dan restart, instans layanan mikro yang sedang dimatikan masih dapat menerima permintaan dari konsumen yang belum mendeteksi proses shutdown tersebut. Hal ini menyebabkan error permintaan dan kehilangan traffic. Fitur graceful shutdown pada Microservices Engine (MSE) Microservices Governance mengatasi masalah ini dengan mengalihkan permintaan yang sedang dalam proses dan memberi notifikasi kepada konsumen sebelum instans berhenti.
Cara kerja
Pada arsitektur layanan mikro yang umum, instans penyedia (Provider A) mendaftar ke Microservices Registry agar instans konsumen (Consumer B) dapat menemukan dan memanggilnya. Tanpa graceful shutdown, terjadi kondisi race saat Provider A dimatikan:
Provider A mulai dimatikan dan Microservices Registry diberi tahu tentang event shutdown tersebut.
Consumer B memiliki salinan cache daftar penyedia dan tidak langsung mendeteksi perubahan tersebut.
Consumer B terus mengirim permintaan ke Provider A.
Permintaan gagal karena Provider A sudah tidak tersedia.
Graceful shutdown menghilangkan celah ini melalui proses dua fase:
Fase drain: Setelah Provider A menerima perintah shutdown, ia tetap memproses permintaan yang sedang dalam proses, tetapi menambahkan tag khusus pada setiap respons. Saat Consumer B menerima respons yang ditandai, ia memperbarui daftar penyedianya dari Microservices Registry dan berhenti mengarahkan permintaan baru ke Provider A.
Fase tunggu: Provider A menunggu hingga semua permintaan yang sedang dalam proses selesai, lalu dimatikan.
Graceful shutdown diaktifkan secara otomatis ketika MSE Microservices Governance diaktifkan untuk suatu aplikasi. Tidak diperlukan pengaturan manual untuk kemampuan dasar ini. Fitur graceful start dan shutdown MSE juga menyediakan observabilitas yang membantu Anda menentukan apakah suatu aplikasi dimatikan secara graceful. Untuk menggunakan fitur opsional proactive notification, lihat Aktifkan proactive notification.
Detail implementasi Kubernetes
Dalam kluster Kubernetes (ACK), MSE menerapkan shutdown yang mulus dengan menyisipkan panggilan balik lifecycle.preStop ke dalam Pod. Panggilan balik ini dijalankan sebelum kubelet mengirim sinyal SIGTERM ke kontainer aplikasi, sehingga memberikan waktu bagi MSE untuk membatalkan pendaftaran instans dan mengalihkan lalu lintas.
Penyisipan hook preStop
Perilaku penyisipan bergantung pada apakah kontainer bisnis Anda sudah memiliki hook preStop kustom:
| Skenario | Perilaku penyisipan |
|---|---|
Tidak ada hook preStop kustom | MSE menyisipkan hook preStop langsung ke dalam kontainer bisnis |
Hook preStop kustom sudah ada | MSE menyisipkan kontainer sidecar bernama gracefulshutdown dengan hook preStop-nya sendiri. Kontainer sidecar berbagi namespace jaringan dengan kontainer bisnis, sehingga hook preStop-nya juga dapat memicu graceful shutdown untuk kontainer bisnis |
Jika panggilan balik preStop kustom Anda hanya mencabut pendaftaran aplikasi dari Registry Mikroservis, hapus sepenuhnya dan gunakan panggilan balik yang disuntikkan oleh MSE sebagai gantinya.
Penggunaan resource kontainer sidecar
Kontainer sidecar gracefulshutdown menggunakan resource minimal: 0,05 core CPU dan 50 MiB memori.
Konfigurasi terminationGracePeriodSeconds
Waktu eksekusi hook preStop dihitung dalam alokasi waktu terminationGracePeriodSeconds Pod. Nilai default 30 detik sering kali tidak mencukupi. Berikut rincian alokasi waktunya:
| Fase | Durasi | Deskripsi |
|---|---|---|
preStop hook | ~30 dtk | MSE membatalkan pendaftaran instance dan menguras lalu lintas |
| Hook shutdown aplikasi | Bervariasi | Aplikasi melepaskan resource dan koneksi |
| SIGKILL (penghentian paksa) | 0 dtk | Kubelet memaksa menghentikan kontainer jika total waktu melebihi terminationGracePeriodSeconds |
Jika total waktu hook preStop dan hook shutdown aplikasi melebihi terminationGracePeriodSeconds, kubelet akan mengirim SIGKILL dan aplikasi dihentikan secara paksa. Resource mungkin tidak dilepaskan dengan benar.
Atur terminationGracePeriodSeconds minimal menjadi 90 pada spesifikasi Pod Anda:
apiVersion: v1
kind: Pod
spec:
terminationGracePeriodSeconds: 90
containers:
- name: your-app
# ...Jika kontainer bisnis Anda memiliki hook preStop kustom dan pendekatan sidecar digunakan, tentukan durasi sleep minimal 30 detik dalam hook preStop kustom Anda. Hal ini memberi cukup waktu bagi hook preStop sidecar untuk menyelesaikan proses graceful shutdown.
Aktifkan graceful shutdown
Kluster ACK
Tidak diperlukan tindakan apa pun. Graceful shutdown diaktifkan secara otomatis ketika MSE Microservices Governance diaktifkan untuk suatu aplikasi di kluster Container Service for Kubernetes (ACK).
Instans ECS
Tambahkan perintah berikut di awal skrip shutdown aplikasi Anda:
curl http://127.0.0.1:54199/offline 2>/tmp/null; sleep 30;Perintah ini memberi tahu MSE untuk memulai proses graceful shutdown dan menunggu selama 30 detik agar permintaan yang sedang dalam proses selesai dialihkan.
Verifikasi graceful shutdown
Setelah graceful shutdown diaktifkan dan dipicu, verifikasi bahwa traffic dialihkan dengan benar pada halaman governance aplikasi.
Masuk ke Konsol MSE, lalu pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Klik kartu resource aplikasi target.
Di panel navigasi kiri halaman detail aplikasi, klik Traffic management, lalu klik tab Graceful Start/Shutdown.
Di subtab Start and Shutdown Overview, temukan dan klik instans aplikasi target. Panel kanan menampilkan garis waktu event shutdown dan grafik QPS.
Graceful shutdown yang berhasil ditunjukkan dengan QPS turun ke nol sebelum instans berhenti. Tidak ada traffic yang mencapai instans setelah proses shutdown selesai.

Jika QPS tidak turun ke nol setelah event shutdown, periksa adanya panggilan non-layanan mikro (seperti panggilan lokal) yang melewati Microservices Registry.
Event shutdown hanya dilaporkan jika versi agen MSE lebih baru dari 4.2.0. Jika event shutdown tidak terlihat, lakukan upgrade agen.
Mengaktifkan notifikasi proaktif
Notifikasi proaktif adalah fitur tingkat lanjut dari shutdown yang mulus yang dinonaktifkan secara default. Fitur ini mengatasi masalah spesifik pada aplikasi Spring Cloud: meskipun penyedia telah membatalkan pendaftarannya, konsumen Spring Cloud mungkin tetap meneruskan permintaan ke penyedia karena perilaku caching internalnya. Dengan notifikasi proaktif diaktifkan, penyedia secara eksplisit memberi tahu konsumen selama proses shutdown, sehingga konsumen segera berhenti mengirimkan permintaan.
Kapan menggunakan proactive notification
Gunakan proactive notification ketika:
Aplikasi Anda menggunakan framework Spring Cloud dan
Terjadi error panggilan konsumen selama shutdown penyedia meskipun graceful shutdown dasar sudah diaktifkan
Untuk sebagian besar skenario lainnya, perilaku graceful shutdown default sudah cukup.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Mengaktifkan Microservices Governance. Untuk informasi lebih lanjut, lihat Aktifkan Microservices Governance
Mengaktifkan Microservices Governance untuk aplikasi di kluster ACK. Untuk informasi lebih lanjut, lihat Aktifkan Microservices Governance untuk aplikasi layanan mikro di kluster ACK
Aktifkan proactive notification di konsol
Masuk ke Konsol MSE, lalu pilih wilayah di bilah navigasi atas.
Di panel navigasi kiri, pilih Microservices Governance > Application Governance. Klik kartu resource aplikasi target.
Di panel navigasi kiri halaman detail aplikasi, klik Traffic management, lalu klik tab Graceful Start/Shutdown.
Di bagian Settings, klik Revised. Di panel Pengaturan Graceful Start dan Shutdown, perluas blok Graceful Shutdown, aktifkan sakelar Proactive Notification, lalu klik OK.
Batasan
Graceful shutdown
Pada skenario Kubernetes, graceful shutdown diimplementasikan berdasarkan hook preStop. Graceful shutdown hanya didukung saat Pod berhenti secara normal, termasuk skenario berikut:
Scale-in
Restart
Peningkatan bergulir
Graceful shutdown tidak berlaku saat Pod berhenti secara abnormal, seperti saat terjadi OOM kill.
Proactive notification
Microservices Governance tidak mendukung graceful shutdown untuk aplikasi berikut:
Aplikasi non-Java
Aplikasi yang tidak menggunakan WebFlux atau Spring MVC
Aplikasi penyedia yang konsumennya bukan aplikasi layanan mikro
Aplikasi di mana Microservices Governance dinonaktifkan baik di sisi konsumen maupun penyedia