Tüm Ürünler
Search
Belge Merkezi

ApsaraMQ for RocketMQ:Batch consumption

Son Güncelleme:Oct 09, 2026

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:

  1. Ç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.

  2. 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.

batch_consume

Not

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.

Kavramlar

.

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();
        }
    }
}
Not

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 -- ConsumeMessageBatchMaxSize değerini büyük bir sayıya (örneğin, 128 veya 256) ve BatchConsumeMaxAwaitDurationInSeconds değ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.

İlgili kaynaklar