Ketika beberapa consumer dalam satu consumer group menarik pesan dari suatu topik, ApsaraMQ for RocketMQ mendistribusikan pesan tersebut ke seluruh consumer menggunakan kebijakan penyeimbangan beban. Pendekatan ini meningkatkan throughput dan menyederhanakan skalabilitas horizontal.
Pilih kebijakan penyeimbangan beban
ApsaraMQ for RocketMQ menyediakan dua kebijakan penyeimbangan beban. Kebijakan yang berlaku bergantung pada tipe consumer dan versi broker.
| Kebijakan | Bawaan untuk | Granularitas | Paling cocok untuk |
|---|---|---|---|
| Berdasarkan pesan | Push Consumer, Simple Consumer (broker 5.x) | Pesan individual | Beban kerja berbasis event di mana setiap pesan diproses secara independen |
| Berdasarkan antrian | Pull Consumer (broker 3.x/4.x/5.x) | Seluruh antrian | Beban kerja pemrosesan aliran dan agregasi batch |
Tip: Jika consumer Anda memproses pesan satu per satu, penyeimbangan beban berbasis pesan memberikan distribusi yang lebih merata dan operasi yang lebih sederhana. Jika consumer Anda melakukan agregasi atau pemrosesan batch pesan dari satu sumber, gunakan penyeimbangan beban berbasis antrian.
Latar belakang
Memahami kebijakan-kebijakan ini membantu Anda merencanakan hal-hal berikut:
Pemulihan bencana — bagaimana pesan di-retry dan cara kerja failover ketika node lokal gagal.
Pengurutan pesan — bagaimana ApsaraMQ for RocketMQ menjaga urutan first-in-first-out (FIFO) yang ketat dalam satu grup pesan.
Skalabilitas horizontal — cara merencanakan migrasi traffic dan skalabilitas horizontal saat menambah atau menghapus consumer.
Konsumsi broadcast vs. konsumsi kluster
ApsaraMQ for RocketMQ mendukung dua mode konsumsi. Penyeimbangan beban hanya berlaku untuk konsumsi kluster.
| Mode | Jumlah consumer per grup | Pengiriman pesan | Kasus penggunaan | Penyeimbangan beban |
|---|---|---|---|---|
| Broadcast | Satu per grup | Setiap grup menerima semua pesan | Dorong gateway, dorong konfigurasi | Tidak berlaku |
| Cluster | Multiple per grup | Setiap pesan dikirim ke satu consumer | Penguraian keterkaitan mikroservis, skalabilitas horizontal | Berdasarkan pesan atau berdasarkan antrian |

Konsumsi broadcast (sisi kiri diagram): Setiap consumer group memiliki satu consumer yang menerima semua pesan. Grup consumer yang berbeda menerima aliran pesan lengkap secara independen.
Konsumsi kluster (sisi kanan diagram): Satu consumer group memiliki beberapa consumer, dan pesan didistribusikan di antara mereka. Hanya satu consumer dalam grup yang memproses setiap pesan.
Penyeimbangan beban berbasis pesan
Cara kerja
Broker mendistribusikan pesan individual dari suatu topik secara merata ke seluruh consumer dalam satu consumer group, terlepas dari antrian tempat pesan tersebut berada. Beberapa consumer dapat memproses pesan dari antrian yang sama secara bersamaan.

Dalam contoh ini, Consumer Group A memiliki tiga consumer: A1, A2, dan A3. Ketiganya mengonsumsi pesan dari Queue1. Broker menetapkan setiap pesan ke satu consumer dalam satu waktu.
Saat sebuah consumer menerima pesan, broker mengunci pesan tersebut sehingga tidak terlihat oleh consumer lain. Pesan tetap terkunci hingga consumer mengonfirmasi penerimaannya atau kunci tersebut kedaluwarsa. Hal ini mencegah pemrosesan duplikat dalam kondisi normal.
Pesan didistribusikan sesuai permintaan, bukan ditetapkan sebelumnya. Anda tidak dapat mengontrol consumer mana yang menerima pesan tertentu.
Penanganan pesan terurut
Untuk pesan terurut, ApsaraMQ for RocketMQ menjamin bahwa pesan dalam grup pesan yang sama diproses dalam urutan persis seperti saat disimpan di broker.

