Prezentare generală
API-ul Twenty acceptă 500 de solicitări pe minut per înregistrare a aplicației pentru solicitările pe care le efectuează o aplicație în nume propriu: execuții fără o persoană în spatele lor (cron, webhooks, hook-uri de instalare) și clienți creați curunAs: 'application'. Bugetul este partajat de fiecare spațiu de lucru care a instalat aplicația, iar solicitările care îl depășesc sunt respinse cu un 429. Solicitările efectuate ca persoana care a declanșat o execuție sunt contorizate în schimb pentru limitele acelei persoane. Practicile de mai jos mențin o aplicație în cadrul acelui buget pe măsură ce numărul instalărilor sale crește și în limitele serviciilor pe care le apelează.
- Distribuiți rulările cron de parcurgere cu o întârziere aleatorie. Un declanșator cron pornește în fiecare spațiu de lucru în același minut, astfel încât fiecare instalare consumă simultan din bugetul partajat. Limitați handlerul cron la adăugarea în coadă, cu un
delayMsaleatoriu într-o fereastră mare, precum o oră. Adăugările de joburi în coadă sunt, de asemenea, limitate la 2.000 pe minut pentru fiecare înregistrare a aplicației, iar o declanșare cron peste această limită este omisă în spațiile de lucru rămase, deci păstrați o parcurgere idempotentă și lăsați următoarea declanșare să recupereze.
src/logic-functions/enqueue-nightly-sweep.ts
-
Grupați în loturi declanșatorii evenimentelor din baza de date. O scriere în masă, precum o sincronizare a cutiei poștale, emite câte un eveniment pentru fiecare înregistrare, mii în câteva secunde, iar o execuție pentru fiecare eveniment înseamnă câte o solicitare pentru fiecare înregistrare. Setați
batchMode: true, declarațiupdatedFieldsși reduceți lotul la înregistrări distincte înainte de a apela API-ul. Consultați Gruparea în loturi a evenimentelor din baza de date. -
Efectuați o solicitare per lot, nu per înregistrare. Limita contorizează solicitările, nu înregistrările: un
createManycuupsert: truecare conține 200 de înregistrări reprezintă o solicitare, iar 200 de actualizări individuale reprezintă 200. Citiți cu filtreinși scrieți cucreateManysauupdateMany. -
Reduceți rafalele la un singur job întârziat. Când evenimentele dezvăluie o activitate mai mare decât evenimentul în sine, adăugarea acesteia în coadă o dată pentru fiecare eveniment o multiplică cu dimensiunea rafalei. Adăugați în coadă un singur job cu
delayMsși unjobIddeterminist care include o fereastră de timp; coada ignoră un id pe care îl deține deja. Consultați Alegeți propriul id de job. -
Eșalonați distribuirea cu
delayMs. Joburile adăugate în coadă fără întârziere devin toate eligibile simultan și consumă bugetul în același minut. Grupați-le în intervale pe minut și întârziați pagina următoare cu numărul de intervale utilizate. Consultați Joburi în fundal. -
Reîncercați un
429cu backoff sau adăugați din nou în coadă cu o întârziere. SDK-ul client generează o eroare pentru orice răspuns non-2xx, iar o execuție care așteaptă în interior își consumă propriul timeout. Reîncercați cu backoff exponențial și o limită pentru încercări sau returnați activitatea în coadă cu o întârziere. - Memorați în cache ceea ce nu se modifică. O căutare la fiecare eveniment necesită o solicitare pentru o valoare fixată la momentul conectării, cum ar fi o identitate sau un id de echipă. Stocați-o în stocarea cheie-valoare atunci când conexiunea este înregistrată.
-
Grupați în loturi solicitările către API-uri externe. Un serviciu extern are propria limită de rată, iar o funcție logică are un timeout, astfel încât
nsolicitări per execuție le multiplică pe ambele. Când furnizorul oferă un endpoint pentru loturi, trimiteți o solicitare pentru întregul lot în loc de una pentru fiecare înregistrare și împărțiți lotul în bucăți până la maximul furnizorului. - Faceți parametrii impliciți editabili de utilizator. O valoare codificată direct într-o funcție logică sau într-un flux de lucru, precum un prag, o dimensiune de lot sau o opțiune implicită, se potrivește unui singur spațiu de lucru și necesită o versiune nouă pentru fiecare altul. Declarați-o ca variabilă de aplicație cu o valoare implicită și citiți-o la momentul execuției, astfel încât administratorii spațiului de lucru să o poată ajusta din setările aplicației. Consultați Configurația aplicației.