Arquitetura de IA

Visibility timeout em filas de agentes de IA

Veja como configurar visibility timeout em filas de agentes de IA, renovar a posse, confirmar efeitos e evitar processamento duplicado na operação.

A tarefa continuou, mas a fila entregou outra cópia

Um agente retira da fila um pedido para analisar documentos e atualizar um cadastro. A leitura dos arquivos demora mais que o esperado. Antes de o worker terminar, o prazo de invisibilidade da mensagem vence. A fila entrega a mesma unidade para outro worker.

As duas execuções agora trabalham sobre o mesmo pedido. Uma grava o resultado. A outra termina segundos depois e também tenta gravar. O problema começou antes da duplicidade: a arquitetura perdeu a noção de quem ainda possuía o direito temporário de processar aquela mensagem.

Visibility timeout é o intervalo em que uma mensagem recebida fica indisponível para outros consumidores. Em serviços que usam termos como acknowledgment deadline, message lock ou lease, o mecanismo cumpre função parecida: reservar temporariamente a unidade enquanto um consumidor trabalha.

A reserva reduz processamento concorrente da mesma mensagem. Ela não garante execução única, não confirma efeito externo e não substitui idempotência. O desenho seguro combina posse temporária, renovação controlada, confirmação do resultado e recuperação depois da perda da posse.

O que acontece entre receber e concluir

Uma fila com entrega pelo menos uma vez costuma separar quatro momentos:

  1. a mensagem fica disponível;
  2. um consumidor recebe a mensagem e obtém uma posse temporária;
  3. o consumidor processa a unidade;
  4. depois da conclusão válida, ele confirma ou remove a mensagem.

Se o consumidor falha antes da confirmação, a mensagem volta a ficar disponível. Essa reentrega permite recuperar trabalho depois de queda, indisponibilidade ou reinício.

O mesmo mecanismo também abre uma janela de duplicidade. A execução antiga pode continuar viva depois de perder a posse. A mensagem pode ser entregue outra vez. Uma confirmação pode chegar tarde. Por isso, o prazo da fila organiza disponibilidade, mas a aplicação ainda precisa controlar efeitos.

Na documentação do Amazon SQS, a mensagem recebida fica temporariamente invisível para outros consumidores. A exclusão ocorre depois do processamento. O Google Cloud Pub/Sub usa acknowledgment deadline e permite estender esse prazo por mensagem. Os nomes mudam; a decisão operacional permanece: por quanto tempo o sistema considera que um consumidor ainda trabalha sobre a unidade.

Visibility timeout, timeout de execução e prazo de negócio

Misturar esses relógios produz configurações frágeis.

Visibility timeout protege a posse da mensagem

Ele define quando outra execução pode receber a unidade. Um prazo curto demais aumenta reentregas durante trabalho saudável. Um prazo longo demais demora para recuperar mensagens abandonadas.

Timeout de execução limita o worker

Ele determina quanto tempo a atividade pode continuar antes de ser interrompida ou marcada como falha. Esse limite pertence ao executor ou ao orquestrador, não à fila.

Prazo de negócio limita a utilidade

Uma tarefa pode estar tecnicamente processável e já ter perdido valor. Um follow-up depois do fechamento da oportunidade, uma atualização sobre pedido cancelado ou um relatório depois da reunião exigem expiração ou nova decisão.

Os três prazos precisam conversar. A posse não deveria sobreviver ao prazo útil da tarefa. O worker não deveria continuar depois de perder autoridade. A reentrega não deveria executar uma intenção vencida.

Comece pela distribuição real do tempo de processamento

Escolher um número a partir da média costuma esconder a cauda. Se a maioria das mensagens termina em vinte segundos e uma parcela relevante leva dois minutos, um prazo de trinta segundos criará concorrência justamente nos casos mais difíceis.

Meça por classe de tarefa:

  • espera antes de começar;
  • tempo de leitura e preparação;
  • duração de chamadas ao modelo;
  • duração de ferramentas e APIs;
  • tempo de validação;
  • tempo até confirmação no destino;
  • percentis de duração, além da média;
  • quantidade de renovações;
  • perda de posse durante execução;
  • reentrega e duplicidade observada.

Separe classes com perfis muito diferentes. Um resumo curto e uma análise de cinquenta documentos não deveriam depender da mesma configuração apenas porque chegam pela mesma fila.

A página sobre latência em agentes de IA ajuda a decompor o tempo entre fila, modelo, ferramenta, revisão e confirmação. Para visibility timeout, a medida principal é o período durante o qual o consumidor precisa conservar autoridade sobre a mensagem.

