Facand referire la aceasta postare de pe stackoverflow, pentru ca nu vreau sa lungesc acest topic si sa nu se mai inteleaga nimic din el:
Am un API in Scala si voiam sa implementez un GenericRepository. Pentru asta, citesc datele din baza de date ca o lista de obiecte (List[Object]), fiecare obiect insemnand o linie din tabel (o alta lista de obiecte)) (primul for). Asta se intampla in repoul generic, dupa care lista este trimita in repo-ul entitatii, unde ii cunosc tipul si mapez fiecare obiect in tipul respectiv (al 2lea for). Deci, pe langa citirea din resultSet al executarii queryului, pentru a folosi un generic repo o sa mai adaug 2 for’uri pentru fiecare entitate. Asta m-am gandit ca va creste timpul de executie in cazul entitatilor unde returnez un numar foarte mare de linii (sute de mii) si m-am apucat de testat:
Initial am testat fara folosirea acelui generic repo, pur si implu am vrut sa vad in cat timp incarc o lista de o suta de mii de iteratii, obiecte cu doar 2 parametrii (id si nume)
def test(): List[(Int, String)] = {
var roleList: List[(Int, String)] = List.empty
for (i <- 0 to 100000) {
if (i % 10000 == 0) println(i)
val row: (Int, String) = (i, getName(i))
roleList = roleList :+ row
}
roleList
}
Pentru 10k iteratii dureaza in jur de 10 secunde (enorm). In timpul asta, Angularul asteapta raspunsul. Dupa aproape 60 secunde de asteptare, Angularul retrimite requestul catre server (al 2lea) si il ignora total pe primul. Astfel, in server cand primul request este undeva la 70% executie, incepe un al 2lea. Primul request se executa, api-ul trimite raspunsul la client, dar acesta este ignorat pentru ca Angularul asteapta raspunsul ultimului request trimit (cel de-al 2lea). Cand al 2lea request ajunge la 60 70%, angular trimite un al 3lea request. Asta se intampla de 4 ori, am timeout setat la 120 secunde, si intre timp Angularul primeste eroare connection reset (atentie, nu timeout)
Trebuia sa fie doar un test banal, care s-a complicat surprinzator :)) Ce se intampla in cazul in care chiar vreau sa returnez cateva sute de mii de linii sau doar sa le procesez in backend si sa trimit rezultatul in frontend? Se poate sa fie si din cauza pc-ului, itereaza 10k linii in 10 secunde, CPU este 100% iar Memory usage undeva pe la 80%.
Initial incercam sa testez cu cat ar creste timpul acele transformari de obiecte in tip si for-uri ale generic repo-ului fata de un repository normal. Ce ma uimeste totusi e ca … aveam impresia ca e o problema de backend, cand se pare ca e de front.
*N-am mai apucat sa vad cum se comporta si cu transformarea dintr-o lista de obiecte in lista de (Int, String) pentru ca e clar ca va merge mult mai prost decat in primul caz
Gresesc eu ceva, pe undeva sigur :))) daca setez retry(0) in serviciul de angular, conexiunea se inchide dupa aproape un minut, cand primul request este in executie. Doar ca nu vreau sa pun in fiecare serviciu retry(0) acolo unde stiu ca backendul are nevoie de mai mult timp pentru intoarcerea rezultatului. Si asta, oricum n-ar rezolva problema, ca arunca eroare.