Pular para o conteúdo principal
Matt DevVamos conversar
Todos os conteúdos

automacao · estudo

Filas mudam completamente a arquitetura de uma automação

Por que transformar registros em transações independentes muda rastreabilidade, reprocessamento, escalabilidade e tratamento de falhas.

Existe uma diferença importante entre dizer:

Minha automação processa 500 registros.

e dizer:

Minha automação possui 500 transações para processar.

As duas frases podem representar o mesmo volume de trabalho.

Arquiteturalmente, porém, elas podem representar soluções muito diferentes.

Quando começamos a trabalhar com filas, deixamos de pensar apenas na execução inteira e passamos a tratar cada unidade de trabalho de forma independente.

Isso muda rastreabilidade, reprocessamento, monitoramento e até a maneira como lidamos com falhas.

O modelo mais simples

Imagine uma automação que lê uma planilha com 500 linhas.

O fluxo pode ser:

  1. abrir o arquivo;
  2. ler os registros;
  3. percorrer as linhas;
  4. processar cada uma;
  5. finalizar.

Para muitos cenários, isso é suficiente.

Não existe nada de errado nesse modelo.

O problema aparece quando o processo cresce em volume, criticidade ou necessidade de controle.

Suponha que o registro 487 falhe.

Precisamos responder:

  • os 486 anteriores foram concluídos?
  • como identificar exatamente o item que falhou?
  • podemos reiniciar a automação sem processar tudo novamente?
  • existem itens posteriores que ainda precisam ser executados?
  • como sabemos quais registros tiveram erro de negócio?
  • conseguimos distribuir o processamento?

Sem uma estrutura adequada, essas perguntas começam a exigir soluções improvisadas.

Pensando em transações

Uma fila muda a unidade de raciocínio.

Em vez de uma execução contendo centenas de registros, cada registro passa a ser uma transação.

Uma transação pode possuir:

  • identificador;
  • dados necessários para processamento;
  • status;
  • quantidade de tentativas;
  • resultado;
  • motivo de falha;
  • timestamps;
  • prioridade, quando necessário.

Então o processo deixa de ser apenas:

Ler 500 registros e processar todos.

e passa a ser algo parecido com:

Criar 500 transações.
Processar cada transação independentemente.
Registrar o resultado individual.

É uma diferença simples de explicar, mas importante na prática.

Dispatcher e Performer

Em RPA, um modelo bastante comum separa a criação das transações do processamento.

O primeiro fluxo atua como um Dispatcher.

Ele encontra ou recebe os dados e adiciona os itens à fila.

O segundo atua como Performer.

Ele busca as transações e executa o trabalho.

Simplificando:

Fonte de dados

Dispatcher

Fila

Performer

Sistema de destino

Essa separação oferece algumas vantagens.

O processo responsável por descobrir o trabalho não precisa ser o mesmo que efetivamente executa cada operação.

Falhar um item não significa falhar tudo

Essa talvez seja uma das maiores vantagens.

Se existem 500 transações e uma delas possui um dado inválido, o restante do lote não precisa necessariamente parar.

A transação problemática pode receber um estado específico.

Por exemplo:

Item 1   → Sucesso
Item 2   → Sucesso
Item 3   → Business Exception
Item 4   → Sucesso
...

Isso permite que a automação continue trabalhando.

Depois, o item com problema pode ser analisado individualmente.

Compare isso com uma execução monolítica que lança uma exceção no meio do loop e encerra todo o processo.

É possível evitar esse comportamento sem filas, claro.

Mas filas tornam esse modelo de transação explícito.

Reprocessamento fica mais seguro

Outro benefício aparece quando precisamos repetir algo.

Se sabemos exatamente quais transações falharam, podemos reprocessar apenas essas.

Não precisamos executar novamente os registros que já deram certo.

Isso é especialmente importante quando as operações possuem efeito real em sistemas externos.

Reprocessar tudo sem controle pode provocar:

  • duplicidade;
  • operações repetidas;
  • inconsistência;
  • desperdício de recursos;
  • aumento desnecessário do tempo de execução.

Uma fila bem utilizada ajuda a trabalhar com o estado de cada item.

Ainda assim, ela não elimina a necessidade de idempotência.

A aplicação continua precisando saber o que acontece quando determinada operação é executada mais de uma vez.

Retry ganha contexto

Filas também combinam muito bem com estratégias de retry.

Uma falha temporária pode permitir nova tentativa.

Por exemplo:

Tentativa 1 → Timeout
Tentativa 2 → HTTP 503
Tentativa 3 → Sucesso

O número de tentativas pode ficar associado à própria transação.

Isso é diferente de reiniciar o processo inteiro porque uma operação temporariamente falhou.

Mas retry precisa continuar sendo usado com critério.