Use renovação para trabalho de duração variável

Quando a duração varia bastante, um prazo fixo grande recupera falhas devagar. Um prazo fixo pequeno provoca reentrega durante execuções legítimas. A renovação permite começar com uma reserva limitada e estendê-la enquanto o worker continua saudável.

O Google Cloud chama esse controle de lease management. As bibliotecas de alto nível podem estender periodicamente o acknowledgment deadline de mensagens ainda não confirmadas. No Amazon SQS, a aplicação pode alterar o visibility timeout durante o processamento.

Uma política de renovação precisa declarar:

  • intervalo esperado entre renovações;
  • duração de cada extensão;
  • período total máximo de posse;
  • estado mínimo que prova progresso;
  • comportamento quando a renovação falha;
  • momento em que novas ações ficam proibidas;
  • destino da unidade depois do teto.

Renovar apenas porque o processo ainda existe pode esconder workers travados. A extensão deve acompanhar progresso observável, como lote concluído, etapa alterada ou checkpoint persistido.

Pare de agir quando a posse for perdida

O caso perigoso ocorre quando o worker perde a reserva e continua executando. Outro consumidor pode receber a mesma mensagem, enquanto o primeiro ainda possui credenciais e contexto para produzir efeitos.

Ao detectar perda de posse, a execução deve:

  1. impedir novas chamadas externas;
  2. preservar o último estado confiável;
  3. registrar a etapa e o motivo;
  4. não confirmar a mensagem;
  5. identificar efeitos já iniciados;
  6. encaminhar estados incertos para reconciliação;
  7. encerrar ou aguardar uma decisão explícita.

Essa regra precisa existir no código que chama ferramentas. Uma instrução no prompt não retira autoridade técnica de um worker antigo.

Quando o sistema de destino aceita controle de versão ou token de cercamento, use essa proteção perto da escrita. O artigo sobre controle de concorrência em agentes de IA detalha como impedir que uma execução com posse vencida altere o estado atual.

Confirme a mensagem somente depois do resultado válido

Confirmar cedo demais transforma uma falha posterior em perda de trabalho. Confirmar tarde demais aumenta a chance de reentrega mesmo depois da conclusão.

Defina o que conta como conclusão para cada unidade. Em uma atualização de CRM, pode exigir:

  • saída validada;
  • política aplicada;
  • escrita aceita pelo CRM;
  • identificador do registro retornado;
  • consulta ou confirmação do estado final;
  • evidência persistida;
  • próxima ação conhecida.

Gerar um texto correto ainda não concluiu a tarefa quando a responsabilidade inclui alterar um sistema.

Também evite usar a confirmação da fila como prova de que o destino mudou. A fila conhece o estado da mensagem. O CRM, ERP, agenda ou sistema financeiro conhece o efeito empresarial.

Idempotência continua obrigatória

Mesmo com o prazo bem configurado, reentregas podem acontecer. Serviços de fila documentam comportamentos de entrega que exigem tolerância a duplicidade. Queda de rede, confirmação tardia, renovação perdida e reinício do consumidor continuam possíveis.

Associe cada efeito a uma chave estável, por exemplo:

tipo_de_fluxo + unidade_de_trabalho + etapa + versao_da_intencao

Antes de criar outra consequência, consulte o registro de processamento ou o sistema de destino. Se a ação já ocorreu, ligue a nova entrega ao efeito existente. Se o resultado ficou incerto, reconcilie antes de repetir.

O guia de idempotência em agentes de IA cobre a diferença entre comando enviado, efeito produzido e confirmação recebida.

Modele estados que expliquem a posse

Um status genérico processando não mostra se a execução ainda possui autoridade.

Use campos e estados como:

  • mensagem_recebida;
  • posse_valida_ate;
  • worker_id;
  • tentativa;
  • ultima_renovacao;
  • ultimo_checkpoint;
  • efeito_nao_iniciado;
  • efeito_em_confirmacao;
  • concluido_confirmado;
  • posse_perdida;
  • reentrega_detectada;
  • exige_reconciliacao;
  • expirado_por_validade.

Registre o identificador empresarial separado do identificador técnico da mensagem. Uma reentrega pode receber outro contexto técnico e continuar representando o mesmo pedido, oportunidade ou documento.

Exemplo: análise de documentos em segundo plano

Considere um agente que analisa um pacote de documentos e prepara campos para revisão.

Entrada

A mensagem contém caso_id, versão, referências protegidas dos arquivos, prazo e tipo de análise. Os documentos não são copiados integralmente para a fila.

