Todos os produtos
Search
Central de documentação

ApsaraMQ for RocketMQ:Batch consumption

Última atualização: Oct 09, 2026

O consumo em lote entrega várias mensagens a uma thread consumidora em um único despacho, em vez de uma por vez. Isso reduz a sobrecarga de chamadas de procedimento remoto (RPC) para sistemas downstream e aumenta o throughput de mensagens.

Como funciona

Um consumidor push gerencia o consumo em lote em duas etapas:

  1. Coleta e cache -- As threads de pull recuperam mensagens do ApsaraMQ for RocketMQ por meio de long polling e as armazenam em cache localmente.

  2. Despacho -- O consumidor push encaminha o lote para processamento quando as mensagens em cache atingem o limite de tamanho ou de tempo de espera.

batch_consume

Nota

O ApsaraMQ for RocketMQ é compatível com consumidores push e consumidores pull. O consumo em lote aplica-se apenas a consumidores push. Para obter mais informações, consulte

Terms

.

Casos de uso

O consumo em lote é mais eficaz quando os sistemas downstream se beneficiam de operações em lote. Se o objetivo for apenas aumentar o paralelismo, considere primeiro alternativas mais simples, como adicionar instâncias de consumidor ou ajustar o tamanho do pool de threads.

  • Indexação em massa -- Um sistema de pedidos upstream publica mensagens de log indexadas por um cluster Elasticsearch downstream. Cada mensagem aciona uma solicitação RPC (~10 ms). Processar 10 mensagens individualmente leva 100 ms; agrupá-las em uma única chamada de indexação em massa reduz o total para ~10 ms.

  • Inserções em massa no banco de dados -- Uma aplicação insere registros em um banco de dados um por vez com alta frequência de atualização, gerando alta carga. Agrupar 10 registros por inserção e executar o flush a cada 5 segundos reduz a sobrecarga de conexão e a amplificação de escrita.

Limitações

  • O consumo em lote é compatível apenas via TCP. Use a edição comercial do SDK do cliente TCP para Java, versão 1.8.7.3.Final ou posterior. Para consultar as notas de versão e as instruções de download, consulte Release notes.

  • Tamanho máximo do lote: 1.024 mensagens.

  • Tempo máximo de espera entre lotes: 450 segundos.

Parâmetros

Dois parâmetros determinam o momento de envio do lote. O envio é acionado quando qualquer uma das condições é atendida, o que ocorrer primeiro.

Parâmetro

Tipo

Padrão

Intervalo válido

Descrição

ConsumeMessageBatchMaxSize

String

32

1--1.024

Número máximo de mensagens por lote. Quando o número de mensagens em cache atinge esse valor, o SDK encaminha o lote para uma thread consumidora imediatamente.

BatchConsumeMaxAwaitDurationInSeconds

String

0

0--450

Tempo máximo de espera em segundos. Após esse intervalo, o SDK encaminha as mensagens acumuladas, mesmo que o lote não tenha atingido o tamanho máximo.

Código de exemplo

Configure o consumo em lote por meio das Properties passadas para ONSFactory.createBatchConsumer(). O callback BatchMessageListener recebe uma List<Message> contendo até ConsumeMessageBatchMaxSize mensagens.

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

Práticas recomendadas

Ajuste o tamanho do lote e o tempo de espera em conjunto

O sistema aciona o envio quando o lote atinge o tamanho máximo ou o tempo de espera limite. Defina ambos os parâmetros de acordo com a carga de trabalho:

  • Cenários de alto throughput -- Defina ConsumeMessageBatchMaxSize com um valor alto (por exemplo, 128 ou 256) e BatchConsumeMaxAwaitDurationInSeconds com um intervalo curto (por exemplo, 1--5 segundos). Isso despacha os lotes frequentemente sem esperar o lote completar.

  • Cenários de baixo throughput -- Defina um tamanho de lote moderado (por exemplo, 32) com um tempo de espera maior (por exemplo, 10--30 segundos) para evitar enviar lotes muito pequenos.

Exemplo: Com ConsumeMessageBatchMaxSize definido como 128 e BatchConsumeMaxAwaitDurationInSeconds definido como 1, o sistema despacha o lote após 1 segundo, mesmo que o total acumulado seja inferior a 128 mensagens. Nesse caso, messages.size() no callback retorna um valor menor que 128.

Implemente a idempotência de consumo

Para otimizar o consumo em lote, implemente a idempotência de mensagens no cliente consumidor para garantir que cada mensagem seja processada apenas uma vez. Para obter mais informações, consulte Consumption idempotence.

Referências