Saat konsumen dalam grup konsumen menarik pesan dari topik ApsaraMQ for RocketMQ, kebijakan penyeimbangan beban digunakan untuk menentukan cara alokasi pesan kepada konsumen. Kebijakan ini meningkatkan konkurensi layanan dan skalabilitas aplikasi. Topik ini menjelaskan kebijakan penyeimbangan beban yang disediakan oleh ApsaraMQ for RocketMQ untuk konsumen.
Informasi latar belakang
Memahami kebijakan penyeimbangan beban yang disediakan oleh ApsaraMQ for RocketMQ membantu Anda menentukan langkah-langkah yang tepat dalam skenario berikut:
Pemulihan bencana: Anda dapat menentukan cara pesan dicoba ulang dan dialihkan ketika node lokal gagal.
Pesan berurutan: Anda dapat lebih memahami bagaimana ApsaraMQ for RocketMQ memastikan urutan pesan first-in-first-out (FIFO) yang ketat.
Partisi horizontal: Anda dapat merencanakan migrasi lalu lintas dan operasi penskalaan horizontal berdasarkan cara pesan dialokasikan.
Konsumsi siaran dan konsumsi kluster
ApsaraMQ for RocketMQ memungkinkan beberapa grup konsumen untuk berlangganan pesan yang sama, dengan setiap grup konsumen menginisialisasi beberapa konsumen. Grup konsumen dan konsumen dapat dikonfigurasi untuk mengonsumsi pesan dalam skenario berikut:
Konsumsi Siaran di Seluruh Grup Konsumen: Skenario ini diilustrasikan di sisi kiri gambar sebelumnya. Setiap grup konsumen menginisialisasi konsumennya sendiri yang mengonsumsi semua pesan. Pesan dikirim ke beberapa subscriber dari topik dalam hubungan satu-ke-banyak.
Mode ini biasanya digunakan dalam skenario seperti dorongan gateway dan dorongan konfigurasi.
Konsumsi Kluster dalam Grup Konsumen: Skenario ini diilustrasikan di sisi kanan gambar sebelumnya. Setiap grup konsumen menginisialisasi beberapa konsumen, dan pesan dikirim ke semua konsumen dalam grup. Mode ini berguna untuk menerapkan partisi lalu lintas horizontal dan penyeimbangan beban dalam grup.
Mode ini cocok untuk pemisahan layanan mikro.
Pengantar kebijakan penyeimbangan beban untuk konsumen
Dalam skenario konsumsi siaran, penyeimbangan beban tidak diperlukan karena setiap grup konsumen hanya berisi satu konsumen.
Namun, dalam skenario konsumsi kluster, setiap grup konsumen berisi beberapa konsumen. Kebijakan penyeimbangan beban membantu menentukan cara alokasi pesan.
Berdasarkan jenis konsumen, kebijakan penyeimbangan beban dibagi menjadi dua jenis:
Penyeimbangan Beban Berbasis Pesan: Kebijakan default untuk konsumen push dan konsumen sederhana.
Penyeimbangan Beban Berbasis Antrian: Kebijakan default untuk konsumen pull.
Penyeimbangan beban berbasis pesan
Ruang lingkup penggunaan
Penyeimbangan beban berbasis pesan adalah satu-satunya dan kebijakan default untuk konsumen push dan konsumen sederhana.
Mekanisme kerja
Penyeimbangan beban berbasis pesan secara merata mengalokasikan pesan dalam topik ke beberapa konsumen dalam grup konsumen.

Seperti ditunjukkan pada gambar sebelumnya, Consumer Group A terdiri dari tiga konsumen: A1, A2, dan A3. Ketiga konsumen ini mengonsumsi pesan Queue1 dalam topik.
Penyeimbangan beban berbasis pesan memastikan bahwa pesan dalam antrian diproses secara bersamaan oleh beberapa konsumen. Namun, pesan dikirim secara acak ke konsumen, sehingga Anda tidak dapat menentukan cara alokasi pesan ke konsumen.
Penyeimbangan beban berbasis pesan didasarkan pada semantik pengakuan pesan tunggal dalam topik. Setelah konsumen menerima pesan, broker mengunci pesan untuk memastikan bahwa pesan tersebut tidak terlihat oleh konsumen lain sampai dikonsumsi atau habis waktu. Ini mencegah pesan dari antrian yang sama dikonsumsi berkali-kali oleh konsumen yang berbeda.
Kebijakan beban untuk pesan terurut
Dalam pesan terurut, urutan pesan mengacu pada urutan beberapa pesan dalam grup pesan. Pesan-pesan ini harus diproses dalam urutan yang persis sama seperti yang disimpan di broker. Oleh karena itu, penyeimbangan beban berbasis pesan perlu memastikan bahwa pesan dalam grup pesan dikonsumsi dalam urutan yang sama seperti yang disimpan di server. Saat konsumen yang berbeda memproses pesan dalam grup yang sama, sistem mengunci pesan secara ketat sesuai dengan urutan pesan untuk memastikan pesan dikonsumsi secara berurutan.

