Todos os produtos
Search
Central de documentação

ApsaraMQ for RabbitMQ:Delayed messages

Última atualização: Jun 28, 2026

Uma mensagem com atraso é entregue aos consumidores somente após um período especificado. O ApsaraMQ for RabbitMQ oferece suporte nativo a mensagens com atraso e é totalmente compatível com as abordagens do RabbitMQ open source, sem necessidade de alterações de código para migração.

Casos de uso

  • Tratamento de timeout de pedidos: Após criar um pedido, envie uma mensagem com atraso de 30 minutos. Ao receber a mensagem, o consumidor verifica se o pagamento foi concluído; caso contrário, encerra o pedido.

  • Notificações agendadas: Acione tarefas em um momento futuro, como enviar um lembrete 24 horas antes de um compromisso.

  • Nova tentativa com backoff: Reenfileire mensagens com falha usando atrasos progressivamente maiores (por exemplo, 1s, 2s, 4s, 8s) para evitar sobrecarga nos serviços downstream.

Como funciona

A solução nativa de mensagens com atraso não exige instalação de plug-ins nem topologia de dead-letter exchange:

  1. O produtor publica uma mensagem com o cabeçalho delay em um exchange.

  2. O exchange roteia a mensagem para uma fila.

  3. Os consumidores recebem a mensagem apenas após o término do período de atraso.

Delayed message flow

Escolha uma abordagem

O ApsaraMQ for RabbitMQ suporta quatro abordagens de mensagens com atraso. Todas as abordagens do RabbitMQ open source funcionam sem alterações de código.

Abordagem

RabbitMQ open source

ApsaraMQ for RabbitMQ

Compensações

Mensagem com atraso nativa

Não suportado

Suportado

Configuração mais simples. Defina um único cabeçalho; nenhum exchange ou fila extra é necessário. Sem bloqueio de cabeça de fila.

Plug-in de mensagem com atraso open source

Suportado (requer instalação de plug-in)

Suportado (sem necessidade de instalação)

Compatível com código open source existente. Exige a declaração de um tipo especial de exchange (x-delayed-message).

Dead-letter exchange + TTL no nível da fila

Suportado

Suportado

Todas as mensagens em uma fila compartilham o mesmo atraso. Sujeito a bloqueio de cabeça de fila: as mensagens devem expirar em ordem FIFO.

Dead-letter exchange + TTL no nível da mensagem

Suportado

Suportado

Permite atrasos por mensagem individual, mas ainda sujeito a bloqueio de cabeça de fila dentro da fila.

O bloqueio de cabeça de fila significa que as mensagens em uma fila devem expirar em ordem. Uma mensagem com TTL menor não pode expirar antes de uma mensagem anterior com TTL maior, o que pode causar atrasos inesperados.

Para novas implementações, use a abordagem nativa de mensagens com atraso. Ela possui a configuração mais simples e evita o bloqueio de cabeça de fila.

Observações de uso

Período de atraso

  • O valor do atraso deve ser um número inteiro não negativo em milissegundos.

  • Se o atraso exceder o máximo permitido para o tipo da sua instância, a mensagem será entregue imediatamente como uma mensagem normal. Para valores máximos de atraso, consulte Limites do cluster.

Interação com TTL

Quando o time-to-live (TTL) é configurado para mensagens com atraso, o TTL real é calculado da seguinte forma:

Actual message TTL = min(message-level TTL, queue-level TTL) + delay period

Para obter mais informações, consulte TTL de mensagem.

Modo de consumidor

Use basic.consume (modo push) em vez de basic.get (modo pull). O ApsaraMQ for RabbitMQ armazena mensagens em nós distribuídos. No modo pull, o consumidor pode não alcançar o nó que contém a mensagem com atraso, causando entrega posterior ao esperado.

Enviar mensagens com atraso (abordagem nativa)

Adicione uma chave delay aos cabeçalhos da mensagem com o valor do atraso em milissegundos como string.