Recebimento

O worker registra a tentativa, obtém a posse e verifica se o caso permanece aberto. Se outra execução já concluiu a mesma versão, encerra sem repetir.

Processamento

O trabalho ocorre em lotes. Depois de cada lote, o worker persiste checkpoint e renova a posse. O checkpoint guarda IDs processados, pendências e versão das instruções.

Escrita

Antes de salvar o resultado, o worker confirma que a posse continua válida e que o caso não mudou. A escrita usa versão esperada e chave idempotente.

Confirmação

A mensagem só é confirmada depois que o destino retorna o identificador e o sistema registra a evidência da conclusão.

Perda de posse

Se a renovação falha, o worker para antes de nova escrita. Uma chamada já enviada segue para confirmação ou reconciliação. A entrega seguinte retoma do checkpoint e consulta o destino antes de repetir.

Esse fluxo trata a fila como transporte durável. A verdade do caso e o controle dos efeitos permanecem nos sistemas responsáveis.

Erros comuns

Definir um prazo enorme para evitar duplicidade

O prazo grande reduz algumas reentregas, mas atrasa a recuperação quando o worker morre. Também mantém muitas mensagens em voo e pode esconder tarefas travadas.

Renovar sem comprovar progresso

Um processo vivo pode estar preso em loop, esperando uma dependência ou repetindo a mesma etapa. Renove com estado e teto.

Confirmar logo após receber

A fila perde a capacidade de recuperar a unidade se o worker falhar. Esse padrão só cabe quando outro mecanismo durável já assumiu integralmente o trabalho e a transferência foi confirmada.

Confiar que a fila entrega uma vez

A arquitetura deve tolerar reentrega. Mesmo recursos de exactly-once possuem escopo e condições próprias; eles não tornam efeitos externos automaticamente idempotentes.

Misturar posse da mensagem com aprovação de negócio

O worker pode possuir a mensagem e continuar sem autoridade para aprovar desconto, enviar comunicação ou alterar pagamento. A fila governa processamento técnico, não alçada empresarial.

Ignorar o trabalho depois da perda da posse

A execução antiga pode continuar. Sem verificação de autoridade perto da ferramenta, duas cópias alcançam o destino.

Métricas para operar o mecanismo

Acompanhe:

  • mensagens recebidas e confirmadas;
  • tempo de processamento por classe;
  • percentis de duração;
  • renovações por mensagem;
  • falhas de renovação;
  • perda de posse durante execução;
  • reentregas;
  • duas execuções ativas para a mesma unidade;
  • efeitos duplicados bloqueados;
  • efeitos duplicados que escaparam;
  • mensagens confirmadas sem resultado válido;
  • tempo até recuperar tarefa abandonada;
  • unidades vencidas antes da conclusão;
  • casos enviados para reconciliação;
  • volume em voo por fila e consumidor.

O alerta útil informa a consequência: “o worker perdeu a posse do pedido P-482 antes da atualização; nenhuma escrita nova foi permitida; o caso aguarda reconciliação”.

Checklist de visibility timeout

  • [ ] Cada mensagem representa uma unidade empresarial identificável?
  • [ ] O tempo de processamento foi medido por classe e percentil?
  • [ ] O prazo inicial equilibra reentrega rápida e execução normal?
  • [ ] Tarefas variáveis renovam a posse com progresso observável?
  • [ ] Existe período total máximo de renovação?
  • [ ] O worker para de produzir efeitos depois da perda da posse?
  • [ ] Checkpoints permitem retomada útil?
  • [ ] Escritas externas usam idempotência e controle de versão?
  • [ ] A confirmação ocorre somente depois do resultado válido?
  • [ ] Estado incerto segue para reconciliação?
  • [ ] Prazo de negócio pode expirar uma mensagem antiga?
  • [ ] Reentrega, perda de posse e duplicidade fazem parte dos testes?
  • [ ] Métricas ligam a mensagem ao objeto e ao efeito empresarial?

A fila precisa saber quando devolver o trabalho

Visibility timeout cria uma posse temporária, não uma garantia de exclusividade permanente. O prazo precisa acompanhar o tempo real da tarefa, ser renovado somente enquanto existe progresso e perder autoridade de forma efetiva quando expira.

Com confirmação tardia, idempotência, checkpoints e bloqueio de workers antigos, a reentrega volta a cumprir sua função: recuperar trabalho abandonado sem transformar duas execuções em duas consequências.

Fontes oficiais verificadas em 24 de setembro de 2026: