timeoutSeconds (900 secondes maximum). Tout ce qui ne peut pas se terminer dans cette fenêtre — une resynchronisation complète, une diffusion par enregistrement, une API tierce qui vous applique des limitations de débit — doit être découpé en exécutions plus petites.
enqueueJobs fait exactement cela : il demande aux workers de Twenty d’exécuter plus tard l’une des fonctions logiques de votre application, une fois par charge utile, chaque exécution dans son propre processus avec son propre budget de délai d’expiration. La fonction appelante retourne immédiatement.
Mettre des exécutions en file d’attente
ImportezenqueueJobs depuis twenty-sdk/logic-function, pointez-le vers le universalIdentifier de la fonction logique à exécuter et transmettez une charge utile par exécution pour la mise en file d’attente.
src/logic-functions/sync-all-contacts.ts
Logic function not found et rien n’est mis en file d’attente. Un seul appel accepte jusqu’à 200 charges utiles.
enqueueJobs renvoie dès que les jobs sont acceptés, et non pas lorsqu’ils ont été exécutés. Il ne renvoie pas les résultats des cibles — faites en sorte que chaque cible écrive ce qu’elle produit dans le key-value store ou dans un enregistrement d’espace de travail si vous devez les lire à nouveau.L’ancien assistant
enqueueJob, qui met en file d’attente un seul job par appel, est obsolète. Utilisez plutôt enqueueJobs avec une liste payloads à un élément.Options du job
Les options s’appliquent à chaque exécution du lot.La priorité n’est pas encore configurable. Les jobs mis en file d’attente s’exécutent toujours avec la priorité la plus basse, de sorte que le travail de la plateforme n’est jamais retardé derrière les jobs des applications. Le contrôle de la priorité arrive bientôt.
Réessayer après un échec transitoire.
Twenty ne réessaie pas toutes les exceptions du code d’application. Une erreur ordinaire levée est traitée comme un échec permanent. En cas d’échec transitoire, une fonction logique mise en file d’attente peut demander jusqu’à trois nouvelles tentatives en levantRetryableLogicFunctionError.
RetryableLogicFunctionError lorsque cela est possible. Si vous l’étendez, ne remplacez pas son name : Twenty reconnaît le nom sérialisé RetryableLogicFunctionError dans les environnements d’exécution.
retryCount est égal à 0 lors de l’exécution initiale et n’augmente que lorsque le code d’application demande une nouvelle tentative. maxRetries est au maximum de 3 et peut être inférieur lorsque la tâche mise en file d’attente a une limite globale de nouvelles tentatives plus faible. Les défaillances de la plateforme n’augmentent pas retryCount, bien qu’elles consomment toujours le budget de sécurité global de la file d’attente.
La file d’attente retarde les tentatives avec un délai exponentiel et une gigue. Le délai exact n’est intentionnellement pas garanti, le code d’application ne doit donc pas dépendre d’une nouvelle tentative à un moment précis. Une fois maxRetries atteint, un autre RetryableLogicFunctionError est enregistré comme échec final de l’application sans nouvelle exécution.
Utilisation : paginer une longue synchronisation
La forme classique est une fonction qui met elle-même en file d’attente la prochaine exécution avec le curseur suivant. Chaque exécution traite une page de travail bien à l’intérieur de son propre délai d’expiration, et la chaîne s’arrête lorsqu’il ne reste plus rien.src/logic-functions/sync-contacts-page.ts
Répartition par enregistrement
Quand le travail est naturellement par élément, mettez en file d’attente un job par élément dans un seul appel et laissez les workers les traiter en parallèle au lieu de boucler en ligne.Bonnes pratiques pour les tâches de longue durée
Deux règles couvrent presque toutes les longues tâches : utilisez la récursion au lieu de boucles et traitez un bloc borné par exécution. Une exécution qui essaie de tout faire est un mode d’échec — elle atteint le délai d’expiration, et avec une nouvelle tentative elle recommence tout depuis zéro. Au lieu de cela, dimensionnez un bloc de manière à ce qu’il se termine confortablement danstimeoutSeconds, conservez votre position et mettez en file d’attente l’exécution suivante.
src/logic-functions/enrich-companies-batch.ts
- Dimensionnez le bloc à partir de l’élément le plus lent, pas de la moyenne.
CHUNK_SIZE × worst-case item timedoit tenir danstimeoutSecondsavec une marge de sécurité, sinon la fin d’un bloc est perdue lorsque l’exécution est interrompue. - Rendez la condition de terminaison explicite. Utilisez la récursion uniquement lorsqu’un bloc complet est revenu. Une chaîne qui s’arrête uniquement sur “no results” continuera indéfiniment si la source renvoie un jour une page courte en cours de route.
- Conservez la progression avant de mettre en file d’attente l’exécution suivante, afin qu’un maillon ayant échoué redémarre au dernier bloc terminé plutôt qu’au début.
- Gardez chaque bloc idempotent. Le retraitement d’un bloc après une nouvelle tentative ne doit pas provoquer une double écriture — indexez les écritures sur l’enregistrement ou l’identifiant externe que vous traitez.
- Préférez une chaîne par blocs à un énorme déploiement parallèle lorsque le travail touche un tiers soumis à des limitations de débit : une chaîne avec
delayMsse régule elle-même, alors que des milliers de jobs mis en file d’attente d’un coup deviennent tous éligibles immédiatement.