Pada gambar sebelumnya, ada empat pesan terurut dalam grup pesan G1 dari Queue1. Urutan penyimpanannya diwakili oleh M1 hingga M4. Selama konsumsi, ketika pesan M1 dan M2 diproses oleh konsumen A1, konsumen A2 tidak dapat mengonsumsi pesan M3 dan M4 secara paralel jika status konsumsi untuk M1 dan M2 belum diserahkan. Konsumen hanya dapat mengonsumsi pesan ketika status konsumsi untuk pesan sebelumnya telah diserahkan.
Fitur
Dibandingkan dengan penyeimbangan beban berbasis antrian, penyeimbangan beban berbasis pesan memiliki fitur-fitur berikut:
Alokasi konsumsi lebih seimbang
Dalam penyeimbangan beban berbasis antrian konvensional, jumlah antrian dan jumlah konsumen mungkin tidak seimbang dengan baik. Ini menghasilkan sistem di mana beberapa konsumen mungkin menganggur sementara beberapa konsumen lainnya kelebihan beban. Sebaliknya, penyeimbangan beban berbasis pesan memastikan penyeimbangan beban yang merata di antara konsumen tanpa memerlukan Anda untuk mengelola jumlah antrian dan konsumen.
Lebih toleran terhadap perbedaan kapasitas jaringan
Dalam lingkungan produksi online, kemampuan pemrosesan konsumen mungkin berbeda karena kondisi jaringan aktual atau spesifikasi perangkat keras jaringan yang tidak konsisten. Jika pesan dialokasikan berdasarkan antrian, mungkin ada kasus di mana beberapa konsumen memiliki pesan yang menumpuk sementara konsumen lainnya menganggur. Sebaliknya, penyeimbangan beban berbasis pesan mengalokasikan pesan sesuai permintaan untuk mencapai distribusi beban yang lebih seimbang di antara konsumen.
O&M lebih mudah untuk alokasi antrian
Dalam skenario di mana penyeimbangan beban berbasis antrian konvensional digunakan, Anda harus memastikan bahwa jumlah antrian lebih besar atau sama dengan jumlah konsumen untuk memastikan tidak ada konsumen yang menganggur. Masalah ini tidak ada dengan penyeimbangan beban berbasis pesan.
Skenario
Karena pesan dalam antrian dialokasikan secara diskrit ke konsumen, penyeimbangan beban berbasis pesan cocok untuk sebagian besar skenario penanganan acara online. Dalam skenario ini, konsumen hanya memerlukan kemampuan pemrosesan dasar alih-alih agregasi batch pesan. Adapun skenario seperti pemrosesan aliran dan komputasi agregasi di mana agregasi dan pemrosesan batch pesan diperlukan, penyeimbangan beban berbasis antrian adalah pilihan yang lebih baik.
Contoh
Konsumen tidak perlu melakukan konfigurasi tambahan untuk penyeimbangan beban berbasis pesan. Secara default, kebijakan ini diaktifkan untuk konsumen push dan konsumen sederhana.
SimpleConsumer simpleConsumer = null;
// Contoh konsumsi 1: Saat konsumen push mengonsumsi pesan normal, mereka hanya perlu memproses pesan pada pendengar pesan dan tidak perlu mempertimbangkan penyeimbangan beban.
MessageListener messageListener = new MessageListener() {
@Override
public ConsumeResult consume(MessageView messageView) {
System.out.println(messageView);
// Mengembalikan status berdasarkan hasil konsumsi.
return ConsumeResult.SUCCESS;
}
};
// Contoh konsumsi 2: Saat konsumen sederhana mengonsumsi pesan normal, mereka mendapatkan dan menyerahkan pesan. Konsumen mendapatkan pesan berdasarkan topik yang dilanggan dan tidak perlu mempertimbangkan penyeimbangan beban.
List<MessageView> messageViewList = null;
try {
messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
messageViewList.forEach(messageView -> {
System.out.println(messageView);
// Setelah konsumsi selesai, konsumen harus memanggil ACK untuk menyerahkan hasil konsumsi.
try {
simpleConsumer.ack(messageView);
} catch (ClientException e) {
e.printStackTrace();
}
});
} catch (ClientException e) {
// Jika tarikan gagal karena pembatasan lalu lintas sistem atau alasan lainnya, konsumen harus mengajukan ulang permintaan untuk mendapatkan pesan.
e.printStackTrace();
}
Penyeimbangan beban berbasis antrian
Ruang lingkup penggunaan
Untuk konsumen versi broker 4.x dan 3.x, termasuk konsumen pull, konsumen push default, konsumen pull default, dan konsumen pull ringan, hanya penyeimbangan beban berbasis antrian yang dapat digunakan.
Mekanisme kerja
Dalam kebijakan penyeimbangan beban berbasis antrian, konsumen dalam grup konsumen yang sama mengonsumsi pesan dalam antrian yang dialokasikan kepada mereka. Setiap antrian dikonsumsi oleh satu konsumen.

