Saat produsen mengirim pesan ke layanan ApsaraMQ for RocketMQ, ApsaraMQ for RocketMQ menggunakan kebijakan penyeimbangan beban untuk mendistribusikan pesan secara merata ke beberapa antrian, sehingga mencegah terjadinya antrian hot spot dan bottleneck kinerja. Topik ini menjelaskan kebijakan penyeimbangan beban produsen untuk ApsaraMQ for RocketMQ.
Informasi latar belakang
- Pemulihan bencana: Anda dapat menentukan cara pengalihan pesan saat node lokal mengalami kegagalan.
- Pengurutan pesan: Anda dapat lebih memahami bagaimana ApsaraMQ for RocketMQ memastikan pengurutan pesan first-in-first-out yang ketat.
- Penyeimbangan beban: Anda dapat memahami pola distribusi pesan di berbagai node serta mengonfigurasi solusi migrasi lalu lintas dan penskalaan yang sesuai.
Round robin
Cakupan penggunaan
Penyeimbangan beban round-robin merupakan kebijakan penyeimbangan beban default dan satu-satunya kebijakan yang didukung untuk pesan tidak terurut (pesan normal, terjadwal, dan transaksional) di ApsaraMQ for RocketMQ.
Cara kerja kebijakan
Dalam penyeimbangan beban round-robin, produsen mengirim pesan ke semua antrian dalam topik tertentu secara bergiliran untuk memastikan distribusi pesan yang merata ke seluruh antrian dalam topik tersebut.

