Bir tüketici grubundaki birden fazla tüketici bir konudan mesajları çektiğinde, ApsaraMQ for RocketMQ bu mesajları bir yük dengeleme ilkesi kullanarak tüketiciler arasında dağıtır. Bu yaklaşım aktarım hızını artırır ve yatay ölçeklendirmeyi basitleştirir.
Bir yük dengeleme ilkesi seçin
ApsaraMQ for RocketMQ iki farklı yük dengeleme ilkesi sunar. Hangi ilkenin uygulanacağı, tüketici türüne ve broker sürümüne bağlıdır.
| İlke | Varsayılan olarak uygulandığı tüketici | Granülerlik | En uygun olduğu senaryolar |
|---|---|---|---|
| Mesaj tabanlı | Push Consumer, Simple Consumer (broker 5.x) | Tekil mesajlar | Her mesajın bağımsız olarak işlendiği olay güdümlü iş yükleri |
| Kuyruk tabanlı | Pull Consumer (broker 3.x/4.x/5.x) | Tam kuyruklar | Akış işleme ve toplu iş birleştirme iş yükleri |
İpucu: Tüketicileriniz mesajları tek tek işliyorsa, mesaj tabanlı yük dengeleme daha dengeli bir dağılım ve daha basit işletim sağlar. Tüketicileriniz tek bir kaynaktan gelen mesajları toplu halde veya gruplayarak işliyorsa kuyruk tabanlı yük dengelemeyi kullanın.
Arka plan
Bu ilkeleri anlamak aşağıdaki konularda planlama yapmanıza yardımcı olur:
Olağanüstü durum kurtarma -- yerel düğümler arızalandığında mesajların nasıl yeniden denendiği ve yük devretmenin nasıl çalıştığı.
Mesaj sıralaması -- ApsaraMQ for RocketMQ'nun bir mesaj grubu içinde katı ilk giren ilk çıkar (FIFO) sırasını nasıl koruduğu.
Yatay ölçeklendirme -- tüketici eklerken veya kaldırırken trafik geçişini ve yatay ölçeklendirmeyi nasıl planlayacağınız.
Yayın tüketimi ile küme tüketimi karşılaştırması
ApsaraMQ for RocketMQ iki tüketim modunu destekler. Yük dengeleme yalnızca küme tüketimi için geçerlidir.
| Mod | Gruptaki tüketici sayısı | Mesaj teslimi | Kullanım durumu | Yük dengeleme |
|---|---|---|---|---|
| Yayın | Grup başına bir | Her grup tüm mesajları alır | Ağ geçidi itme, yapılandırma itme | Uygulanamaz |
| Küme | Grup başına birden fazla | Her mesaj tek bir tüketiciye gider | Mikroservis gevşek bağlantısı, yatay ölçeklendirme | Mesaj tabanlı veya kuyruk tabanlı |

Yayın tüketimi (diyagramın sol tarafı): Her tüketici grubunda tüm mesajları alan tek bir tüketici bulunur. Farklı tüketici grupları mesaj akışının tamamını bağımsız olarak alır.
Küme tüketimi (diyagramın sağ tarafı): Bir tüketici grubunda birden fazla tüketici bulunur ve mesajlar bunlar arasında dağıtılır. Grupta her mesajı yalnızca bir tüketici işler.
Mesaj tabanlı yük dengeleme
Nasıl çalışır
Broker, mesajların hangi kuyruğa ait olduğundan bağımsız olarak, bir konudaki tekil mesajları bir tüketici grubundaki tüm tüketiciler arasında eşit şekilde dağıtır. Birden fazla tüketici aynı kuyruktaki mesajları eş zamanlı olarak işleyebilir.

Bu örnekte, Tüketici Grubu A'da A1, A2 ve A3 adlı üç tüketici bulunur. Üçü de Queue1'den mesajları tüketir. Broker her mesajı tek seferde bir tüketiciye atar.
Bir tüketici bir mesaj aldığında, broker bu mesajı kilitler; böylece mesaj diğer tüketiciler için görünmez hale gelir. Mesaj, tüketici onaylayana veya kilidin süresi dolana kadar kilitli kalır. Bu mekanizma, normal koşullar altında yinelenen işlemeyi önler.
Mesajlar önceden atanmak yerine talebe göre dağıtılır. Belirli bir mesajı hangi tüketicinin alacağını kontrol edemezsiniz.
Sıralı mesaj işleme
Sıralı mesajlar için ApsaraMQ for RocketMQ, aynı mesaj grubundaki mesajların broker üzerinde depolandıkları sırayla birebir aynı şekilde işlenmesini garanti eder.

