Time To Live (TTL) no RabbitMQ

Introdução

TTL define um tempo de expiração para mensagens em filas. Se a mensagem não for consumida dentro do tempo especificado, ela é automaticamente removida da fila.


Dois Tipos de TTL

TTL por Mensagem (Individual)

Define o tempo de vida no momento em que a mensagem é publicada.

var props = channel.CreateBasicProperties();
props.Expiration = "10000"; // 10 segundos
 
await channel.BasicPublishAsync(
    exchange: "",
    routingKey: queueName,
    basicProperties: props,
    body: body
);

Características

  • A propriedade Expiration é definida em milissegundos.
  • Esse TTL é aplicado somente à mensagem enviada, não afeta as demais.

TTL por Fila (Padrão para Todas as Mensagens)

Define um TTL padrão para todas as mensagens na fila.

var args = new Dictionary<string, object>();
args.Add("x-message-ttl", 22000); // 22 segundos
 
await channel.QueueDeclareAsync(
    queue: "test_time_to_live",
    durable: false,
    exclusive: false,
    autoDelete: false,
    arguments: args
);

Características

  • O argumento x-message-ttl é configurado na criação da fila.
  • Todas as mensagens publicadas nesta fila terão o mesmo TTL, a menos que um TTL individual seja fornecido na mensagem.

Quando Usar TTL?

TTL é útil quando:

  • Você deseja garantir que mensagens antigas não sejam processadas.
  • Você precisa evitar reprocessamento desnecessário.
  • Mensagens antigas perdem o valor, como:
    • Atualizações de GPS.
    • Notificações de tempo real.
    • Solicitações de expiração (como tokens temporários).

Funcionamento Prático

  • Se nenhuma consumidor processar a mensagem dentro do TTL, ela desaparece da fila.
  • Isso evita loops desnecessários e uso indevido de recursos.
  • Ao configurar TTL por fila, o RabbitMQ não mostra a propriedade de expiração na mensagem — o valor está atrelado à configuração da fila.

Considerações

  • TTL de mensagem tem prioridade sobre TTL da fila.
  • A configuração de TTL em milissegundos deve ser precisa, respeitando o intervalo necessário para a lógica de negócio.
  • TTL não garante ordenação nem confirmação de entrega — é uma estratégia de expiração passiva.