ca tot imi plac mie filmele sf, sa mai vin cu o intrebare sf, asa cum m-am obisnuit
se da o aplicatie in php care pe alocuri, in functie de url / parametrii primiti face niste operatii cpu & memory intensive, operatii care dureaza (posibil si zeci de secunde), si din pacate de abia cand ajung in php pot sa imi dau seama daca e groasa sau nu; problema e prima cerere de fiecare fel, dupa aia se considera ca datele prelucrate se vor lua din cache; nu se poate face cache warmup, pentru ca sunt prea multe posibilitati, nu stiu exact de ce anume voi avea nevoie (depinde de ce url-uri vin) ca sa dau un exemplu, ca tot parca e bacul zilele astea, sa zicem calcularea procentului de promovabilitate sau mai stiu eu ce note in functie de numarul de la pantofi; iau datele, le incarc in memorie (ca am zis ca e memory intensive), le prelucrez si dau mai departe rezultatul, dar si cache-uiesc rezultatul avem urmatoarele situatii: 1. forta bruta / "a-m loat baq" / impuscati programatorul - vin 100 de cereri simultan, se executa toate cele 100 in paralel, s-a umplut memoria, s-a dus serverul pe apa sambetei, da-i buton etc etc - se poate limita numarul de procese php, pana la urma scap de sucombarea serverul, dar nu scap de denial of service (am toate procesele de php care rasnesc in draci procesand datele) 2. prelucrare unica per clasa - vin 100 de cereri, se executa prima, restul stau si asteapta sa primeasca rezultatul de la primul (semafoare, mutex, gearman, cozi etc., solutii sunt destule) - partea buna: un singur proces, recte php-ul sau cui i-o fi trimis task munceste, restul asteapta toti cu sufletul la gura rezultatul - ok, performantele s-au imbunatatit, dar nu scap de denial of service, decat poate daca maresc numarul de procese php; in cazul asta e ok, dar daca vin multe cereri diferite, iar n-am facut nimic, ajung tot la denial of service 3. pun un varnish in fata - care cu minime configuratii in loc sa faca 100 de cereri pentru acelasi url va face una singura si o va servi mai departe de 100 de ori - insa daca spre exemplu se schimba putin url-ul, sau spre exemplu am o cerere de genul 'doar pantofii cu numerele 41 si 42' (adica ceva ce poate fi bagat in aceeasi oala cu cererile de dinainte, dar asta o stiu de abia cand ajung in php, nu mai inainte) si pentru ca m-am ametit si eu de cate am scris, CE VREAU DE FAPT: o modalitate eficienta de a-i specifica fie varnish-ului fie direct apache / nginx via fastcgi ca acum cutzu rezultate pentru prelucrarile mai lungi, dar sa incerce mai tarziu, FARA ca clientul sa stie asta; consider ca in anumite conditii prefer mai multe cereri http decat procese php care stau degeaba in timp ce alte cereri nu pot fi indeplinite pentru ca nu exista sloturi de executie necesare m-am uitat prin specificatiile fastcgi si nu am gasit nimic de genul asta cu retry, din momentul in care s-a dat controlul / comanda la php nu stiu cum sa mai ajungi inapoi la apache mai vorbeau unii de redirect temporar in $url&try=%try+1, dar retry-after nu e luat in considerare, si nu fac decat un dos cu metoda asta, pana va da eroare de prea multe redirecturi retry-after merge in schimb cu 503, dar cred ca doar googlebot-ul ia headerul respectiv in considerare, browserul normal ramane cu eroarea singura solutie viabila de la care as putea porni ar fi returnarea unui cod aiurea de 5xx catre varnish, iar pe baza codului respectiv el sa faca retry; din pacate insa cica e nerecomandat sa pui chestii gen sleep() prin vcl-uri, trebuie sa aprofundez cum si de ce, pentru ca mi se pare cam aiurea sa nu existe chestii simple de delay (am vazut chiar niste exemple in care trimiteau la niste php-uri cu sleep() in ele, come on ... deja astea sunt sf-uri mai mari decat sf-urile mele) dupa cum ziceam, clientul trebuie sa fie agnostic de ce fac eu in spate, el face o cerere si fie primeste rezultat, fie eroare; altfel, mergea probabil cu un websocket ceva Alex _______________________________________________ RLUG mailing list RLUG@lists.lug.ro http://lists.lug.ro/mailman/listinfo/rlug