O tempo de vida (TTL) da mensagem determina quanto tempo ela permanece em uma fila antes que o ApsaraMQ for RabbitMQ a descarte. Use o TTL de mensagem para limpar automaticamente mensagens não consumidas e evitar acúmulo nas filas.
Como funciona
Quando uma mensagem permanece em uma fila além do TTL configurado, o ApsaraMQ for RabbitMQ a remove. O comportamento subsequente depende da configuração de um dead-letter exchange:
Sem dead-letter exchange configurado: O sistema descarta a mensagem permanentemente. Não é possível entregá-la aos consumidores nem recuperá-la por meio de
basic.get.Com dead-letter exchange configurado: O sistema roteia a mensagem para o dead-letter exchange, que a encaminha à dead-letter queue associada. Recupere as mensagens expiradas dessa fila para inspeção ou reprocessamento. Para mais detalhes, consulte Dead-letter exchanges.
Casos de uso
O TTL de mensagem evita o acúmulo de mensagens durante picos de tráfego. Se não for necessário armazenar mensagens expiradas, defina um TTL para descartá-las automaticamente em vez de permitir que se acumulem na fila.
Conceitos principais
TTL por fila vs. TTL por mensagem
O ApsaraMQ for RabbitMQ oferece suporte a dois níveis de TTL:
|
Nível |
Escopo |
Argumento |
Tipo de valor |
|
Por fila |
Aplica-se a todas as mensagens da fila |
|
Inteiro não negativo (milissegundos) |
|
Por mensagem |
Aplica-se a uma única mensagem publicada |
|
String que representa um inteiro não negativo (milissegundos) |
Se ambos forem definidos, o menor valor prevalece.
O ApsaraMQ for RabbitMQ não permite definir o TTL de mensagem por meio do parâmetropolicyda ferramentarabbitmqctl. Em vez disso, use o argumento de filax-message-ttlou a propriedade de mensagemexpiration.
TTL com mensagens atrasadas
Para mensagens atrasadas, o TTL efetivo é calculado da seguinte forma:
Actual TTL = min(per-message TTL, per-queue TTL) + delay time
Para mais informações, consulte Mensagens atrasadas.
Valor máximo de TTL
O valor máximo de TTL corresponde ao intervalo agendado para envio de mensagens programadas na instância.
TTL definido como zero
Definir o TTL como 0 faz com que o sistema descarte as mensagens ou as encaminhe ao dead-letter exchange, a menos que um consumidor as receba imediatamente.
Defina o TTL da mensagem
Defina o TTL por fila no console
Especifique o TTL da mensagem ao criar uma fila no console do ApsaraMQ for RabbitMQ. Para mais detalhes, consulte Gerencie filas.
Defina o TTL por fila via API
Chame a operação CreateQueue no OpenAPI Explorer para crie uma fila com o TTL de mensagem configurado.
Defina o TTL com um SDK open source do RabbitMQ
Use qualquer SDK compatível para definir o TTL no nível da fila ou da mensagem.
Os exemplos Java a seguir demonstram como definir x-message-ttl durante a declaração da fila e expiration em mensagens individuais.
TTL por fila (aplica-se a todas as mensagens da fila):
Map<String, Object> args = new HashMap<String, Object>();
// Set TTL to 1000 milliseconds (1 second) for all messages in this queue
args.put("x-message-ttl", 1000);
channel.queueDeclare("myqueue", false, false, false, args);
TTL por mensagem (aplica-se a uma única mensagem publicada):
byte[] messageBodyBytes = "test".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
// Set TTL to 1000 milliseconds (1 second) for this message only
.expiration("1000")
.build();
channel.basicPublish("my-exchange", "my-routing-key", properties, messageBodyBytes);
Quando o TTL por fila e o TTL por mensagem são definidos simultaneamente, o menor valor prevalece.
Substitua o nome do exchange, a chave de roteamento e os valores de TTL pela sua configuração real.
Próximos passos
Dead-letter exchanges -- Gerencie mensagens expiradas em vez de descartá-las
Mensagens atrasadas -- Agende mensagens para entrega futura
SDKs compatíveis -- Encontre exemplos de SDK em outras linguagens