Pertimbangkan empat pesan terurut (M1 hingga M4) dalam grup pesan G1 dari Queue1. Jika consumer A1 sedang memproses M1 dan M2, consumer A2 tidak dapat mulai memproses M3 atau M4 hingga A1 mengirimkan status konsumsi untuk M1 dan M2. Broker menerapkan penguncian sekuensial yang ketat untuk menjaga urutan.
Keunggulan dibanding penyeimbangan beban berbasis antrian
| Keunggulan | Cara kerja | Mengapa penting |
|---|---|---|
| Distribusi merata | Pesan dialokasikan sesuai permintaan, sehingga semua consumer tetap aktif. | Dengan penyeimbangan berbasis antrian, ketidaksesuaian jumlah antrian dan consumer dapat menyebabkan beberapa consumer menganggur. |
| Toleransi terhadap kapasitas tidak merata | Consumer yang lebih lambat secara otomatis menerima lebih sedikit pesan. | Dengan penyeimbangan berbasis antrian, perbedaan kondisi jaringan atau spesifikasi perangkat keras dapat menyebabkan consumer lambat yang ditugaskan ke antrian sibuk menumpuk backlog, sementara consumer lain menganggur. |
| Perencanaan kapasitas lebih sederhana | Tidak perlu menyamakan jumlah antrian dengan jumlah consumer. | Tambah atau hapus consumer secara bebas tanpa menyesuaikan jumlah antrian. |
Kapan digunakan
Penyeimbangan beban berbasis pesan cocok untuk sebagian besar beban kerja pemrosesan event online di mana setiap pesan ditangani secara independen—misalnya, pemrosesan pesanan, pengiriman notifikasi, dan penanganan event real-time.
Untuk beban kerja pemrosesan aliran atau agregasi yang memerlukan pemrosesan batch pesan dari antrian yang sama, gunakan penyeimbangan beban berbasis antrian.
Cakupan
Penyeimbangan beban berbasis pesan adalah satu-satunya kebijakan yang tersedia untuk tipe Push Consumer dan Simple Consumer pada broker versi 5.x. Kebijakan ini diaktifkan secara default dan tidak memerlukan konfigurasi tambahan.
Contoh
Tipe Push Consumer dan Simple Consumer menggunakan penyeimbangan beban berbasis pesan secara otomatis. Contoh Java berikut menunjukkan kedua tipe consumer memproses pesan tanpa konfigurasi penyeimbangan beban apa pun.
Push Consumer dengan pendengar pesan:
// Push Consumer: implementasikan pendengar pesan untuk memproses pesan.
// Penyeimbangan beban ditangani secara otomatis oleh broker.
MessageListener messageListener = new MessageListener() {
@Override
public ConsumeResult consume(MessageView messageView) {
System.out.println(messageView);
// Kembalikan hasil konsumsi.
return ConsumeResult.SUCCESS;
}
};Konsumen Sederhana dengan Konfirmasi Manual:
// Simple Consumer: tarik pesan, proses, lalu akui setiap pesan.
// Penyeimbangan beban ditangani secara otomatis oleh broker.
try {
List<MessageView> messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
messageViewList.forEach(messageView -> {
System.out.println(messageView);
try {
// Akui pesan setelah diproses.
simpleConsumer.ack(messageView);
} catch (ClientException e) {
e.printStackTrace();
}
});
} catch (ClientException e) {
// Jika penarikan gagal karena pembatasan kecepatan atau masalah lain, ulangi permintaan.
e.printStackTrace();
}Penyeimbangan beban berbasis antrian
Cara kerja
Broker menetapkan setiap antrian dalam suatu topik ke tepat satu consumer dalam consumer group. Setiap consumer kemudian memproses semua pesan dari antrian yang ditetapkan kepadanya.

