Toplu tüketim, mesajları tek tek göndermek yerine bir seferde birden fazla mesajı tüketici iş parçacığına iletir. Bu yaklaşım, aşağı akış sistemlerine yapılan uzak yordam çağrısı (RPC) ek yükünü azaltır ve mesaj aktarım hızını artırır.
Çalışma mantığı
Push consumer, toplu tüketimi iki aşamada gerçekleştirir:
Çekme ve önbellekleme -- Mesaj çekme iş parçacıkları, uzun oylama (long polling) kullanarak ApsaraMQ for RocketMQ'dan mesajları alır ve bunları yerel olarak önbelleğe kaydeder.
Dağıtım -- Önbelleğe alınan mesajlar toplu iş boyutu eşiğine veya bekleme süresi eşiğine ulaştığında (hangisi önce gerçekleşirse), push consumer toplu işlemi işlenmek üzere bir tüketici iş parçacığına gönderir.

ApsaraMQ for RocketMQ hem push consumer hem de pull consumer desteği sunar. Toplu tüketim yalnızca push consumer'lar için geçerlidir. Daha fazla bilgi için bkz.
.
Kullanım senaryoları
Toplu tüketim, aşağı akış sistemlerinin toplu işlemlerden fayda sağladığı durumlarda en etkili sonucu verir. Amacınız sadece paralelliği artırmaksa, önce tüketici örneklerini eklemek veya iş parçacığı havuzu boyutlarını ayarlamak gibi daha basit alternatifleri değerlendirin.
Toplu indeksleme -- Yukarı akıştaki bir sipariş sistemi, aşağı akıştaki bir Elasticsearch kümesinin indekslediği günlük mesajları yayınlar. Her mesaj bir RPC isteğini (~10 ms) tetikler. 10 mesajın tek tek işlenmesi 100 ms sürerken, bunların tek bir toplu indeks çağrısında gruplanması toplam süreyi ~10 ms'ye düşürür.
Toplu veritabanı ekleme işlemleri -- Bir uygulama, yüksek güncelleme sıklığı altında kayıtları veritabanına tek tek ekler ve bu durum yoğun yük oluşturur. Her ekleme işleminde 10 kaydın gruplanması ve her 5 saniyede bir yazma işleminin gerçekleştirilmesi, bağlantı ek yükünü ve yazma çoğaltmasını azaltır.
Sınırlamalar
Toplu tüketim yalnızca TCP üzerinden desteklenir. Java için TCP istemci SDK'sının ticari sürümünü, 1.8.7.3.Final veya sonraki bir sürümü kullanın. Sürüm notları ve indirme talimatları için bkz. Sürüm notları.
Maksimum toplu iş boyutu: 1.024 mesaj.
Toplu işler arasındaki maksimum bekleme süresi: 450 saniye.
Parametreler
Bir toplu işin ne zaman dağıtılacağını iki parametre kontrol eder. Dağıtım işlemi, bu koşullardan herhangi biri karşılandığında (hangisi önce gerçekleşirse) başlatılır.
| Parametre | Tür | Varsayılan | Geçerli aralık | Açıklama |
|---|---|---|---|---|
ConsumeMessageBatchMaxSize |
String | 32 | 1--1.024 | Başına düşen maksimum mesaj sayısı. Önbelleğe alınan mesaj sayısı bu değere ulaştığında, SDK toplu işlemi hemen bir tüketici iş parçacığına dağıtır. |
BatchConsumeMaxAwaitDurationInSeconds |
String | 0 | 0--450 | Saniye cinsinden maksimum bekleme süresi. Bu süre dolduğunda, toplu iş boyutu eşiğine ulaşılmasa bile SDK biriken tüm mesajları dağıtır. |
Örnek kod
Properties nesnesini ONSFactory.createBatchConsumer() yöntemine ileterek toplu tüketimi yapılandırın. BatchMessageListener geri arama yöntemi, en fazla ConsumeMessageBatchMaxSize sayıda mesaj içeren bir List<Message> alır.
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.batch.BatchConsumer;
import com.aliyun.openservices.ons.api.batch.BatchMessageListener;
import java.util.List;
import java.util.Properties;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.tcp.example.MqConfig;
public class SimpleBatchConsumer {
public static void main(String[] args) {
Properties consumerProperties = new Properties();
consumerProperties.setProperty(PropertyKeyConst.GROUP_ID, MqConfig.GROUP_ID);
consumerProperties.setProperty(PropertyKeyConst.AccessKey, MqConfig.ACCESS_KEY);
consumerProperties.setProperty(PropertyKeyConst.SecretKey, MqConfig.SECRET_KEY);
consumerProperties.setProperty(PropertyKeyConst.NAMESRV_ADDR, MqConfig.NAMESRV_ADDR);
// Set the maximum number of messages per batch.
// Default: 32. Valid values: 1 to 1024.
consumerProperties.setProperty(PropertyKeyConst.ConsumeMessageBatchMaxSize, String.valueOf(128));
// Set the maximum wait time between batches, in seconds.
// Default: 0. Valid values: 0 to 450.
consumerProperties.setProperty(PropertyKeyConst.BatchConsumeMaxAwaitDurationInSeconds, String.valueOf(10));
BatchConsumer batchConsumer = ONSFactory.createBatchConsumer(consumerProperties);
batchConsumer.subscribe(MqConfig.TOPIC, MqConfig.TAG, new BatchMessageListener() {
@Override
public Action consume(final List<Message> messages, ConsumeContext context) {
System.out.printf("Batch-size: %d\n", messages.size());
// Process messages in batches.
return Action.CommitMessage;
}
});
// Start BatchConsumer.
batchConsumer.start();
System.out.println("Consumer start success.") ;
// Wait for a fixed period to prevent the process from exiting.
try {
Thread.sleep(200000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Tam kaynak kodu için GitHub'daki kod kitaplığına bakın.
Tüm parametrelerin referans bilgileri için bkz.Yöntemler ve parametreler.
En iyi uygulamalar
Toplu iş boyutunu ve bekleme süresini birlikte ayarlayın
Dağıtım tetikleyicisi, toplu iş boyutu veya bekleme süresi eşiklerinden herhangi biri aşıldığında devreye girer. İş yükünüzle uyumlu olması için her iki parametreyi de uygun şekilde ayarlayın:
Yüksek aktarım hızı gerektiren senaryolar --
ConsumeMessageBatchMaxSizedeğerini büyük bir sayıya (örneğin, 128 veya 256) veBatchConsumeMaxAwaitDurationInSecondsdeğerini kısa bir aralığa (örneğin, 1--5 saniye) ayarlayın. Bu yapı, tam bir toplu işin oluşmasını beklemeden sık sık dağıtım yapılmasını sağlar.Düşük aktarım hızı gerektiren senaryolar -- Çok küçük toplu işlerin dağıtılmasını önlemek için orta düzeyde bir toplu iş boyutu (örneğin, 32) ve daha uzun bir bekleme süresi (örneğin, 10--30 saniye) belirleyin.
Örnek: ConsumeMessageBatchMaxSize değeri 128 ve BatchConsumeMaxAwaitDurationInSeconds değeri 1 olarak ayarlandığında, 128'den az mesaj birikmiş olsa bile 1 saniye sonra bir toplu iş dağıtımı gerçekleşir. Bu durumda, geri arama yöntemindeki messages.size() değeri 128'den küçük döner.
Tüketim idempotensini uygulayın
Daha iyi bir toplu tüketim sağlamak için, bir mesajın yalnızca bir kez işlendiğinden emin olmak amacıyla tüketici istemcinizde mesaj idempotensi uygulayın. Daha fazla bilgi için bkz. Tüketim idempotensi.