Guias

Como Executar Tarefas em Segundo Plano numa Aplicação Web: Filas, Agendadores e Cron

Para executar tarefas em segundo plano numa aplicação web, separe primeiro o trabalho em dois tipos. As tarefas disparadas (enviar um email de boas-vindas, processar um upload) podem ser guardadas numa fila de tarefas, muitas vezes uma tabela na base de dados, e tratadas por um worker com novas tentativas. As tarefas agendadas (um relatório noturno, lembretes de 15 em 15 minutos) precisam de algo que dispare num horário: a funcionalidade de cron do alojamento, ou um agendador externo que chama um endpoint protegido na sua app. Torne sempre as tarefas seguras para correr duas vezes, registe as falhas e nunca dependa de um temporizador dentro de um servidor que pode adormecer ou reiniciar.

Este guia explica as opções, quando se aplica cada uma e como configurá-las com um criador de apps com IA, incluindo em alojamentos que escalam para zero.

O que conta como tarefa em segundo plano

Tudo o que é lento, pouco fiável ou desnecessário para a resposta imediata do utilizador:

  • Envio de emails, notificações e recibos
  • Redimensionar imagens, transcodificar vídeo, gerar PDFs
  • Chamar APIs lentas de terceiros, incluindo modelos de IA em tarefas longas
  • Importar ou sincronizar dados de outro sistema
  • Limpezas noturnas, relatórios e lembretes

Fazer isto dentro do pedido torna as páginas lentas e frágeis: se o fornecedor de email estiver em baixo, o registo do utilizador falha. Passá-lo para segundo plano significa que o utilizador recebe uma resposta imediata e a tarefa pode ser repetida.

As opções

OpçãoComo funcionaVantagensDesvantagens
Disparar e continuar no mesmo processoResponde e depois continua o trabalho no servidorSem configuraçãoPerde-se se o servidor parar; sem novas tentativas
Temporizador no processo (setInterval, setTimeout)Um temporizador no servidor em execuçãoTrivialNão corre enquanto está em repouso; duplica-se com várias cópias
Fila em base de dadosTarefas guardadas como linhas; um worker reclama-as e executa-asUsa a base de dados que já tem; durável; fácil de inspecionarTem de construir as novas tentativas e os bloqueios; precisa de algo que execute o worker
Fila dedicada (baseada em Redis ou gerida)Um serviço de filas mais workersFuncionalidades maduras de novas tentativas e agendamentoMais um serviço para executar e pagar
Serviço alojado de tarefas ou fluxosUm terceiro chama os seus endpoints com novas tentativas e horáriosO agendamento e as novas tentativas são tratados por siDependência do fornecedor; outra conta e outra chave
Agendador externo a chamar um endpointUm temporizador noutro sítio envia um pedido HTTP segundo um horárioFunciona em qualquer alojamento, incluindo os que escalam para zeroIntervalos mínimos e atrasos; é preciso proteger o endpoint
Cron integrado do alojamentoA plataforma executa um comando segundo um horárioSimples onde existeNem todos os alojamentos o oferecem

Não há uma resposta única. Uma app pequena precisa muitas vezes apenas de uma fila em base de dados mais um agendador externo.

Porque é que os alojamentos que escalam para zero mudam o cenário

Muitas plataformas modernas põem a sua app em repouso quando ninguém a usa e acordam-na no pedido seguinte. Isso poupa dinheiro, mas um servidor em repouso não executa código: os temporizadores não disparam e os workers não fazem polling. Nestas plataformas, o trabalho agendado tem de começar com um pedido recebido, e a fonte mais fácil desse pedido é um agendador externo. Cada chamada acorda a app (e muitas vezes a base de dados), por isso chamar a cada minuto custa mais do que chamar a cada 15 minutos. Escolha o horário mais espaçado que satisfaça a necessidade.

Padrão 1: uma fila de tarefas em base de dados

