Skip to main content
Uma execução de função de lógica é limitada pelo seu 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

Importe enqueueJobs 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
Cada execução recebe seu payload como argumento do handler, exatamente como qualquer outro gatilho. O destino deve pertencer à mesma aplicação que quem o chama — colocar na fila a função de outra aplicação é rejeitado com 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.
A execução em fila herda o usuário ativo da função que a colocou na fila, portanto age com as mesmas permissões.

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çando RetryableLogicFunctionError.
Lance 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.
As novas tentativas executam novamente todo o manipulador e podem ocorrer depois que alguns efeitos colaterais foram bem-sucedidos. Torne o manipulador idempotente antes de solicitar novas tentativas.

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 de timeoutSeconds, persista sua posição e coloque a próxima execução na fila.
src/logic-functions/enrich-companies-batch.ts
O que torna isso robusto:
  • Defina o tamanho do fragmento a partir do item mais lento, não da média. CHUNK_SIZE × tempo do item em pior caso precisa caber em timeoutSeconds com 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 delayMs se regula sozinha, enquanto milhares de jobs colocados na fila de uma vez se tornam elegíveis imediatamente.