PDA

Pogčedajte punu verziju : bigspy backend


dee
20. 05. 2007., 19:56
http://labs.digg.com/bigspy/

imam slican zahtjev za napravit.

dakle, kada korisnik napise novi tekst (ili je neki tekst dobio novi glas, ili, itd itd...), on se pojavljuje u listi na vrhu.

kako ovome pristupiti? ideje? cisto generalno...

MorenoArdohain
20. 05. 2007., 21:44
Hint: AJAX

jablan
20. 05. 2007., 22:29
Načelno, realizacija je samo flavour web-chata.

dee
20. 05. 2007., 22:43
moze li malo detaljnije?

konkretno, kako flash 'gleda' kad se pojavljuje novi tekst?

MorenoArdohain
21. 05. 2007., 00:36
Klijent svakih XX (mili)sekundi salje serveru poziv tipa: "ima li neki novi podatak za prikazati"?
Server odgovara "Nema".
I opet: "Nema".
I onda "Nema pa nema".
Odjednom se desi da ima.
I server kaze:
"Ej stani, imam nesto za tebe".
Klijent onda kaze "Super, hvala, sad cu ga prikazati".

I tako ukrug.
Sve ostalo su nijanse.

MorenoArdohain
21. 05. 2007., 00:37
A valjda ti je jasno da za praksu moras da se pomucis.

:)

nixa
21. 05. 2007., 00:48
mislim da ovo preko digg-a funcionise preko XML socket-a ....

postoje x nacina da se ovo resi

ivanhoe
21. 05. 2007., 00:53
nisam siguran da je konstantno cimanje servera idealno resenje... ovakve stvari su pre za COMET tehnologiju sa socket serverom... otvoris konekciju i drzis je otvorenu, i kad se nesto pojavi server salje klijentu podatke.. ovo nije zgodno za klasican setup sa apachom ukoliko ima vise od 40-tak klijenata istovremeno, ali zato je super ako postoji mogucnost za zaseban socket server (ili lighttpd sa comet modulom, cini mi se da je tako nesto najavljeno da se pravi..)

dee
21. 05. 2007., 01:07
Klijent svakih XX (mili)sekundi salje serveru poziv tipa: "ima li neki novi podatak za prikazati"?
Server odgovara "Nema".
I opet: "Nema".
I onda "Nema pa nema".
Odjednom se desi da ima.
I server kaze:
"Ej stani, imam nesto za tebe".
Klijent onda kaze "Super, hvala, sad cu ga prikazati".

I tako ukrug.
Sve ostalo su nijanse.

to je jasno (mislim na trud za praksu ;) ), ali sto ivanhoe rece, nisam siguran da je najsretnije rjesenje. pogotovo kad nahrupi usera.


mislim da ovo preko digg-a funcionise preko XML socket-a ....

postoje x nacina da se ovo resi

upravo i pitam za neka od njih...



eto ivanhoe rece (tnx) drzanje otvorenog socketa i slusanje...to mi zvuci kao dobra ideja... ima li mozda jos neki prijedlog?

nixa
21. 05. 2007., 01:20
pa ako imalo poznaješ XMLSocket() u Flashu nece biti problema ... stvar je već do same realizacije ...

serverski deo možeš da rešiš čak i preko php-a ... što ne preporučujem ako je iole zahtevniji klijent

Blood
21. 05. 2007., 02:35
to je jasno (mislim na trud za praksu ;) ), ali sto ivanhoe rece, nisam siguran da je najsretnije rjesenje. pogotovo kad nahrupi usera.


Klijent svakih XX (mili)sekundi salje serveru poziv tipa: "ima li neki novi podatak za prikazati"?
Server odgovara "Nema".
I opet: "Nema".
I onda "Nema pa nema".
Odjednom se desi da ima.
I server kaze:
"Ej stani, imam nesto za tebe".
Klijent onda kaze "Super, hvala, sad cu ga prikazati".


eto ivanhoe rece (tnx) drzanje otvorenog socketa i slusanje...to mi zvuci kao dobra ideja... ima li mozda jos neki prijedlog?

Pa to je upravo ono sto i COMET radi, znaci na svakih x sekundi proverava da li se nesto novo desilo, ako jeste vrati rezultat, ako nije, nikom nista.. :)

ppavlovic
21. 05. 2007., 07:11
Pogledaj http://whos.amung.us/show/oqwq70li kroz Firebug.

