Panoramica
L’API di Twenty accetta 500 richieste al minuto per registrazione dell’applicazione per le richieste effettuate da un’app a proprio nome: esecuzioni senza una persona alle spalle (cron, webhook, hook di installazione) e client creati conrunAs: 'application'. Il budget è condiviso da ogni spazio di lavoro che ha installato l’app e le richieste che lo superano vengono rifiutate con un 429. Le richieste effettuate in qualità della persona che ha attivato un’esecuzione vengono invece conteggiate rispetto ai limiti di quella persona. Le pratiche riportate di seguito mantengono un’app entro tale budget man mano che aumenta il numero di installazioni, e entro i limiti dei servizi che chiama.
- Distribuisci i cron di scansione con un ritardo casuale. Un trigger cron si avvia in ogni area di lavoro nello stesso minuto, quindi ogni installazione attinge contemporaneamente al budget condiviso. Limita il gestore cron a un accodamento, con un valore
delayMscasuale su un’ampia finestra temporale, ad esempio un’ora. Gli accodamenti di job sono inoltre limitati a 2.000 al minuto per registrazione dell’applicazione, e un tick cron oltre tale limite viene ignorato nelle aree di lavoro rimanenti; pertanto, mantieni una scansione idempotente e lascia che il tick successivo recuperi.
src/logic-functions/enqueue-nightly-sweep.ts
-
Raggruppa in batch gli attivatori di eventi del database. Una scrittura in blocco, come una sincronizzazione della casella di posta, genera un evento per record, migliaia in pochi secondi, e un’esecuzione per evento significa una richiesta per record. Imposta
batchMode: true, dichiaraupdatedFieldse riduci il batch a record distinti prima di chiamare l’API. Vedi Raggruppamento in batch degli eventi del database. -
Effettua una richiesta per batch, non per record. Il limite conteggia le richieste, non i record: un
createManyconupsert: truecontenente 200 record equivale a una richiesta; 200 aggiornamenti singoli equivalgono a 200 richieste. Leggi con filtriine scrivi concreateManyoupdateMany. -
Comprimi i picchi in un unico job ritardato. Quando gli eventi rivelano un lavoro più grande dell’evento stesso, accodarlo una volta per evento lo moltiplica per la dimensione del picco. Accoda un job con
delayMse unjobIddeterministico che include una finestra temporale; la coda ignora un ID già presente. Consulta Scegli il tuo ID job. -
Scagliona i fan-out con
delayMs. I job accodati senza ritardo diventano tutti eseguibili contemporaneamente e consumano il budget nello stesso minuto. Raggruppali in slot per minuto e ritarda la pagina successiva in base agli slot utilizzati. Vedi Job in background. -
Riprova un
429con backoff oppure riaccoda con un ritardo. L’SDK client genera un errore per qualsiasi risposta non 2xx, e un’esecuzione che attende al suo interno consuma il proprio timeout. Riprova con backoff esponenziale e un limite di tentativi, oppure restituisci il lavoro alla coda con un ritardo. - Memorizza nella cache ciò che non cambia. Una ricerca a ogni evento richiede una richiesta per un valore fisso al momento della connessione, ad esempio un’identità o un ID team. Memorizzalo nell’archivio chiave-valore quando viene registrata la connessione.
-
Raggruppa in batch le richieste alle API esterne. Un servizio esterno ha il proprio limite di frequenza e una funzione logica ha un timeout, quindi
nrichieste per esecuzione moltiplicano entrambi. Quando il provider offre un endpoint batch, invia una richiesta per l’intero batch anziché una per record e suddividi il batch in blocchi fino al massimo consentito dal provider. - Rendi modificabili dall’utente i parametri predefiniti. Un valore codificato in una funzione logica o in un Workflows, come una soglia, una dimensione del batch o un’opzione predefinita, è adatto a un’area di lavoro e richiede una nuova release per ogni altra. Dichiaralo come variabile dell’applicazione con un valore predefinito e leggilo al momento dell’esecuzione, affinché gli amministratori dell’area di lavoro possano modificarlo dalle impostazioni dell’app. Vedi Configurazione dell’applicazione.