Para tarefas disparadas:

  1. Crie uma tabela jobs: tipo, payload (JSON), estado (pending, running, done, failed), tentativas, run_after, last_error, datas.
  2. Quando algo acontece, insira uma linha de tarefa na mesma transação da alteração que a causou, para que ambas tenham sucesso ou falhem juntas.
  3. Um worker escolhe as tarefas devidas, marca-as como running, faz o trabalho e marca-as como done.
  4. Em caso de falha, aumente attempts, defina um run_after mais tarde (por exemplo 1, 5 e depois 30 minutos) e guarde o erro. Ao atingir um máximo, marque-a como failed e alerte alguém.

Se mais do que um worker puder correr em simultâneo, as tarefas têm de ser reclamadas de forma segura. No Postgres, SELECT ... FOR UPDATE SKIP LOCKED permite que cada worker reclame linhas diferentes sem colisões.

O que executa o worker? Num servidor sempre ligado, um ciclo num processo separado. Num alojamento que escala para zero, o endpoint agendado do Padrão 2 pode processar um lote de tarefas devidas em cada chamada.

Padrão 2: um agendador externo a chamar a sua app

Para tarefas agendadas:

  1. Acrescente um endpoint como POST /api/cron/send-reminders.
  2. Proteja-o: exija um token secreto num cabeçalho, guardado como segredo nos dois lados, e recuse tudo o resto.
  3. Torne-o idempotente: correr duas vezes no mesmo minuto não pode enviar dois lembretes. Registe o que já foi enviado.
  4. Mantenha cada chamada curta: processe um lote (por exemplo 100 itens) e deixe a chamada seguinte tratar do resto.
  5. Aponte um agendador para ele.

Escolhas de agendador:

  • Fluxos agendados do GitHub Actions. Gratuitos dentro dos limites de utilização do GitHub. Em setembro de 2026, a documentação do GitHub indica que o intervalo mínimo é de uma vez a cada 5 minutos, que as execuções podem sofrer atrasos em horas de muita carga (sobretudo no início de cada hora), que os agendamentos usam UTC por omissão, e que os fluxos agendados num repositório público são desativados após 60 dias sem atividade no repositório.
  • Serviços de cron alojados. Existem muitos serviços cuja única função é chamar um URL segundo um horário. Verifique a fiabilidade, o intervalo mínimo e os alertas antes de depender de um.
  • O agendador do seu fornecedor de nuvem. Se já usa um grande fornecedor de nuvem, terá um agendador gerido que pode chamar um endpoint HTTPS.
  • Um serviço alojado de tarefas ou fluxos. Combinam agendamento, filas e novas tentativas, e chamam os seus endpoints em cada passo. Compare preços e limites no site de cada fornecedor.

Padrão 3: deixe o fornecedor tratar

Por vezes, a melhor tarefa em segundo plano é nenhuma:

  • Pagamentos. A Stripe volta a tentar as cobranças de subscrições falhadas e envia webhooks; você reage em vez de fazer polling. Veja o que é um webhook.
  • Email. Os fornecedores põem a entrega em fila e repetem-na depois de lhes entregar a mensagem.
  • Trabalho de IA em lote. A OpenAI e a Anthropic oferecem APIs em lote para pedidos não urgentes, que submete e recolhe mais tarde.

Prompts para o seu criador de apps com IA

Para uma fila:

Adiciona uma fila de tarefas em segundo plano usando uma tabela jobs na nossa base de dados (tipo, payload JSON, estado, tentativas, run_after, last_error). Quando um utilizador se regista, insere uma tarefa send_welcome_email na mesma transação, em vez de enviar o email de imediato. Acrescenta uma função processJobs(limit) que reclama as tarefas devidas com SELECT ... FOR UPDATE SKIP LOCKED, as executa e repete as falhas após 1, 5 e 30 minutos, marcando-as como failed após 4 tentativas.

Para um disparo agendado:

Adiciona POST /api/cron/tick protegido por um token bearer do segredo CRON_SECRET; recusa qualquer pedido sem ele. Cada chamada executa processJobs(100) e envia os lembretes de marcações previstos para as próximas 24 horas que ainda não foram enviados, registando os lembretes enviados para que nada seja enviado duas vezes. Devolve um resumo JSON do que correu. Depois escreve um fluxo do GitHub Actions que chame este endpoint a cada 15 minutos, lendo o URL e o token dos segredos do repositório.