Seperti ditunjukkan pada gambar sebelumnya, tiga antrian (Queue1, Queue2, dan Queue3) dalam topik dialokasikan ke dua konsumen dalam grup konsumen. Karena setiap antrian hanya dapat dialokasikan ke satu konsumen, konsumen A2 dialokasikan dua antrian. Jika jumlah antrian kurang dari jumlah konsumen, beberapa konsumen tidak akan memiliki antrian yang dialokasikan kepada mereka.
Penyeimbangan beban berbasis antrian mengalokasikan pesan berdasarkan data operasi seperti jumlah antrian dan jumlah konsumen. Setiap antrian terikat pada konsumen tertentu. Kemudian, setiap konsumen memproses pesan sesuai dengan semantik konsumsi mendapatkan pesan > menyerahkan offset > menyimpan offset. Status konsumsi tidak dikembalikan ke antrian ketika konsumen mendapatkan pesan. Oleh karena itu, untuk menghindari konsumsi pesan berulang kali oleh beberapa konsumen, setiap antrian hanya dapat dikonsumsi oleh satu konsumen.
Penyeimbangan beban berbasis antrian menjamin bahwa antrian diproses oleh hanya satu konsumen. Namun, implementasi kebijakan ini bergantung pada mekanisme negosiasi informasi antara konsumen dan broker. ApsaraMQ for RocketMQ tidak menjamin bahwa pesan dalam antrian diproses oleh hanya satu konsumen. Oleh karena itu, ketika jumlah konsumen dan jumlah antrian berubah, ketidaksesuaian sementara dalam alokasi antrian mungkin terjadi, yang menyebabkan sejumlah kecil pesan diproses lebih dari sekali.
Fitur
Dibandingkan dengan penyeimbangan beban berbasis pesan, granularitas penyeimbangan beban berbasis antrian lebih besar dan kurang fleksibel. Namun, penyeimbangan beban berbasis antrian ideal untuk skenario pemrosesan aliran. Ini memastikan bahwa pesan dalam antrian diproses oleh satu konsumen. Oleh karena itu, penyeimbangan beban berbasis antrian lebih cocok untuk skenario di mana Anda ingin memproses pesan teragregasi atau pesan dalam batch.
Skenario
Penyeimbangan beban berbasis antrian berlaku untuk skenario di mana Anda ingin memproses pesan teragregasi atau pesan dalam batch. Ini adalah skenario umum dalam aplikasi komputasi aliran dan agregasi data.
Contoh
Konsumen tidak perlu melakukan konfigurasi tambahan untuk penyeimbangan beban berbasis antrian. Secara default, kebijakan ini diaktifkan untuk konsumen pull versi broker 4.x dan 3.x.
Untuk informasi lebih lanjut tentang kode contoh, kunjungi perpustakaan kode Apache RocketMQ.
Kompatibilitas versi
Kebijakan penyeimbangan beban berbasis pesan tersedia mulai versi broker 5.0 dari ApsaraMQ for RocketMQ. Untuk versi broker 4.x dan 3.x, hanya kebijakan penyeimbangan beban berbasis antrian yang tersedia.
Baik kebijakan penyeimbangan beban berbasis pesan maupun berbasis antrian tersedia untuk versi broker 5.x dari ApsaraMQ for RocketMQ. Kebijakan mana yang efektif tergantung pada versi klien dan jenis konsumen.
Catatan penggunaan
Implementasikan idempotensi pesan untuk logika konsumsi.
Baik kebijakan penyeimbangan beban berbasis pesan maupun berbasis antrian memicu penyeimbangan ulang sementara dalam skenario seperti menambahkan konsumen, menghapus konsumen, dan penskalaan broker. Ini dapat menyebabkan ketidaksesuaian beban sementara dan mengakibatkan sejumlah kecil pesan dikonsumsi lebih dari sekali. Oleh karena itu, deduplikasi diperlukan untuk memastikan idempotensi untuk konsumsi pesan.