Erro de negócio não deveria entrar em retry infinito.

Dado inválido não se corrige tentando cinco vezes.

Uma fila organiza a execução, mas não substitui a classificação adequada das falhas.

Monitoramento muda bastante

Quando cada item possui estado, surgem métricas muito mais úteis.

Podemos acompanhar:

  • quantos itens estão novos;
  • quantos estão em processamento;
  • quantos terminaram com sucesso;
  • quantos falharam;
  • quantos tiveram erro de negócio;
  • quantos precisaram de retry;
  • idade dos itens na fila;
  • tempo médio de processamento.

Isso muda a conversa de:

O robô rodou hoje?

para perguntas melhores:

Quantas transações foram concluídas?

Existem itens acumulados?

Qual é a taxa de falha?

A fila está crescendo mais rápido do que conseguimos processar?

Essa visibilidade é muito valiosa em produção.

Escalabilidade se torna mais natural

Imagine que o volume do processo aumente significativamente.

Se todas as transações são independentes, pode ser possível adicionar mais performers.

Em vez de uma única execução processando tudo:

Fila → Performer 1

podemos ter:

            → Performer 1
Fila        → Performer 2
            → Performer 3

A fila passa a distribuir o trabalho.

Isso não significa que todo processo possa ser paralelizado.

Podem existir limitações no sistema de destino, concorrência, locks, ordem obrigatória ou limites de API.

Mas a arquitetura baseada em transações abre essa possibilidade de maneira muito mais organizada.

Prioridade também pode entrar no desenho

Nem todo item precisa ter a mesma urgência.

Em determinados cenários, filas permitem trabalhar com prioridades.

Por exemplo:

  • operações críticas primeiro;
  • solicitações comuns depois;
  • reprocessamentos em uma prioridade específica.

Esse recurso só deve ser usado quando existe uma regra de negócio real.

Caso contrário, aumenta a complexidade sem necessidade.

Mas ele mostra como uma fila pode funcionar não apenas como armazenamento temporário.

Ela também pode participar da estratégia de execução.

Nem todo dado precisa ir para a fila

Existe outro cuidado importante.

Não é porque estamos usando fila que precisamos copiar todos os dados de origem para dentro dela.

Às vezes, basta armazenar:

  • identificador;
  • referência;
  • tipo da operação;
  • alguns parâmetros necessários.

O restante pode ser recuperado durante o processamento.

Isso depende do processo.

A decisão precisa considerar consistência, disponibilidade da origem e necessidade de auditoria.

Também é importante evitar armazenar dados sensíveis sem necessidade.

Fila não corrige processo mal desenhado

Filas resolvem alguns problemas.

Não todos.

Se uma automação possui lógica confusa, baixa observabilidade ou integração instável, colocar os registros em uma fila não transforma automaticamente a solução em boa arquitetura.

Também não significa que todo processo precisa de uma.

Para um fluxo pequeno, de poucos registros, execução rápida e baixo risco, adicionar infraestrutura de filas pode ser exagero.

Existe um custo:

  • configuração;
  • manutenção;
  • monitoramento;
  • entendimento arquitetural;
  • tratamento de estados.

Como qualquer componente, precisa justificar sua presença.

Quando começo a considerar filas

Alguns sinais me fazem pensar nesse modelo:

  • grande quantidade de registros;
  • necessidade de reprocessamento individual;
  • transações independentes;
  • processo que pode continuar mesmo quando um item falha;
  • necessidade de métricas por item;
  • execução demorada;
  • potencial de paralelização;
  • necessidade de retry controlado;
  • criticidade operacional.

Nenhum desses fatores sozinho obriga a utilização de uma fila.

Mas quanto mais deles aparecem juntos, mais sentido a arquitetura começa a fazer.

A mudança é principalmente mental

Para mim, o maior valor das filas está na forma de pensar o processo.

Sem fila:

Tenho uma automação executando um lote.

Com fila:

Tenho um conjunto de transações com estados individuais.

Essa segunda visão facilita várias decisões.

Falha, retry, observabilidade, escalabilidade e reprocessamento deixam de ser exceções tratadas depois.

Passam a fazer parte do modelo.

Conclusão

Filas não são apenas uma forma de guardar itens para um robô processar.

Elas mudam a unidade de trabalho da automação.

Cada registro passa a ter identidade.

Estado.

Histórico.

Tentativas.

Resultado.

Quando um processo cresce, isso pode representar uma diferença enorme entre uma execução difícil de sustentar e uma solução realmente controlável.

A melhor arquitetura não é aquela que usa mais componentes.

É aquela em que cada componente resolve um problema real.

E quando o problema envolve muitas transações independentes, filas podem mudar completamente a forma de construir a automação.