Erros comuns

  • Confiar no setInterval. Para em silêncio quando o servidor adormece ou reinicia, e duplica-se quando correm duas cópias.
  • Um endpoint de cron sem proteção. Qualquer pessoa que o encontre pode disparar as suas tarefas, ou a sua fatura de email.
  • Tarefas que não são idempotentes. As novas tentativas e as chamadas duplicadas do agendador vão acontecer. Desenhe para isso.
  • Falhas sem visibilidade. Uma tarefa que falha em silêncio durante uma semana é pior do que uma que falha de forma ruidosa. Registe os erros e alerte em falhas repetidas.
  • Execuções longas num só pedido. Os pedidos expiram. Processe em lotes.
  • Agendar com demasiada frequência. Cada chamada num alojamento que escala para zero acorda e fatura a app. Ajuste o intervalo à necessidade real.
  • Fusos horários. "9h" significa coisas diferentes para o seu agendador (muitas vezes UTC) e para os utilizadores. Guarde as horas em UTC e converta por utilizador.
  • Segredos no ficheiro do fluxo. Guarde os tokens no cofre de segredos do agendador. Veja como manter as chaves de API seguras.

Lista de verificação

  • Trabalho lento retirado dos pedidos dos utilizadores
  • Tarefas guardadas de forma durável, e não apenas em memória
  • Novas tentativas com atrasos crescentes e um máximo
  • Cada tarefa segura para correr duas vezes
  • Endpoint agendado protegido por um token secreto
  • Cada execução processa um lote limitado
  • Tarefas falhadas visíveis, com alertas
  • Intervalo de agendamento escolhido tendo em conta o custo de alojamento
  • Horas guardadas em UTC

Tarefas em segundo plano no Mythex

A documentação do Mythex não descreve tarefas agendadas ou cron, e as apps publicadas e as suas bases de dados entram em repouso quando estão inativas e acordam no pedido seguinte (veja Limites de alojamento). Por isso, não dependa de temporizadores dentro da app. A abordagem que funciona é a descrita acima: peça ao agente uma tabela de tarefas e um endpoint protegido por token, e depois aponte um agendador externo para o URL publicado. Guarde o token como segredo do projeto, e lembre-se de que cada acordar gasta créditos pelo tempo em que a app e a base de dados estiveram ativas, por isso escolha um intervalo sensato. Se a sua app precisar de um backend de API para isto, a receita Backend de API REST é um bom ponto de partida, e como criar uma API REST explica como desenhar os endpoints. Se o núcleo do seu produto forem processos permanentes, como workers ou bots, uma plataforma feita para processos persistentes pode ser mais adequada.

Perguntas

O que é uma tarefa em segundo plano?

É um trabalho que a app faz fora do pedido que um utilizador está a aguardar, como enviar emails, redimensionar imagens, gerar relatórios ou sincronizar dados. O utilizador recebe uma resposta rápida, a tarefa corre à parte e pode ser repetida se falhar.

Como executo uma tarefa agendada se o meu alojamento não tem cron?

Acrescente um endpoint protegido que faz o trabalho e depois faça com que um agendador externo o chame segundo um horário. As opções incluem um fluxo agendado do GitHub Actions, um serviço de cron alojado ou o agendador do seu fornecedor de nuvem. Proteja o endpoint com um token secreto.

Posso usar setInterval ou setTimeout para tarefas agendadas?

Só para tarefas pequenas e pouco importantes, num servidor que está sempre a correr. Se o servidor reiniciar, escalar para zero ou correr em várias cópias, os temporizadores perdem-se ou executam-se mais do que uma vez. Guarde o trabalho agendado numa base de dados ou use um agendador.

O Mythex suporta tarefas cron?

A documentação do Mythex não descreve tarefas agendadas ou cron, e as apps publicadas entram em repouso quando estão inativas. A abordagem fiável é um agendador externo a chamar um endpoint protegido na sua app, o que acorda a app e executa o trabalho.

Mythex · Pricing · Crie qualquer coisa com IA · Modelos de sites e apps · Mythex comparado · Glossário de criação de apps com IA · Ferramentas grátis para criar apps com IA · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Íslenska Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)