Upitaj server svakih X sekundi (gde je X neko srednje vreme pojave novih tekstova). Stavi kesiranje sa strane servera na X sekundi da ne bi svaki put pitao bazu i formatirao JSON / HTML / XML ili sta vec vracas kao rezultat.

dee
21. 05. 2007., 09:05
Pogledaj http://whos.amung.us/show/oqwq70li kroz Firebug.

Upitaj server svakih X sekundi (gde je X neko srednje vreme pojave novih tekstova). Stavi kesiranje sa strane servera na X sekundi da ne bi svaki put pitao bazu i formatirao JSON / HTML / XML ili sta vec vracas kao rezultat.

ovo mi se svidja! hvala ti!


nixa, ovo server side rjesenje u PHPu za XMLSocket(), mislis na ono while(true) {} pa unutar toga slusanje socketa? ili nesto drugo?

ivanhoe
21. 05. 2007., 12:42
Pa to je upravo ono sto i COMET radi, znaci na svakih x sekundi proverava da li se nesto novo desilo, ako jeste vrati rezultat, ako nije, nikom nista.. :)

AFAIK, comet je tehnika drzanja otvorene konekcije, gde se podaci push-uju, a ne pull-uju... znaci kod cometa server ceka da se nesto desi i onda shibne podatke klijentima, a klijenti sve vreme sede i cekaju podatke, bez da cimaju server svakih xyz (mili)sekundi.

dee
21. 05. 2007., 12:50
da, neki scenario bi trebao biti: skripta koja objavljuje clanke, prilikom objave clanka salje u socket info o novom clanku a npr. XMLSocket() u Flashu 'sjedi i ceka' i odradi nesto kad podaci dodju...

ostaje pitanje kako da zavrtim PHP skriptu (koja glumi server) da se vrti beskonacno neovisno o script_execution_time...

[edit: set_time_limit(0) izgleda rjesava stvar]

MrSteel
22. 05. 2007., 00:36
jeste pogledali kako su oni to zaista resili :)

MrSteel
22. 05. 2007., 01:11
http://stamen.com/

Free Flash API toolkit
http://code.google.com/p/diggflashdevkit/

Digg API homepage
http://apidoc.digg.com/

super je sto ima i XML i JSON i Javascript i PHP seriajalizovane objekte

kao primer service rezultata
http://services.digg.com/stories/2040557?appkey=http%3A%2F%2Flabs%2Edigg%2Ecom%2Fbi gspy

ivanhoe
22. 05. 2007., 02:26
nije tesko resiti klijenta, ovde je frka da se odradi serverski deo tako da kad ima dosta klijenata:
1) ne pojede svu memoriju
2) radi dovoljno brzo sa gomilom otvorenih socketa

za razuman nivo saobracaja to nije mnogo tesko napisati u npr. perlu, ali naravno ne treba izmisljati toplu vodu, ima gomila (polu)gotovih resenja...

kad smo vec kod ovoga, koji besplatni socket server bi vi preporucili ?

MrSteel
22. 05. 2007., 07:47
bigspy nije na socketima, to je bila poenta mog posta
upravo tako se stedi memorija, mislim da bi digg prso kad bi morao da radi tako

inace red5 je besplatan vrhunski socket server, radi i video i audio streaming itd.

dee
22. 05. 2007., 09:36
MrSteel, hvala na linkovima!

ipak najobicniji requesti?


Requests

* See ResponseTypes for details on specifying desired media type in a request.
* All requests must include an Application Key.
* All requests must include a User-Agent HTTP Header (see below).
* Requests made from Javascript running on your web pages must be proxied to avoid same-origin policy conflicts.


Now consider an application that keeps track of current data in real time. That application should:



1. Make an initial request with no min_date or max_date argument. The response will include only the latest items. The end of the implicit time period can be found in the timestamp property of the root element of the response--it'll be close to the time when the request was received.
2. Note the timestamp in the response, and make another request with that timestamp as the min_date argument. The response will include items which immediately follow that timestamp, and a new value in the timestamp property.
3. Repeat step 2 to get even more current data.

MrSteel
22. 05. 2007., 09:40
ti ispostuj formu ali u sustini i dalje radi LoadVars.load(URL) u flash-u

dee
22. 05. 2007., 10:53
ti ispostuj formu ali u sustini i dalje radi LoadVars.load(URL) u flash-u

cini se da ce ipak tako i biti, bar za pocetak dok nema nesto korisnika. iako, problem mi je sto ne znam sta ocekivati u realnom slucaju, konkretno, recimo da radim LoadVars svakih 2-3 sekunde, do koliko korisnika ovo rjesenje moze funkcionirati pristojno?

