Mensagens agendadas e mensagens com atraso adiam a entrega aos consumidores. A diferença está na definição do tempo:
Mensagem agendada: especifique um timestamp absoluto. O broker retém a mensagem e a entrega exatamente nesse momento.
Mensagem com atraso: defina uma duração relativa. O broker retém a mensagem e a entrega após o término dessa duração, contada a partir do envio.
O mecanismo subjacente é o mesmo. O broker armazena a mensagem e a libera para os consumidores quando o horário-alvo é atingido.
Casos de uso
Tratamento de timeout de pedidos: ao criar um pedido no fluxo de checkout de um e-commerce, envie uma mensagem com atraso de 30 minutos. Após esse período, o consumidor verifica se o pagamento foi concluído. Em caso negativo, cancela o pedido; caso contrário, ignora a mensagem.
Notificações programadas: envie uma mensagem agendada para um horário específico — por exemplo, às 9h do dia seguinte — para acionar uma notificação push ou um lembrete.
Defina o horário de entrega
Ambos os tipos de mensagem usam o mesmo parâmetro: msg.setStartDeliverTime, que aceita um timestamp Unix com precisão de milissegundos.
Mensagem agendada: passe o timestamp absoluto correspondente ao horário de entrega desejado.
Mensagem com atraso: passe
System.currentTimeMillis() + delayMillis, ondedelayMillisrepresenta a duração do atraso em milissegundos.
Exemplos de código
Atrase uma mensagem em 10 minutos a partir do momento atual:
// Calculate the delivery timestamp: current time + 10 minutes
long deliverTime = System.currentTimeMillis() + 10L * 60 * 1000;
msg.setStartDeliverTime(deliverTime);
Agende uma mensagem para uma data e hora específicas:
// Schedule delivery for 2024-06-15 14:30:00 (UTC+8)
// Millisecond Unix timestamp: 1718433000000
long deliverTime = 1718433000000L;
msg.setStartDeliverTime(deliverTime);
Regras e limites
|
Regra |
Detalhes |
|
Horário mínimo de entrega |
Deve ser posterior ao timestamp atual. Se o horário especificado estiver no passado, a mensagem será entregue imediatamente. |
|
Janela máxima de agendamento |
40 dias a partir do momento atual. Mensagens que ultrapassarem esse limite falharão no envio. |
|
Unidade de tempo |
Milissegundos |
|
Requisito de tipo de tópico |
Crie o tópico com o campo Message Type definido como Scheduled/Delayed Message no console do ApsaraMQ for RocketMQ. Um tópico aceita apenas mensagens compatíveis com seu tipo configurado. |
|
Retenção de mensagens |
Até 3 dias. Por exemplo, se uma mensagem estiver agendada para entrega em 5 dias e não for consumida, ela será excluída no 8º dia (5 dias de atraso + 3 dias de retenção). |
Precisão da entrega
Não há garantia de que mensagens agendadas ou com atraso cheguem exatamente no horário especificado devido aos seguintes fatores:
Latência de base: espere uma latência de entrega entre 1 e 2 segundos.
Acúmulo de mensagens: se houver mensagens acumuladas na fila, as mensagens agendadas e com atraso serão enfileiradas atrás delas e poderão chegar após o horário-alvo.
Divergência de relógio: o valor de
StartDeliverTimeé avaliado com base no relógio do broker. Se o relógio do cliente divergir do relógio do broker, o horário real de entrega poderá não corresponder ao timestamp definido pelo produtor.
Código de exemplo
Para exemplos completos de produtores e consumidores, consulte os guias abaixo, organizados por protocolo e linguagem.
TCP
|
Linguagem |
Link |
|
Java |
|
|
Java |
|
|
C++ |
|
|
.NET |
HTTP
|
Linguagem |
Link |
|
Java |
|
|
Go |
|
|
Python |
|
|
Node.js |
|
|
PHP |
|
|
C# |
|
|
C++ |