Queue1'in G1 mesaj grubundaki dört sıralı mesajı (M1'den M4'e) düşünün. A1 tüketici M1 ve M2'yi işliyorsa, A1 M1 ve M2 için tüketim durumunu gönderene kadar A2 tüketici M3 veya M4'ü işlemeye başlayamaz. Broker, sıralamayı korumak için katı ardışık kilitleme uygular.
Kuyruk tabanlı yük dengelemeye göre avantajları
| Avantaj | Nasıl çalışır | Neden önemlidir |
|---|---|---|
| Dengeli dağılım | Mesajlar talebe göre tahsis edildiğinden tüm tüketiciler meşgul kalır. | Kuyruk tabanlı dengelemede, kuyruk ve tüketici sayıları arasındaki uyumsuzluk bazı tüketicilerin boşta kalmasına neden olabilir. |
| Eşit olmayan kapasiteye tolerans | Daha yavaş tüketiciler otomatik olarak daha az mesaj alır. | Kuyruk tabanlı dengelemede, ağ koşulları veya donanım teknik özelliklerindeki farklar nedeniyle yoğun bir kuyruk atanan yavaş bir tüketici birikim oluştururken diğer tüketiciler boşta kalabilir. |
| Daha basit kapasite planlaması | Kuyruk sayısını tüketici sayısına eşitleme gereği yoktur. | Kuyruk sayısını ayarlamadan tüketicileri serbestçe ekleyip kaldırabilirsiniz. |
Ne zaman kullanılır
Mesaj tabanlı yük dengeleme, her mesajın bağımsız olarak ele alındığı çoğu çevrimiçi olay işleme iş yükü için uygundur; örneğin sipariş işleme, bildirim dağıtımı ve gerçek zamanlı olay işleme.
Aynı kuyruktaki mesajları toplu işlemeyi gerektiren akış işleme veya birleştirme iş yükleri için bunun yerine kuyruk tabanlı yük dengelemeyi kullanın.
Kapsam
Mesaj tabanlı yük dengeleme, broker sürümü 5.x üzerindeki Push Consumer ve Simple Consumer türleri için kullanılabilen tek ilkedir. Varsayılan olarak etkindir ve ek yapılandırma gerektirmez.
Örnek
Push Consumer ve Simple Consumer türleri mesaj tabanlı yük dengelemeyi otomatik olarak kullanır. Aşağıdaki Java örnekleri, herhangi bir yük dengeleme yapılandırması olmadan her iki tüketici türünün de mesajları nasıl işlediğini gösterir.
Mesaj dinleyicili Push Consumer:
// Push Consumer: implement a message listener to process messages.
// Load balancing is handled automatically by the broker.
MessageListener messageListener = new MessageListener() {
@Override
public ConsumeResult consume(MessageView messageView) {
System.out.println(messageView);
// Return the consumption result.
return ConsumeResult.SUCCESS;
}
};
Manuel onaylamalı Simple Consumer:
// Simple Consumer: pull messages, process them, and acknowledge each one.
// Load balancing is handled automatically by the broker.
try {
List<MessageView> messageViewList = simpleConsumer.receive(10, Duration.ofSeconds(30));
messageViewList.forEach(messageView -> {
System.out.println(messageView);
try {
// Acknowledge the message after processing.
simpleConsumer.ack(messageView);
} catch (ClientException e) {
e.printStackTrace();
}
});
} catch (ClientException e) {
// If the pull fails due to throttling or other issues, retry the request.
e.printStackTrace();
}
Kuyruk tabanlı yük dengeleme
Nasıl çalışır
Broker, bir konudaki her kuyruğu tüketici grubundaki tam olarak bir tüketiciye atar. Her tüketici daha sonra kendisine atanan kuyruklardaki tüm mesajları işler.