A abordagem nativa usa a chave de cabeçalho delay com valor string (por exemplo, "5000" ), enquanto a abordagem de plug-in open source usa x-delay com valor inteiro (por exemplo, 5000 ).
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

// Establish a connection to the ApsaraMQ for RabbitMQ instance
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("<your-instance-endpoint>");
factory.setPort(5672);
factory.setUsername("<your-access-key>");
factory.setPassword("<your-secret-key>");

Connection connection = factory.newConnection();
Channel channel = connection.createChannel();

// Set the delay to 5000 milliseconds (5 seconds)
Map<String, Object> headers = new HashMap<>();
headers.put("delay", "5000");

AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
    .messageId(UUID.randomUUID().toString())
    .headers(headers)
    .build();

// Publish the delayed message to the target exchange
channel.basicPublish("<exchange-name>", "<routing-key>", props, "order timeout check".getBytes("UTF-8"));

Substitua os seguintes espaços reservados pelos valores reais:

Espaço reservado

Descrição

Exemplo

<your-instance-endpoint>

Endpoint da instância do ApsaraMQ for RabbitMQ

xxxxx.mq-amqp.cn-hangzhou-a.aliyuncs.com

<your-access-key>

Nome de usuário da instância (baseado em AccessKey)

MjoxODgwNTkxODk0NTg3****

<your-secret-key>

Senha da instância

OTRkYjNlNjMwZjM1Nzk4OWFmYTk5MTQ1****

<exchange-name>

Nome do exchange de destino

my-exchange

<routing-key>

Chave de roteamento para a mensagem

order.timeout

Para exemplos de código em outras linguagens, consulte AMQP Demos.

Enviar mensagens com atraso (abordagem de plug-in open source)

O ApsaraMQ for RabbitMQ é compatível com o plug-in de exchange de mensagens com atraso open source. Nenhuma instalação de plug-in é necessária.

Etapa 1: Declarar um exchange de mensagens com atraso

Declare um exchange do tipo x-delayed-message e defina o argumento x-delayed-type para especificar o comportamento de roteamento.

Map<String, Object> args = new HashMap<String, Object>();
args.put("x-delayed-type", "direct");
channel.exchangeDeclare("ExchangeName", "x-delayed-message", true, false, args);

Parâmetro

Descrição

ExchangeName

Nome do exchange. O exchange já deve existir no console do ApsaraMQ for RabbitMQ.

x-delayed-message

Tipo de exchange para roteamento de mensagens com atraso.

x-delayed-type

Algoritmo de roteamento subjacente. Valores válidos: direct, fanout, topic, headers, x-jms-topic.

Etapa 2: Publicar uma mensagem com atraso

Defina o cabeçalho x-delay com o valor do atraso em milissegundos.

byte[] messageBodyBytes = "delayed payload".getBytes("UTF-8");

Map<String, Object> headers = new HashMap<String, Object>();
headers.put("x-delay", 5000);  // Delay for 5000 milliseconds (5 seconds)

AMQP.BasicProperties.Builder props = new AMQP.BasicProperties.Builder().headers(headers);
channel.basicPublish("ExchangeName", "", props.build(), messageBodyBytes);

Perguntas frequentes

Por que minha mensagem é entregue depois do atraso especificado?

Isso geralmente ocorre quando o consumidor usa basic.get (modo pull). O ApsaraMQ for RabbitMQ armazena mensagens em um cluster de nós distribuídos. No modo pull, cada chamada basic.get atinge apenas um nó; portanto, o consumidor pode não puxar imediatamente a mensagem do nó onde ela está armazenada. Alterne para basic.consume (modo push) para receber mensagens assim que o período de atraso terminar.

Próximos passos

  • TTL de mensagem — Configure a expiração das mensagens.

  • Limites do cluster — Verifique o período máximo de atraso para o tipo da sua instância.

  • Crie um exchange — Configure exchanges no console do ApsaraMQ for RabbitMQ.

  • AMQP Demos — Exemplos de código em várias linguagens de programação.