timeoutSeconds (máximo de 900 segundos). Qualquer coisa que não consiga terminar nesse intervalo — uma re-sincronização completa, uma distribuição por registro, uma API de terceiros que impõe limitações de taxa — precisa ser dividida em execuções menores.
enqueueJobs faz exatamente isso: solicita aos workers do Twenty que executem mais tarde uma das funções de lógica do seu aplicativo, uma vez por payload, cada execução em seu próprio processo com seu próprio orçamento de tempo limite. O chamador retorna imediatamente.
Colocar execuções na fila
ImporteenqueueJobs de twenty-sdk/logic-function, aponte-o para o universalIdentifier da função de lógica a ser executada e passe um payload por execução para colocar na fila.
src/logic-functions/sync-all-contacts.ts
Logic function not found e nada é colocado na fila. Uma única chamada aceita até 200 payloads.
enqueueJobs retorna assim que os jobs são aceitos, não quando são executados. Ele não retorna os resultados dos destinos — faça cada destino gravar o que produzir no repositório de chave-valor ou em um registro do workspace se você precisar ler isso de volta.O auxiliar
enqueueJob mais antigo, que coloca um único job na fila por chamada, está obsoleto. Use enqueueJobs com uma lista payloads de um elemento em vez disso.Opções do job
As opções se aplicam a todas as execuções no lote.A prioridade ainda não é configurável. Jobs em fila sempre são executados na prioridade mais baixa, então o trabalho da plataforma nunca é atrasado por jobs da aplicação. O controle sobre prioridade estará disponível em breve.
Tentar novamente uma falha transitória
O Twenty não tenta novamente todas as exceções do código da aplicação. Um erro comum lançado é tratado como uma falha permanente. Para uma falha transitória, uma função lógica enfileirada pode solicitar até três novas tentativas lançandoRetryableLogicFunctionError.
RetryableLogicFunctionError diretamente quando possível. Se você estendê-lo, não substitua seu name: o Twenty reconhece o nome serializado RetryableLogicFunctionError em todos os ambientes de execução.
retryCount é 0 para a execução inicial e aumenta apenas quando o código da aplicação solicita uma nova tentativa. maxRetries é no máximo 3 e pode ser menor quando o trabalho enfileirado tem um limite geral de novas tentativas menor. As falhas da plataforma não aumentam retryCount, embora ainda consumam o orçamento geral de segurança da fila.
A fila atrasa as tentativas de repetição com recuo exponencial e jitter. O atraso exato não é garantido intencionalmente, portanto o código da aplicação não deve depender de uma nova tentativa ocorrer em um momento preciso. Quando maxRetries é atingido, outro RetryableLogicFunctionError é registrado como a falha final da aplicação sem outra execução.
Use assim: pagine uma sincronização longa
O formato clássico é uma função que coloca a si mesma na fila com o próximo cursor. Cada execução faz uma página de trabalho bem dentro do seu próprio tempo limite, e a cadeia para quando não resta nada.src/logic-functions/sync-contacts-page.ts
Ramificar por registro
Quando o trabalho é naturalmente por item, coloque um job por item na fila em uma única chamada e deixe os workers processá-los em paralelo em vez de fazer o loop inline.Boas práticas para trabalho de longa duração
Duas regras cobrem quase todo job longo: faça recursão em vez de loop e processe um fragmento limitado por execução. Uma execução que tenta fazer tudo é o modo de falha — ela atinge o tempo limite e, com uma nova tentativa, começa tudo de novo do zero. Em vez disso, defina o tamanho de um fragmento para que ele termine confortavelmente dentro detimeoutSeconds, persista sua posição e coloque a próxima execução na fila.
src/logic-functions/enrich-companies-batch.ts
- Defina o tamanho do fragmento a partir do item mais lento, não da média.
CHUNK_SIZE × tempo do item em pior casoprecisa caber emtimeoutSecondscom alguma folga, ou o final de um fragmento é perdido quando a execução é interrompida. - Deixe a condição de parada explícita. Faça recursão apenas enquanto um fragmento completo for retornado. Uma cadeia que para apenas em “sem resultados” continuará para sempre se a origem algum dia retornar uma página curta no meio do caminho.
- Persista o progresso antes de colocar a próxima execução na fila, assim um elo com falha reinicia a partir do último fragmento concluído em vez do começo.
- Mantenha cada fragmento idempotente. Reprocessar um fragmento após uma nova tentativa não deve gerar escrita em dobro — faça as gravações com base no registro ou id externo que você está processando.
- Prefira uma cadeia fragmentada em vez de uma grande ramificação quando o trabalho aciona um serviço de terceiros com limitação de taxa: uma cadeia com
delayMsse regula sozinha, enquanto milhares de jobs colocados na fila de uma vez se tornam elegíveis imediatamente.