nije tesko resiti klijenta, ovde je frka da se odradi serverski deo tako da kad ima dosta klijenata:
1) ne pojede svu memoriju
2) radi dovoljno brzo sa gomilom otvorenih socketa

za razuman nivo saobracaja to nije mnogo tesko napisati u npr. perlu, ali naravno ne treba izmisljati toplu vodu, ima gomila (polu)gotovih resenja...


ivanhoe, mozes li molim te biti konkretan, sta znaci 'razuman nivo saobracaja'? koji su nedostaci PHP rjesenja na server strani za socket server? i ako imas pri ruci, ajd molim te stavi neki link prema tim (polu)gotovim rjesenjima...


puno hvala svima jos jednom

MrSteel
22. 05. 2007., 11:15
po pitanju server strane service moze imati vise korisnika nego socket
socket je trajna konekcija dok je service on request
cak bi se moglo reci i da service request kao sto je digg moze imati neograniceno korisnika i to je naravno jedan od razloga sto su uradili servis, pored najvaznijeg koji je taj sto servis omogucava 3rd party developerima da odradjuju biznis i promovisu digg (i opet prosire broj korisnika / pregledaca digg-a)

socket pak ima svoja ogranicenja u broju korisnika nakacenih,
i nemoj koristiti PHP za to resenje ako se odlucis
perl je super, java je super

sta ti tacno zelis da uradis?

OT: zanimljiv link, povezan sa ovim http://www.agiledelta.com/product_efx.html

dee
22. 05. 2007., 11:24
socket pak ima svoja ogranicenja u broju korisnika nakacenih,


da, to me i zanimalo, neka usporedba request/socket slucaja ovisno o broju nakacenih korisnika.



i nemoj koristiti PHP za to resenje ako se odlucis
perl je super, java je super
sta ti tacno zelis da uradis?


sa perlom sam na Vi, o javi tek pojma nemam... a daju se napisati PHP skripte koje otvaraju socket i salju klijentu sto mu vec treba (znaci prakticno glume server). na to sam mislio. (ako me to pitas)

MrSteel
22. 05. 2007., 11:47
mislio sam sta tacno pravis :)

dee
22. 05. 2007., 12:03
a, sorry :)

schema je:

- korisnici na sajtu upisuju novi item (item je naslov+link)
- korisnici mogu listati/komentirati poslane iteme
- korisnicima se prikazuje lista zadnje dodanih (prica s ovog topica) itema

recimo da je to neki osnovni okvir.

Blood
22. 05. 2007., 13:12
AFAIK, comet je tehnika drzanja otvorene konekcije, gde se podaci push-uju, a ne pull-uju... znaci kod cometa server ceka da se nesto desi i onda shibne podatke klijentima, a klijenti sve vreme sede i cekaju podatke, bez da cimaju server svakih xyz (mili)sekundi.
Hm..imas li negde neki primer kako to napraviti(ja sve sto sam nasao su samo prazne price, nigde neki praktican primer)?

ivanhoe
22. 05. 2007., 13:55
Hm..imas li negde neki primer kako to napraviti(ja sve sto sam nasao su samo prazne price, nigde neki praktican primer)?


