Jobs, cron e a fila de mensagens mortas
Como executar o trabalho fora de uma solicitação: o que é um trabalho, como ele é repetido, como o cron cria trabalhos e o que fazer com os trabalhos que acabam mortos.
1. Enfileirar um trabalho
Um trabalho é uma chamada em segundo plano para uma função. Coloque-o na fila de um servidor com uma chave service_role.
| Opção | Padrão | Significado |
|---|---|---|
payload | null | JSON fornecido à função como corpo da solicitação |
delaySecs | 0 | Segundos para esperar antes da primeira tentativa. A tarefa permanece pending até então. |
maxAttempts | 3 | Número total de tentativas, incluindo a primeira |
Você lê uma tarefa com getJob(id) ou listJobs({ status, limit }) (limit está entre 1 e 500, padrão 50). O trabalho tem status, attempts, max_attempts, error e as datas scheduled_at, started_at, completed_at.
enqueueJob, getJob e listJobs precisam de uma chave service_role. Uma chave pública recebe 403.
2. O que sua função recebe
Um trabalho chama sua função como qualquer outra solicitação, com três diferenças que você deve tratar:
| Parte | Valor |
|---|---|
| Método | JOB (não POST) |
| Caminho | /jobs/<job id> |
| Corpo | O trabalho payload, como JSON |
| Cabeçalhos de identidade | Nenhum: x-aura-role e x-aura-user-id estão ausentes |
Uma chamada real registrada {"method":"JOB","path":"/jobs/d443d541-…","role":null,"userId":null,"body":"{\"items\":[\"a\",\"b\"],\"order\":42}"}.
Uma tarefa é executada sem usuário: não confie em x-aura-user-id. Se a obra pertencer a um usuário, coloque o ID do usuário na carga útil.
3. Ciclo de vida e novas tentativas
- Uma tarefa é executada pelo menos uma vez. Ele pode ser executado duas vezes se um trabalhador parar enquanto estiver em execução, portanto, torne a função idempotente.
- Uma tentativa com falha é repetida após um atraso fixo de 5 segundos, até que
maxAttemptsseja alcançado. O trabalho é entãodead. O atraso e a contagem de tentativas padrão são configurações de serviço (JOB_RETRY_DELAY_SECS,JOB_MAX_RETRIES). - Um trabalho que ainda é
runningapós sua concessão (450 segundos por padrão) é recuperado pelo serviço. - Os trabalhos concluídos são mantidos por 14 dias por padrão.
Um trabalho é completed assim que sua função responde, qualquer que seja o código de status. Em uma execução real, uma função que retornou 500 produziu um trabalho completed após uma tentativa e nunca foi repetida.
Uma tarefa falha e é repetida somente quando a própria chamada falha: a função não existe ou está inativa, o tempo de execução está inacessível ou a chamada atinge o tempo limite. Se você quiser tentar novamente quando seu próprio código detectar um erro, enfileire um novo trabalho do manipulador (com delaySecs para uma retirada) em vez de confiar no código de status.
Na mesma execução real, um trabalho para uma função que não existe passou por esta sequência: a tentativa 1 falhou em 3 s com Fonction 'ghost' introuvable, a tentativa 2 falhou em cerca de 9 s e o trabalho tornou-se dead com attempts igual a max_attempts.
4. A fila de mensagens mortas
Os trabalhos inativos permanecem na fila e podem ser listados e repetidos. Essas rotas ainda não possuem método SDK: use HTTP com uma chave service_role.
Uma nova tentativa coloca o trabalho de volta em pending sem redefinir seu contador de tentativas, portanto, ele obtém exatamente mais uma tentativa e retorna para dead se falhar novamente. Corrija a causa (implante a função ausente, por exemplo) antes de tentar novamente.
5. Agendar com cron
Uma entrada cron não chama a função em si: cada vez que é acionada, ela enfileira um trabalho.
- O agendamento possui 5 campos (
min hour day month weekday) ou 6 campos (sec min hour day month weekday). Uma programação de 5 campos obtém0segundos na frente:*/1 * * * *é armazenado como0 */1 * * * *. - Aliases como
@dailysão recusados com um400que indica o formato esperado. - Os horários estão em UTC.
last_runenext_runsãonullaté o primeiro disparo. Em uma execução real, uma programação criada às 15h40 foi disparada às 15h41:00 e depois mostrounext_run15h42:00.- A carga é congelada quando você cria a entrada.
- Excluir um nome desconhecido retorna
404. Excluir uma entrada do cron também impede que ela seja disparada. - O SDK não possui
getCronJobouupdateCronJob: exclua a entrada e crie-a novamente.
Para trabalho puramente de banco de dados, a extensão Postgres pg_cron evita a viagem de ida e volta para uma função: consulte a página Cron.