Bu örnekte bir konuda üç kuyruk (Queue1, Queue2, Queue3) bulunur ve tüketici grubunda iki tüketici vardır. Her kuyruk bir tüketiciye atandığından, A2 tüketici iki kuyruk alırken A1 sadece bir kuyruk alır. Kuyruk sayısı tüketici sayısından azsa, bazı tüketicilere kuyruk atanmaz ve boşta kalırlar.
Her tüketici şu işleme sırasını izler: atanan kuyruktan mesajları çeker, tüketim ofsetini gönderir ve ofseti kalıcı hale getirir. Tüketici mesajları çekerken tüketim durumu kuyruğa iade edilmediğinden, yinelenen işlemeyi önlemek için her kuyruk tek bir tüketiciye özel olarak atanmalıdır.
Kuyruk tabanlı yük dengeleme, her kuyruğun tek bir tüketici tarafından işlenmesi için tasarlanmıştır. Ancak uygulama, tüketici ile broker arasındaki bilgi uzlaşma mekanizmasına bağlıdır. ApsaraMQ for RocketMQ, bir kuyruktaki mesajların yalnızca bir tüketici tarafından işleneceğini garanti etmez. Tüketici veya kuyruk sayıları değiştiğinde, kuyruk atamasında geçici tutarsızlıklar ortaya çıkabilir ve az sayıda mesaj birden fazla kez işlenebilir. Her zaman yedimsiz mesaj işleme uygulayın.
Mesaj tabanlı yük dengelemeye göre avantajları
| Avantaj | Nasıl çalışır | Neden önemlidir |
|---|---|---|
| Kuyruk yakınlığı | Bir kuyruktaki tüm mesajlar aynı tüketiciye gider. | Tek bir tüketici içinde yerel birleştirme ve toplu işlemeyi mümkün kılar. |
| Akış işleme desteği | Tüketiciler aynı kuyruktan gelen sürekli bir akış üzerinde durum bilgisi içeren işlemeyi sürdürür. | Zaman pencereli hesaplamaları ve çalışan toplamaları destekler. |
Ne zaman kullanılır
Kuyruk tabanlı yük dengeleme, aynı kaynaktan gelen mesajları toplu işlemesi veya birleştirmesi gereken akış bilişim ve veri birleştirme uygulamaları için en iyisidir. Örneğin, bir tüketici belirli bir zaman penceresi boyunca tek bir kuyruktan ölçümleri toplayıp çalışan ortalamaları hesaplayabilir.
Kapsam
Kuyruk tabanlı yük dengeleme, Pull Consumer, varsayılan Push Consumer, varsayılan Pull Consumer ve Lite Pull Consumer türleri dahil olmak üzere broker sürümleri 3.x ve 4.x üzerindeki tüketiciler için kullanılabilen tek ilkedir. Broker sürümü 5.x'te Pull Consumer türleri varsayılan olarak kuyruk tabanlı yük dengelemeyi kullanmaya devam eder.
Ek yapılandırma gerekmez; kuyruk tabanlı yük dengeleme bu tüketici türleri için otomatik olarak etkinleştirilir.
Örnek
Örnek kod için Apache RocketMQ kod kitaplığındaki LitePullConsumerAssign.java dosyasına bakın.
Sürüm uyumluluğu
| Broker sürümü | Kullanılabilir ilkeler | Notlar |
|---|---|---|
| 3.x, 4.x | Yalnızca kuyruk tabanlı | Tüm tüketici türleri kuyruk tabanlı yük dengeleme kullanır. |
| 5.x | Hem mesaj tabanlı hem kuyruk tabanlı | Push Consumer ve Simple Consumer varsayılan olarak mesaj tabanlı kullanır. Pull Consumer varsayılan olarak kuyruk tabanlı kullanır. |
Mesaj tabanlı yük dengeleme ilkesi broker sürüm 5,0 ile tanıtıldı. Broker sürüm 5.x çalıştırıyorsanız, aktif ilke istemci sürümüne ve tüketici türüne bağlıdır.
Kullanım notları
Yedimsiz mesaj işleme uygulayın
Her iki yük dengeleme ilkesi de tüketiciler eklendiğinde, kaldırıldığında veya broker ölçeklendiğinde geçici yeniden dengelemeyi tetikler. Yeniden dengeleme sırasında az sayıda mesaj birden fazla kez teslim edilebilir. Bunu yönetmek için mesaj tüketim mantığınızda yedimsizliği sağlamak amacıyla yinelenenleri kaldırma uygulayın.