pa za perl postoji dosta primera, postoje i gotovi moduli koji to rade, npr. POE (http://search.cpan.org/~rcaputo/POE-0.9989/lib/POE/Component/Server/TCP.pm) ... Za php ne znam, nisam cuo da je neko pravio TCP server u php-u, mada verovatno moze. Problem sa php-om je ranije bio da on nije pravljen kao shell jezik, mada sad ima CLI, i to sto AFAIK trosi dosta cpu kad radi sa socketima (vise od perla)

Sto se tice cometa u php, tu je obicno varijanta da se koristi apache, da se stavi set_timeout(0), i da se onda napravi beskonacna petlja tipa:
while(1) {
uradi_nesto();
if($gotovo)
break;
usleep(500);
}

Na ovu foru je radjena vecina php chatova koji mogu da se nadju na netu.. Problem sa ovim je da prosecna masina sa 2GB moze da podnese nekih 150 instanci apacha (plus mysql), i onda pocne da swapuje... znaci za vise od 10-tak korisnika istovremeno moras da imas dedicated server..

@dee: Ne mogu da ti kazem tacne cifre sta je to "razumno opterecenje", nemam dovoljno iskustva sa tim, a i zavisi od kolicine memorije i raznih drugih podesavanja servera. Select funkcija koja se koristi za proveru otvorenih socketa se na nekim sistemima uspori preko 256 socketa (posto koristi neku binarnu mapu za mapiranja socketa, zaboravio sam detalje). Ono sto sam ja probao je perl TCP server baziran na POE modulu opterecen sa 50 klijenata i to je radilo odlicno (ne secam se tacno koji je server bio u pitanju, ali nije bio mnogo jak). Pitaj Zextru, seca se da je i on radio nesto sa POE i da je to super radilo.

Sto se tice otvaranja socketa per request vs. per session, sve zavisi koliko cesto se radi refresh. Otvaranje socketa je "skupa" procedura, povecava saobracaj i opterecuje CPU i OS (isto je kao otvaranje fajlova), plus ako server forkuje procese za svaki zahtev to dodatno usporava sve i trosi resurse na gomilu otvorene dece, pa ako ces cesto da radis refresh apsolutno se ne isplati raskidati i uspostavljati vezu svaki put. Downside je da moras da imas dedicated server ako planiras da instaliras sopstveni TCP server, ne verujem da ce iko to da te pusti na komercijalnim hostinzima..

Blood
23. 05. 2007., 17:52
@dee:
Mozda ovaj clanak pomogne:
http://ajaxian.com/archives/effectreappear-adding-news-updater-portlet-to-ajaxiancom

ivanhoe
23. 05. 2007., 18:26
@dee:
Mozda ovaj clanak pomogne:
http://ajaxian.com/archives/effectreappear-adding-news-updater-portlet-to-ajaxiancom

ovo resenje jeste jako prosto za implementaciju, ali oni svakih 20 sekundi update-uju news box, a pritom koriste wordpress, sto znaci da svakih 20 sekundi:
- apache dobije zahtev, i prosledi ga nekom svom detetu na obradu. Ako nema dovoljno preforkovane dece, treba isforkovati novi apache proces
- php modulu ucita i isparsira potrebne php skripte (a posto koriste wordpress to je tipa 5-10 includova, zavisi koliko pluginova imaju)
- wordpress odradi sve potrebne upite na bazi (jedno bar 3-4)
- ovaj njihov plugin procita sadrzaj direktorijuma, i inkluduje fajl sa vestima

i to tako za svakog klijenta koji ima otvoren ajaxian u browseru... mozda sam ja staromodan, ali po meni je to daleko od optimalnog pristupa..

zira
23. 05. 2007., 18:57
Pretpostavljam da kesiraju na serverskoj strani

Blood
23. 05. 2007., 19:01
Ajaxian inace radi jako jako sporo. Ovaj primer je za wp koji oni koriste, ako pises za neko tvoje custom resenje, siguran sam da se moze mnogo optimizovati...

dee
23. 05. 2007., 19:39
hvala Blood!

vise nisam pametan majke mi :)

cini se da imam dvije glavne varijante:

1) XMLSocket() sa necim na server strani.

2) svakih nekoliko sekundi LoadVars(url) iz flasha. URL u ovom slucaju moze biti obican txt fajl koji se pak update-a na svaki novi submit clanka, a Flash ga preuzima svakih x sekundi.

ovo drugo mi se ipak, za sad, cini optmalnijim rjesenjem posto ne opterecuje server u smislu skripti, 'samo' otvaranje txt fajla i load varijabli.

MrSteel
23. 05. 2007., 19:47
nije citanje iz txt fajla nego dinamicko generisanje sadrzaja na osnovu pristiglih podataka, a i ne mora biti tih podataka da bi ti skripta vratila nesto

ta skripta - web service - bi ti vracao XML oblik ili mozda i PHP serijalizovane podatke pa bi ih deserijalizovao na klijent strani

odustani odmah od prve varijante to se ne radi tako, socket varijanta je za nesto sto treba realtime protok, treba uciti iz primera ozbiljnih kompanija, sem toga pitao si kako ovo razjasnili smo sad vec gubis vreme na bespotreno dvoumljenje

kreni sa realizacijom pa ako zapnes rado cu ti pomoci

ako ces raditi sa flashom onda pogledaj njihov free library za digg dosta ce ti se stvari razjasniti mada je malo komplikovano za pocetnika pa te mozda zbuni

dakle moj savet, predji na delo, varijanta servis

dee
23. 05. 2007., 19:53
tako ce i biti...

hvala ti jos jednom!