Kako pratiti online korisnike i NE zaklati server?

Kako pratiti online korisnike i NE zaklati server ?
Pozdrav svima,

evo jedno malo zahtjevnije programersko/serversko pitanje, pa molim sve znalce za nekakav konkretan odgovor.

Radim jednu business aplikaciju koju ce koristiti cca 300 korisnika svakodnevno.

Tehnologija : PHP, MySQL, Jquery, Json, Flash

Necu sad ulaziti u samo funkcionalnost, no vrlo je vazno da administrator moze vidjet sve trenutne online korisnike, uputiti im chat, vidjet vrijeme logiranje, trajanje session-a i sl.

Sve gore navedeno nije problem napraviti i rjeseno je.

Problem je sljedeci;

Pracenje korisnika je izvedeno na nacin da se putem ajaxa svakih sekundu vremena salje insert na bazu sa relevantnim informacijama … tipa UID-a korisnika, trenutnog vremena, itd itd …

Sad sam primjetio da kad se spoji cca 10 korisnika da se naglo poveca load servera, i strasno se digne razina potrosnje memorije, procesora i ostalih serv. resursa na pogadjate … mysqld process.

Sto nije ni cudno … jer 10 korisnika svaku sekundu radi insert na bazu … to je na 10 spojendih korisnika 10 inserta po sekundi u bazu …

Ima li netko drugu ideju kako bezbolnije pratit korisnike … bez tih silnih inserta u bazu … a da opet funkcionira sve gore navedeno …

Odnosno jos bolje pitanje, dali netko zna na koju foru facebook prati user online status … odnosno tko je online a tko “nije” konkretno na chatu.

Btw … server je VPS … 1 gb rama, 2 virtualna procesora …

Hvala svima.

koji operativni sustav je u pitanju?

a) optimiziraj bazu (ne u tablicama nego ispod, optimiziran mysql server moze na ovoj konfiguraciji vrtit sigurno bar 200-300 transakcija po sekundi - tu dolazi: vidi c )
b) kupi jaci server (vps moze bez problema patit od naprezanja drugih hostova)
c) svaku sekundu?!? Lajk, pa nije da pratite neko cudo. 300 korisnika, da ih je i 500, mozes to komotno na 15 sekundi ili 30 stavit (ovo s sekundom mi je cudesno). Mislim, osim ako nisi pconnectao, moras svaku sekundu radit spajanje na bazu i pinganje, zavisno kolko dobro/lose ti izgleda baza i kako radi server uopce to moze biti fatalno.

Zasad mi to pada na pamet.

a) sto tocno podrazumijevas pod optimiziranim serverom … server je standardne konfiguracije na VPS-u … nista specijalno nije podeseno

b) nema naprezanja drugih hostova … ram, swap, procesor, load … sve je to na najmanju potrosnju svedeno inace kad radi bez ovih inserata svaku sekundu

c) pa moze bit i svakih 15 sekundi ili 30 … baza je normalizirana, InnoDB engine … postavljeni indexi, foreign keyevi … relacije itd.

Mislis samo pconnect za taj insert koji se odvija svakih xx sekundi ili za cijelu applikaciju … nisam koristio jos permanent connect … kako se on odrzava na resurse i samu aplikaciju za razliku od standardnog mysql_connect …

Hvala

podesi parametre u config file-u.
jer 10 istovremeno je ništa.

[quote=“havoc”]a) sto tocno podrazumijevas pod optimiziranim serverom … server je standardne konfiguracije na VPS-u … nista specijalno nije podeseno

b) nema naprezanja drugih hostova … ram, swap, procesor, load … sve je to na najmanju potrosnju svedeno inace kad radi bez ovih inserata svaku sekundu

c) pa moze bit i svakih 15 sekundi ili 30 … baza je normalizirana, InnoDB engine … postavljeni indexi, foreign keyevi … relacije itd.

Mislis samo pconnect za taj insert koji se odvija svakih xx sekundi ili za cijelu applikaciju … nisam koristio jos permanent connect … kako se on odrzava na resurse i samu aplikaciju za razliku od standardnog mysql_connect …

Hvala[/quote]

a) egazktli. Default konfiguracija je daleko od optimizirane.
b) My bad, bolji izraz bi bio: ako ovi sto dijele server s tobom naprezu masinu, zna doc do pada performansi. Ne sto dijele as vise virtual hostova na istom image-u vec svi ukupno na tom stroju koji je virtualiziran. Doduse, manje vjerojatno je da je u ovom slucaju to.

