Tema 9 · Vykdymas ir ribos

Vykdymas: async / sync, sesija, atmintis, ciklas, auditas

Čia dažniausiai atsakymas į klientą, kodėl procesas nutrūko arba auditas rodo ne tą naudotoją.

Async ir sync

Rūšis Elgsena
Async Vyksta nepriklausomai nuo pagrindinių ERP procesų (dokumento kūrimas, patvirtinimas, atšaukimas…). Fono logika.
Sync Kol vyksta — sistema ir vartotojas laukia pabaigos.
Kodo šablonas: kai rinktis „neblokuoti“ darbą (mintis)
// Sync kontekste: vartotojas laukia — vengkite ilgų ciklų be progreso žinučių.
// Async / fonas: tinka masyvams, išoriniams API; vis tiek ribokite partijas ir loginkite etapus.
await log.info("Pradedu async dalį, ids: " + (initial.ids?.length ?? 0));

Jei operacija gali užtrukti ilgiau nei keliasdešimt sekundžių — vertinkite duomenų kelią ir ar ne eilės tema (Tema 11).

Įdėtiniai kvietimai ir ciklo apsauga

Scenarijus gali kviesti kitą automatizavimą, tas — trečią. Rizika — begalinis ciklas. Platforma skaičiuoja pakartojimus: jei ciklas pasikartoja trečią kartą, vykdymas nutraukiamas.

Sesija ir atmintis

  • Automation sesijos laikas: 15 minučių. Scenarijus vyksta iki sesijos pabaigos.
  • Atminties riba vienai užduočiai: iki 2 GB. Dideli JSON (keli tūkst. eilučių) + kopijavimas atmintyje greitai sunaudoja limitą.
  • Automation Type scenarijuje galima kurti kelias async gijas lygiagrečiam darbui su lėtais išoriniais šaltiniais — bet lygiagretumas didina atmintį.

Auditas: kas rodomas kaip keičėjas

Įprastai vykdymas vyksta inicijuotojo naudotojo vardu — auditas rodo jį. Scheduler tipo automatizavimai — pakeitimai fiksuojami kaip automation naudotojo vardu.

Sąsaja su kita tema

Čia sutelktos vykdymo sesijos, atminties ir ciklo taisyklės. Kurį duomenų kelią rinktis pagal apimtį ir laiką (reporting vs automatizavimas vs data export ir pan.) — atskiroje temoje apie keturis kelius ir asinchroninį eksportą; ten nebekartojame šios temos lentelių, o sprendžiame kliento klausimą architektūriškai.

Techninis pavyzdys: sesijos likutis scenarijuje

API leidžia patikrinti, kiek laiko liko iki sesijos pabaigos (sekundėmis):

const remainingSeconds = await getRemainingSessionTime();
// Jei mažai — saugiau skaidyti darbą arba baigti kontroliuotai
Techninis pavyzdys: įdėtinis automatizavimo kvietimas
const response = await callErpAutomation(
  "childAutomation",
  { param1: "param1", param2: true, param3: 3.14 }
);
// response.status: SUCCESS | FAILED | CANCELED
// response.data: Object | String

Praktika: ribos, ciklas ir tęstinumas pagal repo skriptus

c-001 — ilgesnis foninis darbas: lygiagretumas su riba maxConcurrency (mažiau „užkemša“ eilę nei begalinis paralelizmas, bet vis tiek didina atminties apkrovą). aa260126 — ciklas per dokumentus: vienam dokumentui mutate klaida įrašoma į failed ir vykdymas tęsiamas (continue).

Kodo fragmentas iš `c-001` (lygiagretumo riba)
const maxConcurrency = 10;
// … executing.add(task); jei executing.size >= maxConcurrency — await Promise.race(executing);
Kodo fragmentas iš `aa260126` (klaida vienam dokumentui — tęsiama)
} catch (error) {
  failed.push(errInfo);
  continue; // kitas dokumentas
}

Teorijos santrauka

  • Async — fonas; sync — vartotojas laukia iki galo.
  • Sesija (~15 min) ir atminties (~2 GB) ribos — realūs nutrūkimų šaltiniai.
  • Ciklo apsauga nutraukia pakartojimus trečią kartą; auditas priklauso nuo inicijuotojo / scheduler.

Praktika salėje

Vienas incidentas: „procesas nutrūko“ — ar tai sesija, atmintis, ciklas ar netinkamas kelias?

Savarankiškas darbas

  1. Trumpai (5–7 sakiniai) paaiškinkite sinchroninio paleidimo riziką vartotojui, remdamiesi šios temos lentele.
  2. Nubrėžkite ar užrašykite žingsniais grandinę: scenarijus A kviečia B — kur įeina ciklo apsauga.