Pada gambar di atas, Antrian 1, Antrian 2, dan Antrian 3 adalah antrian dalam topik tersebut, sedangkan kombinasi huruf M dan angka menunjukkan pesan yang dikirim secara berurutan.
Produsen mengirim pesan ke antrian secara bergiliran: pesan pertama M1 ke Antrian 1, pesan kedua M2 ke Antrian 2, dan pesan ketiga M3 ke Antrian 3, lalu mengulangi pola distribusi tersebut hingga semua pesan terkirim.
Penanganan pengecualian
Jika pengiriman pesan gagal, ApsaraMQ for RocketMQ akan menganalisis penyebab kegagalan tersebut. Berdasarkan analisis tersebut, sistem dapat sementara melewati node yang berisi antrian gagal saat memilih tujuan, sehingga menyediakan isolasi kesalahan otomatis.
Fitur
Penyeimbangan beban round-robin hanya didukung untuk pesan tidak terurut dan memastikan distribusi pesan yang merata guna memaksimalkan kinerja topik.
Contoh
Mode RoundRobin merupakan mode default untuk pesan non-sekuensial dan tidak memerlukan pengaturan tambahan.
// Secara default, penyeimbangan beban round-robin diaktifkan untuk pesan normal.
// Kirim pesan normal.
MessageBuilder messageBuilder = null;
for (int i = 0; i < 10; i++) {
// Anda tidak perlu mengonfigurasi penyeimbangan beban round-robin untuk mengirimkan pesan normal. SDK telah menyertakan logika yang diperlukan untuk melakukan pengiriman pesan secara round-robin agar pesan didistribusikan secara merata.
Message message = messageBuilder.setTopic("normalTopic")
// Tentukan kunci indeks pesan agar sistem dapat menggunakan kata kunci untuk menemukan pesan secara akurat.
.setKeys("messageKey")
// Tentukan tag pesan agar konsumen dapat memfilter pesan berdasarkan tag tersebut.
.setTag("messageTag")
// Konfigurasikan isi pesan.
.setBody("messageBody".getBytes())
.build();
try {
// Kirim pesan. Fokus pada hasil pengiriman pesan dan pengecualian seperti kegagalan.
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}
MessageGroupHash
Cakupan penggunaan
Penyeimbangan beban berbasis MessageGroupHash merupakan kebijakan penyeimbangan beban default dan satu-satunya kebijakan yang didukung untuk pesan terurut di ApsaraMQ for RocketMQ.
Prinsip kebijakan: Algoritma hash
Penyeimbangan beban berbasis MessageGroupHash menggunakan algoritma SipHash untuk mendistribusikan pesan. Dalam mode ini, produsen mengirim pesan dalam grup pesan yang sama ke antrian yang sama berdasarkan algoritma SipHash bawaan, sehingga memastikan bahwa pesan dalam satu grup pesan disimpan dalam antrian sesuai urutan pengirimannya.

Pada gambar di atas, G1-M1 adalah pesan pertama dalam MessageGroup 1, G1-M2 adalah pesan kedua, dan G1-M3 adalah pesan ketiga. Produsen mengirim pesan-pesan tersebut ke antrian yang sama (MessageQueue 1) dan memastikan ketiganya disimpan dalam antrian sesuai urutan pengirimannya.
Fitur
Penyeimbangan beban berbasis MessageGroupHash hanya didukung untuk pesan terurut dan memastikan pengiriman pesan secara terurut dalam satu grup pesan.
Jika jumlah pesan di beberapa grup pesan sangat berbeda, penyeimbangan beban berbasis MessageGroupHash tidak dapat menjamin distribusi pesan yang merata maupun penskalaan kinerja. Dalam skenario tertentu, sebagian besar pesan dapat tersimpan hanya di sejumlah kecil antrian. Untuk menghindarinya, kami menyarankan agar Anda mendistribusikan pesan ke beberapa grup pesan sehingga tidak terkonsentrasi pada sejumlah kecil grup saja.
Contoh
Secara default, penyeimbangan beban berbasis MessageGroupHash diaktifkan untuk pesan terurut. Contoh kode berikut menunjukkan penerapan penyeimbangan beban berbasis MessageGroupHash:
// Secara default, penyeimbangan beban berbasis MessageGroupHash diaktifkan untuk pesan terurut.
for (int i = 0; i < 10; i++) {
Message message = messageBuilder.setTopic("fifoTopic")
// Tentukan kunci indeks pesan agar sistem dapat menggunakan kata kunci untuk menemukan pesan secara akurat.
.setKeys("messageKey")
// Tentukan tag pesan agar konsumen dapat memfilter pesan berdasarkan tag yang ditentukan.
.setTag("messageTag")
// Konfigurasikan MessageGroup. Pesan dalam grup pesan yang sama didistribusikan ke antrian yang sama berdasarkan algoritma SipHash.
.setMessageGroup("fifoGroupA")
// Konfigurasikan isi pesan.
.setBody("messageBody".getBytes())
.build();
try {
// Kirim pesan. Fokus pada hasil pengiriman pesan dan pengecualian seperti kegagalan.
SendReceipt sendReceipt = producer.send(message);
System.out.println(sendReceipt.getMessageId());
} catch (ClientException e) {
e.printStackTrace();
}
}Kompatibilitas versi
- Mode MessageGroupHash
Kebijakan penyeimbangan beban MessageGroupHash didukung mulai dari versi server ApsaraMQ for RocketMQ 5.x. Versi sebelumnya, seperti 4.x dan 3.x, tidak mendukung kebijakan ini.
Oleh karena itu, jika Anda meningkatkan mekanisme pengiriman pesan terurut dari versi 4.x atau 3.x ke 5.x, Anda harus mengambil langkah-langkah untuk memastikan pengurutan pesan tetap terjaga. Misalnya, Anda dapat mengonsumsi semua pesan dalam topik sebelum beralih ke versi 5.x.
- Mode round-robin
Kebijakan penyeimbangan beban round-robin didukung oleh versi server 5.x, 4.x, dan 3.x serta tidak memiliki masalah kompatibilitas.
Catatan penggunaan
Hindari kelebihan beban pada antrian saat menggunakan penyeimbangan beban berbasis MessageGroupHash
Dalam mode MessageGroupHash, ApsaraMQ for RocketMQ menjamin bahwa pesan dari grup pesan yang sama dikirim ke antrian yang sama. Jika logika bisnis Anda mengkonsentrasikan pesan hanya ke beberapa grup pesan, layanan ini juga akan menyimpan pesan-pesan tersebut hanya di beberapa antrian. Hal ini dapat meningkatkan tekanan penyimpanan, menyebabkan hot spot pada antrian, dan membatasi kemampuan topik untuk diskalakan.
Kami menyarankan agar Anda mendistribusikan pesan ke beberapa grup pesan. Sebagai contoh, dalam skenario e-commerce, Anda dapat menggunakan ID pesanan dan nama pengguna sebagai kunci grup pesan untuk memastikan pesan didistribusikan ke berbagai grup pesan, sekaligus memproses pesan spesifik pengguna secara terurut.
Hindari mengirim pesan ke satu antrian saja
Untuk memastikan penskalaan kinerja dan pemulihan bencana, kami menyarankan agar Anda menggunakan lebih dari satu antrian untuk penyeimbangan beban, baik untuk pesan terurut maupun tidak terurut. Jika suatu topik hanya berisi satu antrian, pesan akan dikirim hanya ke antrian tersebut, terlepas dari kebijakan penyeimbangan beban yang digunakan. Hal ini dapat menyebabkan bottleneck kinerja dan mengganggu pemulihan bencana.