Saat melakukan rolling upgrade atau restart node, ApsaraMQ for RocketMQ menerapkan graceful shutdown untuk mengosongkan koneksi aktif dan menyimpan pesan yang sedang diproses sebelum node penyimpanan offline. Pendekatan ini mencegah kehilangan pesan, menghindari error pada client, serta menjaga produsen dan konsumen tetap beroperasi dengan gangguan minimal.
Cara kerja
Ketika sebuah node penyimpanan perlu direstart, ApsaraMQ for RocketMQ mengoordinasikan proses shutdown dalam dua tahap:
Penangguhan penulisan
Broker menghentikan pengiriman operasi tulis baru ke node penyimpanan target sebelum restart dimulai. Pesan yang telah dikirim oleh produsen dipastikan sepenuhnya disimpan sebelum node tersebut offline. Hal ini menjamin tidak ada kehilangan pesan selama maintenance terencana karena tidak ada data baru yang dikirim ke node yang akan segera dimatikan.
Pengosongan koneksi melalui GOAWAY
Broker mengirimkan frame GOAWAY (sebagaimana didefinisikan dalam spesifikasi HTTP/2) ke setiap client yang terhubung ke node target. Saat menerima sinyal ini, client akan:
Menyelesaikan semua permintaan yang sedang berlangsung pada koneksi yang ada.
Membuka koneksi baru ke node lain yang tersedia.
Karena client menerima notifikasi terlebih dahulu alih-alih diputus secara tiba-tiba, permintaan yang sedang berjalan dapat diselesaikan secara normal tanpa kehilangan pekerjaan.
Penanganan GOAWAY telah dibangun ke dalam SDK client ApsaraMQ for RocketMQ. Jika versi SDK Anda memenuhi persyaratan minimum yang tercantum di bawah, proses reconnect terjadi secara otomatis tanpa perubahan kode di tingkat aplikasi.
Dampak pada produsen dan konsumen
| Role | Perilaku selama graceful shutdown |
|---|---|
| Producer | Semua pesan yang telah dikirim diproses dengan sukses. Fase penangguhan penulisan menjamin bahwa setiap pesan disimpan sebelum node offline. |
| Consumer | Sebagian besar pesan dikonsumsi tanpa gangguan. Dalam kasus langka, sejumlah kecil pesan pada node yang sedang direstart mungkin dikirim ulang karena komitmen offset konsumen gagal selama periode transisi singkat tersebut. |
Persyaratan versi SDK
Graceful shutdown memerlukan dukungan SDK client terhadap frame GOAWAY. Pastikan versi SDK Anda memenuhi atau melebihi versi minimum berikut.
| Bahasa | Versi minimum | Referensi |
|---|---|---|
| Java (protokol gRPC) | 5.0.7 | SDK for Java |
| Java (protokol Remoting) | 5.3.1 | SDK for Java |
| Go | 5.1.0-rc.1 | SDK for Go |
| Python | 5.0.4 | SDK for Python |
| C++ | 5.0.2 | SDK for C++ |
| C# | 5.1.0 | SDK for C# |
Jika versi SDK Anda lebih lama dari versi minimum yang tercantum di atas, client tidak dapat memproses frame GOAWAY. Koneksi dari SDK versi lama akan diputus secara tiba-tiba saat restart node, yang dapat menyebabkan error sementara atau pengiriman ulang pesan.
Catatan penggunaan
Tidak diperlukan konfigurasi di sisi client. Graceful shutdown adalah fitur sisi server. Satu-satunya tindakan yang diperlukan adalah memperbarui ke versi SDK yang didukung.
Rancang konsumen agar bersifat idempoten. Karena komitmen offset konsumen mungkin gagal selama periode transisi singkat, sejumlah kecil pesan dapat dikirim ulang. Pastikan logika konsumen Anda dapat memproses pesan yang sama lebih dari sekali secara aman.
Pantau versi SDK secara proaktif. Saat menambahkan layanan baru atau memperbarui dependensi, pastikan SDK client RocketMQ tetap memenuhi persyaratan versi minimum untuk mempertahankan dukungan graceful shutdown.