c) e onda probaj s 15, 30.

Enivej, A/C issues combo rijesi i bit ce bolje.

Mozda sve to dislocirat? Staviti pracenje korisnika preko anayliticsa a chat odvojeno. Bitno je sto se misli pod pracanje, dali imat statistiku njihovu ili imat za bas svakog pojedinog sve podatke o njemu. nisam shvatio svrhu svega?

Što se chat-a tiče pogledaj Meteor
http://meteorserver.org/
koji koristi Comet “tehnologiju” tako da server oslobodiš nepotrebnih requestova svake sekunde.

Što se ostatka tiče, ne vidim potrebe da refrešaš informacije o korisniku svake sekunde. Ako te zanima što točno korisnik radi možeš istu funkcionalnost dobiti i refrešanjem informacije prilikom svakog requesta.

Što se session-a tiče, mi smo na jednom site-u implementirali pohranu sessiona u bazu podataka koristeći Zend_Session database save handler uz male modifikacije koje nam omogućuju i upisivanje korisničkog ID-a u zasebno polje. To je možda još i najbolje riješenje jer onda u tu tablicu možeš pohraniti i informaciju o tome koji je bio korisnikov zadnji request, a informacija o tome kada je session kreiran se već unutra nalazi. Tako si ubio dvije muhe jednim udarce :slight_smile: Na taj način možeš vidjeti i ako je više korisnika ulogirano sa istim korisničkim imenom, disable-ati druge korisnikove sessione ukoliko je npr. promijenio lozinku i sl.

nikad ne stavljaj na virtualnu mašinu OS i gore produkcijsku bazu.

Ja bi to riješio npr. sa dodatnim poljem u tablici User koje bi bilo 0 ili 1. 0 nije logiran, 1 je logiran, kada se korisnik prijavi postavi se polje na 1 i onda radiš s njim što hoćeš, broj logiranih korisnika se pokupi kod svakog requesta na stranici kako je već netko spomenuo. Druga solucija je kako reće ‘gog’ sa sessionom, database ili flatfile svejedno. Nemam pojma čemu toliki inserti u bazu, ustvari čemu uopće inserti, kad bi bilo dovoljno

SELECT COUNT(*) FROM ‘tablica’,

mislim da ste totalno krivo kreirali taj dio aplikacije.

A kad se “odjavi”?
“Odjavi” je u navodnicima jer korisnik se ne mora odjaviti na niti jedan nacin, jednostavno moze ugasiti browser.

Zasto ne zapisivati u bazu samo akcije korisnika? Sta ce ti 50 zapisa dokle je jedna forma otvorena, sta se time dobije? Samo brdo dupliciranih podataka koje ionako prilikom analize moras maknuti. A i zadati ce velike glavobolje kod pokusaja tracinga i profilinga kretanja korisnika.

Ja u poslovnim aplikacijama zapisujem (logiram) samo akcije korisnika, poput izbrane komande, koji objekti se izvrsavaju, i veci zapis ide jedinu u slucaju greske, onda zapisem cijeli stack trace.
Preko tih zapisa se moze u potpunosti pratiti korisnik, od logiranja, rada, kretanja kroz app, do gasenja aplikacije.

[quote=“ivan.skugor”]A kad se “odjavi”?
“Odjavi” je u navodnicima jer korisnik se ne mora odjaviti na niti jedan nacin, jednostavno moze ugasiti browser.[/quote]

Nema problema ni sa tim, ako je browser ugašen prilikom pregledavanja stranice ili je korisnik na neki drugi naćin napustio stranicu, a da se nije konkretno odjavio, za to postoji session_gc kao svojevrsni garbage collector.

Ukoliko je provjerom ustavljeno da taj korisnik više nije online ili nije aktivan više od xy vremena jednostavno se briše iz session tabele ili iz tmp foldera, a nakon uspješnog izvršenja tog dijela update-a se status tog korisnika s 1 na 0.

Pogledaj si ovo

Malo sam ga zakomplicirao s objašnjenjem ali nadam se da je barem donekle jasno.


Copyright © 2020 WM Forum - AboutContact - Sponsored by: Mydataknox & Webmaster.Ninja