Tempo limite de visibilidade do Amazon SQS
Quando você recebe uma mensagem de uma fila do Amazon SQS, ela permanece na fila, mas fica temporariamente invisível para outros consumidores. Essa invisibilidade é controlada pelo tempo limite de visibilidade, o que garante que outros consumidores não possam processar a mesma mensagem enquanto você estiver trabalhando nela. O Amazon SQS oferece duas opções para excluir mensagens após o processamento:
-
Exclusão manual: você exclui mensagens explicitamente usando a ação
DeleteMessage. -
Exclusão automática: compatível com determinados AWS SDKs, as mensagens são excluídas automaticamente após o processamento bem-sucedido, simplificando os fluxos de trabalho.
Casos de uso do tempo limite de visibilidade
Gerencie tarefas de longa duração: use o tempo limite de visibilidade para lidar com tarefas que exigem tempos de processamento prolongados. Defina um tempo limite de visibilidade adequado para mensagens que exigem um tempo de processamento prolongado. Isso garante que outros consumidores não captem a mesma mensagem enquanto ela está sendo processada, evitando trabalho duplicado e mantendo a eficiência do sistema.
Implemente mecanismos de repetição: estenda o tempo limite de visibilidade programaticamente para tarefas que não foram concluídas dentro do tempo limite inicial. Se uma tarefa não for concluída dentro do tempo limite de visibilidade inicial, você poderá estender o tempo limite programaticamente. Isso permite que seu sistema tente processar novamente a mensagem sem que ela se torne visível para outros consumidores, melhorando a tolerância a falhas e a confiabilidade. Combine com filas de mensagens não entregues (DLQs) para gerenciar falhas persistentes.
Coordene sistemas distribuídos: use o tempo limite de visibilidade do SQS para coordenar tarefas em sistemas distribuídos. Defina tempos limite de visibilidade que se alinhem aos tempos de processamento esperados para diferentes componentes. Isso ajuda a manter a consistência e evita condições de corrida em arquiteturas complexas e distribuídas.
Otimize a utilização de recursos: ajuste os tempos limite de visibilidade do SQS para otimizar a utilização de recursos em sua aplicação. Ao definir tempos limite apropriados, você pode garantir que as mensagens sejam processadas com eficiência sem consumir recursos desnecessariamente. Isso leva a um melhor desempenho geral do sistema e à melhor relação custo-benefício.
Como definir e ajustar o tempo limite
O tempo limite de visibilidade começa assim que uma mensagem é entregue a você. Durante esse período, espera-se que você processe e exclua a mensagem. Se você não excluir a mensagem antes que o tempo limite de visibilidade expire, ela ficará visível novamente na fila e poderá ser recuperada por outro consumidor. O tempo limite de visibilidade padrão para uma fila é de 30 segundos, mas você pode ajustá-lo para corresponder ao tempo que a aplicação precisa para processar e excluir uma mensagem. Você também pode definir um tempo limite de visibilidade específico para mensagens individuais sem alterar a configuração geral da fila. Use a ação ChangeMessageVisibility para estender ou reduzir programaticamente o tempo limite conforme necessário.
Cotas e mensagens em trânsito
No Amazon SQS, as mensagens em trânsito são aquelas que foram recebidas por um consumidor, mas ainda não foram excluídas. Para filas padrão, há um limite de aproximadamente 120 mil mensagens em trânsito, dependendo do tráfego da fila e do acúmulo de mensagens. Se esse limite for atingido, o Amazon SQS retornará um erro OverLimit, indicando que nenhuma mensagem adicional pode ser recebida até que algumas mensagens em trânsito sejam excluídas. Para filas FIFO, os limites dependem dos grupos de mensagens ativos.
-
Ao usar sondagem curta: se esse limite for atingido ao usar a sondagem curta, o Amazon SQS retornará um erro
OverLimit, indicando que nenhuma mensagem adicional pode ser recebida até que algumas mensagens em trânsito sejam excluídas. -
Ao usar sondagem longa: se você estiver usando a sondagem longa, o Amazon SQS não retornará um erro quando o limite de mensagens em trânsito for atingido. Em vez disso, ele não retornará nenhuma mensagem nova até que o número de mensagens em trânsito fique abaixo do limite.
Para gerenciar as mensagens em trânsito de forma eficaz:
-
Exclusão imediata: exclua as mensagens (manual ou automaticamente) após o processamento para reduzir a contagem em trânsito.
-
Monitore com o CloudWatch: defina alarmes para altas contagens em trânsito para evitar que o limite seja atingido.
-
Distribua a carga: se você estiver processando um grande volume de mensagens, use filas ou consumidores adicionais para equilibrar a carga e evitar gargalos.
-
Solicite um aumento de cota: envie uma solicitação ao AWSSupport se forem necessários limites maiores.
Compreender o tempo limite de visibilidade em filas FIFO e padrão
Tanto nas filas padrão quanto nas FIFO, o tempo limite de visibilidade ajuda a evitar que vários consumidores processem a mesma mensagem simultaneamente. No entanto, devido ao modelo de entrega de pelo menos uma vez do Amazon SQS, não há garantia absoluta de que uma mensagem não seja entregue mais de uma vez durante o período de tempo limite de visibilidade.
-
Filas padrão: o tempo limite de visibilidade em filas padrão ajuda a evitar que vários consumidores processem a mesma mensagem simultaneamente. No entanto, devido ao modelo de entrega de pelo menos uma vez, o Amazon SQS não garante que uma mensagem não será entregue mais de uma vez durante o período de tempo limite de visibilidade.
-
Filas FIFO: para filas FIFO, as mensagens com o mesmo ID de grupo de mensagens são processadas em uma sequência estrita. Quando uma mensagem com um ID de grupo de mensagens está em trânsito, as mensagens subsequentes desse grupo não são disponibilizadas até que a mensagem em andamento seja excluída ou o tempo limite de visibilidade expire. No entanto, isso não “bloqueia” o grupo indefinidamente; cada mensagem é processada em sequência e somente quando cada mensagem for excluída ou se tornar visível novamente é que a próxima mensagem desse grupo estará disponível para os consumidores. Essa abordagem garante o processamento ordenado dentro do grupo sem impedir desnecessariamente que o grupo entregue mensagens.
Tratamento de falhas
Se você não processar e excluir uma mensagem antes que o tempo limite de visibilidade expire, devido a problemas como erros na aplicação, falhas ou problemas de conectividade, a mensagem voltará a ficar visível na fila. Então, ela poderá ser recuperada pelo mesmo consumidor ou por um consumidor diferente para outra tentativa de processamento. Isso garante que as mensagens não sejam perdidas mesmo se o processamento inicial falhar. No entanto, definir um tempo limite de visibilidade muito alto poderá atrasar o reaparecimento de mensagens não processadas, possivelmente retardando as novas tentativas. É essencial definir um tempo limite de visibilidade adequado com base no tempo de processamento esperado para o gerenciamento em tempo das mensagens.
Alterar e encerrar o tempo limite de visibilidade
Você pode alterar ou encerrar o tempo limite de visibilidade usando a ação ChangeMessageVisibility:
-
Alterando o tempo limite: ajuste o tempo limite de visibilidade dinamicamente usando
ChangeMessageVisibility. Isso permite que você estenda ou reduza as durações de tempo limite para atender às necessidades de processamento. -
Encerrando o tempo limite: se você decidir não processar uma mensagem recebida, encerre o tempo limite de visibilidade definindo o
VisibilityTimeoutcomo 0 segundos por meio da açãoChangeMessageVisibility. Isso disponibiliza imediatamente a mensagem para que outros consumidores possam processá-la.
Práticas recomendadas
Use as práticas recomendadas a seguir para gerenciar os tempos limite de visibilidade no Amazon SQS, incluindo definir, ajustar e estender os tempos limite, bem como lidar com mensagens não processadas usando filas de mensagens não entregues (DLQs).
-
Defina e ajuste o tempo limite. Comece definindo o tempo limite de visibilidade para corresponder ao tempo máximo que a aplicação geralmente precisa para processar e excluir uma mensagem. Se você não tiver certeza sobre o tempo exato de processamento, comece com um tempo limite menor (por exemplo, dois minutos) e estenda-o conforme necessário. Você pode implementar um mecanismo de pulsação para estender periodicamente o tempo limite de visibilidade, garantindo que a mensagem permaneça invisível até que o processamento seja concluído. Isso minimiza os atrasos no reprocessamento de mensagens não tratadas e evita a visibilidade prematura.
-
Extensão do tempo limite e gerenciamento do limite de 12 horas. Se o tempo de processamento variar ou exceder o tempo limite inicialmente definido, use a ação
ChangeMessageVisibilitypara estender o tempo limite de visibilidade enquanto processa a mensagem. Lembre-se de que o tempo limite de visibilidade tem um limite máximo de 12 horas a partir do momento em que a mensagem é recebida pela primeira vez. Estender o tempo limite não redefine esse limite de 12 horas. Se o processamento exigir mais tempo do que esse limite, considere usar o AWS Step Functions ou dividir a tarefa em etapas menores. -
Gerenciamento de mensagens não processadas. Para gerenciar mensagens que falham em várias tentativas de processamento, configure uma fila de mensagens não entregues (DLQ). Isso garante que as mensagens que não puderem ser processadas após várias tentativas sejam capturadas separadamente para análise ou gerenciamento adicionais, evitando que elas circulem repetidamente na fila principal.