Dalam contoh ini, suatu topik memiliki tiga antrian (Queue1, Queue2, Queue3) dan consumer group memiliki dua consumer. Karena setiap antrian ditetapkan ke satu consumer, consumer A2 mendapatkan dua antrian sementara A1 mendapatkan satu. Jika jumlah antrian lebih sedikit daripada jumlah consumer, beberapa consumer tidak menerima antrian dan tetap menganggur.
Setiap consumer mengikuti urutan pemrosesan berikut: tarik pesan dari antrian yang ditetapkan, kirimkan offset konsumsi, dan simpan offset tersebut. Karena status konsumsi tidak dikembalikan ke antrian saat consumer menarik pesan, setiap antrian harus ditetapkan secara eksklusif ke satu consumer untuk mencegah pemrosesan duplikat.
Penyeimbangan beban berbasis antrian dirancang agar setiap antrian diproses oleh satu consumer. Namun, implementasinya bergantung pada mekanisme negosiasi informasi antara consumer dan broker. ApsaraMQ for RocketMQ tidak menjamin bahwa pesan dalam suatu antrian diproses hanya oleh satu consumer. Saat jumlah consumer atau antrian berubah, ketidakkonsistenan sementara dalam penetapan antrian dapat terjadi, dan sejumlah kecil pesan mungkin diproses lebih dari sekali. Selalu implementasikan penanganan pesan idempoten.
Keunggulan dibanding penyeimbangan beban berbasis pesan
| Keunggulan | Cara kerja | Mengapa penting |
|---|---|---|
| Afinitas antrian | Semua pesan dari suatu antrian dikirim ke consumer yang sama. | Memungkinkan agregasi lokal dan pemrosesan batch dalam satu consumer. |
| Dukungan pemrosesan aliran | Consumer mempertahankan pemrosesan stateful atas aliran kontinu dari antrian yang sama. | Mendukung komputasi berbasis jendela waktu dan agregat berkelanjutan. |
Kapan digunakan
Penyeimbangan beban berbasis antrian paling cocok untuk aplikasi komputasi aliran dan agregasi data yang perlu memproses batch atau mengagregasi pesan dari sumber yang sama. Misalnya, sebuah consumer dapat mengumpulkan metrik dari satu antrian selama jendela waktu tertentu dan menghitung rata-rata berjalan.
Cakupan
Penyeimbangan beban berbasis antrian adalah satu-satunya kebijakan yang tersedia untuk consumer pada broker versi 3.x dan 4.x, termasuk tipe Pull Consumer, Push Consumer bawaan, Pull Consumer bawaan, dan Lite Pull Consumer. Pada broker versi 5.x, tipe Pull Consumer tetap menggunakan penyeimbangan beban berbasis antrian secara default.
Tidak diperlukan konfigurasi tambahan—penyeimbangan beban berbasis antrian diaktifkan secara otomatis untuk tipe-tipe consumer ini.
Contoh
Untuk contoh kode, lihat LitePullConsumerAssign.java dalam pustaka kode Apache RocketMQ.
Kompatibilitas versi
| Versi broker | Kebijakan yang tersedia | Catatan |
|---|---|---|
| 3.x, 4.x | Hanya berbasis antrian | Semua tipe consumer menggunakan penyeimbangan beban berbasis antrian. |
| 5.x | Keduanya: berbasis pesan dan berbasis antrian | Push Consumer dan Simple Consumer menggunakan berbasis pesan secara default. Pull Consumer menggunakan berbasis antrian secara default. |
Kebijakan penyeimbangan beban berbasis pesan diperkenalkan pada broker versi 5.0. Jika Anda menjalankan broker versi 5.x, kebijakan aktif bergantung pada versi klien dan tipe consumer.
Catatan penggunaan
Implementasikan penanganan pesan idempoten
Kedua kebijakan penyeimbangan beban memicu penyeimbangan ulang sementara saat consumer ditambahkan, dihapus, atau saat broker diskalakan. Selama penyeimbangan ulang, sejumlah kecil pesan mungkin dikirim lebih dari sekali. Untuk menanganinya, implementasikan deduplikasi guna memastikan idempotensi dalam logika konsumsi pesan Anda.