Node.js filozófia
Előre is bocsánat, ha nem megfelelő a téma, de talán ide illik leginkább. (ha mégsem, akkor a szerkesztőkre bízom a dolgot)
Nemrég kezdtem el belemélyedni a node.js-be, és kezdem megszokni ezt az aszinkron működését, de pár dolog nem hagy nyugodni.
Alapvetően ezelőtt PHP-ban csináltam ezeket a netes dolgokat, azaz 1 http kérés = 1 php lefutás. Itt ugye a node-ban egyszer elindul az alkalmazás, és csak kiszolgálja a kéréseket, miközben rengeteg dolog, amit használ, benn van a memóriában. Így első körben az foglalkoztat, hogyha pl egy http lekérésnél beolvasok egy fájlt, azt minden lekérés alkalmával megtegyem-e, vagy valahogy érdemes lenne egyfajta cache-ben tárolni (nem gondolok itt bonyolult dologra, egyszerűen csak benn hagynám a memóriában, azaz nem valami kérésenként lokális változóban tárolnám az eredményt), ami adott esetben gondolom sokkal gyorsabb, mivel diszk i/o művelet nem is történne a tövábbi kéréseknél. Ugyanez vonatkozik az adatbázis lekérésekre is (mongodb).
A másik kérdés is az adatbázisra vonatkozik, nevezetesen hogy ha létrehozok egy kapcsolatot (node->mongo), akkor azt érdemes megtartani, vagy kvázi mint PHP->MySQL esetben, kérésenként felépíteni, lebontani. Gondolom teljesítmény szempontjából az előbbi megoldás előnyösebb, de nem tudom pl jó-e a kapcsolat szempontjából, hogy állandóan nyitva van (mi történik, ha egyszer csak egy hiba folytán megszakad?).
A válaszokat/tanácsokat előre is köszönöm :)
■ Nemrég kezdtem el belemélyedni a node.js-be, és kezdem megszokni ezt az aszinkron működését, de pár dolog nem hagy nyugodni.
Alapvetően ezelőtt PHP-ban csináltam ezeket a netes dolgokat, azaz 1 http kérés = 1 php lefutás. Itt ugye a node-ban egyszer elindul az alkalmazás, és csak kiszolgálja a kéréseket, miközben rengeteg dolog, amit használ, benn van a memóriában. Így első körben az foglalkoztat, hogyha pl egy http lekérésnél beolvasok egy fájlt, azt minden lekérés alkalmával megtegyem-e, vagy valahogy érdemes lenne egyfajta cache-ben tárolni (nem gondolok itt bonyolult dologra, egyszerűen csak benn hagynám a memóriában, azaz nem valami kérésenként lokális változóban tárolnám az eredményt), ami adott esetben gondolom sokkal gyorsabb, mivel diszk i/o művelet nem is történne a tövábbi kéréseknél. Ugyanez vonatkozik az adatbázis lekérésekre is (mongodb).
A másik kérdés is az adatbázisra vonatkozik, nevezetesen hogy ha létrehozok egy kapcsolatot (node->mongo), akkor azt érdemes megtartani, vagy kvázi mint PHP->MySQL esetben, kérésenként felépíteni, lebontani. Gondolom teljesítmény szempontjából az előbbi megoldás előnyösebb, de nem tudom pl jó-e a kapcsolat szempontjából, hogy állandóan nyitva van (mi történik, ha egyszer csak egy hiba folytán megszakad?).
A válaszokat/tanácsokat előre is köszönöm :)
nem értek a node-hoz, de...
Az adatbázis cache-elés már kicsit problémásabb kérdés, mert egyrészt több alkalmazásos környezetben (azaz ugyanabban az adatbázisban több alkalmazás turkál) megszivathatnak a cache-be beragadt adatok, másrészt a mongo is cache-eli a gyakran használt adatokat, plusz alatta az oprendszer is cache-eli a gyakran használt fájlokat, szóval hogy érdemes-e ugyanazt az adatot egy harmadik memória cache-ben is tárolni, az kérdéses. Le kell mérni.
Az adatbáziskapcsolatot meg ha csak lehet egyszer építsd fel - csendesen teszem hozzá, hogy PHP-ben sem illik minden kérésnél újrakapcsolódni.
Utolsó mondat
Egy másik (bár még mindig a node működéséhez kapcsolódó téma), nevezetesen, hogy mivel minden aszinkron (vagy érdemes aszinkron módon működnie), hogy lehet eldönteni, hogy 'kész vagyunk-e'. Tehát indítok mondjuk 2 adatbázis kérést egyszerre, milyen módszerrel tudom megmondani, hogy kész van-e minden? (le lehet-e zárni a http kapcsolatot). Így intuitívan mindenféle flag-ek használatával bíbelődök, de szerintem kell lennie elegánsabb megoldásnak is.
Nem
Mit értesz azon, hogy készen vagy-e? Ha összegyűjtöttél minden adatot, amit el akarsz küldeni a kliensnek, és el is küldted, akkor „készen vagyunk”. És mehet a kliensnek az
response.end()
. Az már nem érdekes, hogy a logolás, esetleg még valamilyen adatbázis beszúrás, módosítás még hátravan, mert jó eséllyel gyorsabban lezajlik, minthogy a kliens megkapja akár csak az első bájt adatot. Hogy pontosan akkor hajts végre egy függvényt, amikor minden aszinkron kérésed lezajlott, arra van pár nagyszerű módszer.Node.js Windows környezetben
A kérdés bennem is felmerült:
Nagyon máshogy működik egy ilyen párhuzamos futtatásra képes rendszer, és egymillió kérdést felvet.
Párhuzamos
Kösz, kipróbálom a linkelt
Cache
Adatbázis kapcsolatokhoz érdemesebb inkább egy pool-t használni, mint amilyen a generic-pool, node-mysql-pool, common-pool illetve mongo-pool. (A generic-pool-t azért is ajánlom, mert jó részét én írtam :) Ebben kezelni tudod azt az esetet, amikor a kapcsolat megszakad, és magától tud nyitni újakat, ha szükség van rájuk. A budapest.js előadásomban be is mutatom a generic-pool használatát, ugyan SQLite adatbázissal és csak maximum egy kapcsolódással, de a lényeg látszik belőle.