ugrás a tartalomhoz

Az új szerver néha kihagy

zzrek · 2011. Május. 19. (Cs), 10.12
Sziasztok!

Dühös és csalódott vagyok, jól jönne néhány tanács, előre is köszönöm!

Egy facebook-os webappom van, néhányszáz felhasználóval a világ minden tájáról, de főleg az Amerikából.
Eddig egy magyar hosztról szolgáltam ki őket, de mivel mostanra eljutott addig a dolog, hogy egy kicsit szeretném reklámozni és felnövelni a felhasználók számát pár ezerre, valamint a felhasználók nagy része amerikai, gondoltam, hogy ott bérelek shared host tárhelyet.

A HostGatort választottam. Nagyon profinak látszott, nekem tetszett.
Az első tesztek jók voltak, áttettem az alkalmazást oda.

De sajnos a felhasználók panaszkodni kezdtek, hogy néha befagy az alkalmazás -- aztán én is tapasztaltam.

XMLHttpRequest-tel szinkron módban küldök ki nagyon kicsi csomagokat és kapok vissza aprócska válaszokat, a magyar szerverrel nem volt semmi gond.
Most viszont időről időre egy-egy kiküldött csomag (odaérkezése) megakad hosszú másodpercekre, sőt, percekre. Ez persze azt eredményezi, hogy a böngésző fennakad. A Chrome ilyenkor "kill the page or wait" ablakot is kitesz.

A lehetőségeim, ahogy látom:

1. Átírni mindent aszinkron módba: ez önmagában nem segít, mert úgyis ki kell raknom egy várakoztató homokórát az ügyfélnek, ugyanannyit kell várnia.
Azonban gondolkodtam a következőn: aszinkron módba átírok mindent, és ha nem jön válasz 1 másodpercen belül, akkor ugyanezt a kérést kiküldöm mégegyszer (tapasztalatom szerint ugyanis maga a szerver nem lesz elérhetetlen ilyenkor, pl. a ping is válaszol gyorsan) és szerver oldalon is lekezelem ezt: ha másodjára jön egy ugyanolyan kérés, azt figyelmen kívül hagyom.
Na most ez nagy munka és sok hibalehetőséget takar.

Hogy is van ez, ha ugyanazzal az XMLHttpRequest-tel újra kiküldöm a kérést, akkor a callback függvény kétszer is visszajöhet, ugye? Vagy ilyenkor csak az egyik jön vissza? Ha jól emlékszem, akkor böngészőtől is függ, X darab függő kérést kezel csak egyszerre, és ha még egyet küldök, akkor azt várakoztatja, ugye?

2. Nem foglalkozom vele, és keresek egy másik szolgáltatót... Ekkor azonban megint meg van a lehetőség ugyanerre a problémára...

Tanácsot kérek: ti tapasztaltatok ilyesmit? Mit tegyek, foglalkozzak az 1-es lehetőséggel?

Köszönöm a véleményeteket!
 
1

ezt nezd meg

dOMiNiS · 2011. Május. 19. (Cs), 10.46
http://www.joyentcloud.com/developers/free-facebook-developer-program/
4

Köszi

zzrek · 2011. Május. 19. (Cs), 11.52
Köszi, ez jó, de ebben nekik mi a jó? Nem találtam az apróbetűs részt ;-)
Azért pár tízezer forintot feláldozok a tárhelyre, nem tudom, hogy ez az ingyenes jobb lenne-e (bár a mostaninál nem nehéz jobbnak lenni)
2

Rossz tervezés

vbence · 2011. Május. 19. (Cs), 11.22
Eleve rossz tervezés szinkron-módot használni. Kényelmesnek látszik, meg jogos elvárás, hogy szekvenciálisan programozz, ne kellessen ezer callbacket egymásba ágyazni, (vagy valami még rosszabb), de jelenleg nem ez az elosztott programok realitása.

Gondolom használsz valami burkolót az XHR körül, ahol fájdalommentesen beépíthetsz egy "védelmi mechanizmust". Veziózással viszonylag könnyen megoldható a dolog. Egy azonosítót növelsz mindig eggyel, ha sikeresen végrehajtódott a kérésed, a szerveroldalon pedig nem fogadsz el kétszer ugyanzzal az azonosítóval érdező (tehát duplikált) kérést. Így mondjuk egy megismételt CREATE művelet nem fog 2 rekordot létrehozni, akkor sem ha újraküldöd.

Másrészt a szolgáltató részéről megengedhetetlen, hogy egy kérés "befagyjon" valahol. Egy ilyen bandát mindneképpen ott kell hagyni. - Amúgy velük próbáltál kommunikálni a dolgoról?
3

beszéltem velük

zzrek · 2011. Május. 19. (Cs), 11.41
Köszi, szóval szerinted érdemes átprogramoznom? Nincs valamilyen buktatója, mondjuk ha az első XHR beragad, és küldök egy másikat, akkor a második (ikszedik) nem akarja majd bevárni az elsőt?

(

Az alkalmazásom kliens oldalon "kényelmesen" van megírva, tudva, hogy a válasz megjön, szóval elég melós lesz átírni callback-esre, de ez van.
Beszéltem velük, de arra akartak utalni, hogy biztosan nálam van a hiba, nem hatotta meg őket, hogy csak ritkán jön elő meg az előző szerveren nem volt ilyesmi (stb). (Meg azt ajánlották, hogy fizessek be egy VPS-re...)
Esetleg arra megpróbálom még őket rávenni, hogy mozgassanak át egy másik fizikai szerverre (gondolom ez az egész virtuális szervereken működik)

)
5

Párhuzamos kérések

Poetro · 2011. Május. 19. (Cs), 11.54
Általában 4-8 párhuzamos kérést minden böngésző támogat. Ennél több meg valószínűleg nem fog kelleni. És természetesen már futó XHR kéréseket is meg lehet állítani az abort függvény használatával. Azért jó az aszinkron, mert nem akasztja meg a böngészőt, azaz addig az ember tud még ezer más dologot is csinálni párhuzamosan.
7

abort?

zzrek · 2011. Május. 19. (Cs), 12.25
Ez az abort minden modern böngészőben megy? (Majd megnézem a neten persze)
Tehát akkor elvileg csinálhatom azt is, hogy ha nem jött meg 1-2 másodperc múlva, akkor abortálom, és utána kiküldöm újra (vagyis ilyenkor nem kell rá számítanom, hogy a callback normál értékkel visszajelez, ugye?)
Hmm, arra is gondolni kell, ha az első kérés eljut, szerver oldalon végrehajtom, de aztán abortálva lesz még a válasz előtt (akkor kliens oldalon nem kezelődik le), aztán a második kérést elküldöm -- ekkor meg a szerver válaszol, hogy ezt már végrehajtotta... de ez nem elég, a szervernek ugyanazt a választ kell produkálnia mint amit az elsőre adott.
Vagyis az összes választ le kell tárolnom, mert a kliens lekérheti később!
Hmm, bonyolódik a dolog... Erre létre kell hoznom egy válaszbuffer táblát, amit karban is kell tartani.
9

Lehet hogy én egyszerűsítem

vbence · 2011. Május. 19. (Cs), 14.21
Lehet hogy én egyszerűsítem túlságosan a képletet, de... 2 féle kérés van. Az első nem okoz változást a perzisztens rétegben (fancy word for adatbázis), a másik pedig változást okoz.

Ami csak egyszerűen lekér adatokat, azt büntetlenül lehet ismételgetni, senkinek nem lesz baja belőle. (Persze itt jön képbe hogy akliens oldal hogyan kezeli le lezeket).

A második tipusú kérések változtatnak is, ami gyakorlatban Create, Update vagy Delete. Ezeket nem szeretnénk megismételni.

Amit javasoltam, hogy sorszámozod a kéréseket, és a nemvárt sorszámmal érkezőket figyelmen kívül hagyod véd mind a dupla insertek, mind a dupla callbackek ellen.

A gyakorlatban hasznos lehet, egy írási művelethez egyből egy olvasásit is társítani, például egy torpedó játékban, nem szeretnél egy kérést a lövésnek és még egy kérést a lövés eredményének kiolvasásához. Ilnyekor célszerű tranzakciót használni. Ha a folyamat megszakad valahol, akkor úgy veheted, hogy meg sem történt a kérés, tehát az automatikusan érkező ismételt kérést elfogadod feldolgozod, és mindne megy tovább.

Itt még érdekes helyzet állhat elő, ha a szerver feldolgozottnak tekinti a tranzakciót, de a klienshez nm ér el a válasz, ő abortálja és újraküldi a kérést. Az új küldésre pedig a szerver válaszol hibával, hogy ezt már feldolgoztuk. - Ilyenkor segíthet, ha a szerveroldalon leválasztod az írást az olvasásról, és ismételt (invalid sorszámú) kérésre is elvégzed az olvasási műveletet.

Persze ehhez már valószínűleg mélyen bele kell nyúlni a meglévő kódba :-/
11

Mélyen

zzrek · 2011. Május. 19. (Cs), 17.20
Többnyire olyan műveleteim vannak, amik a beérkező adatokat ellenőrzik, beleírnak az adatbázisba, és választ közölnek. Ezt nemnagyon tudom megismételni, mert esetlegesen az adatbázis előző állapota is kell hozzá...
Igen, sajnos nincs egyszerű megoldás, köszi a javaslatokat, segített, hogy elbeszélgettünk róla, kicsit lejjebb csitult a dühöm és tudok jobban koncentrálni a feladatra. Szép napot!
10

Igen

Poetro · 2011. Május. 19. (Cs), 14.37
Az abort minden böngészőben megy. De ez nem változtatja meg igazából a szerver oldali folyamatot. Elvégre a felhasználónak elmehet közben a kapcsolata, és újra megpróbálhatja megnyomni azt a gombot, ami kiváltja az XHR kérést.
12

Köszi!

zzrek · 2011. Május. 19. (Cs), 18.13
(A felhasználói élmény más. Nyilván, hiba esetén senki nem gondol rá, hogy folytatódjon a művelet, de nekem meg most pont ezt kell tennem: mintha nem is történt volna semmi.)
Köszönöm a segítséget!
6

Ezt tesztelni kéne...

vbence · 2011. Május. 19. (Cs), 11.54
de elvben ha abort()-olod a kérést, akkor nem foglal tovább a böngészők által limitált keretben helyet a kapcsolat.

A kétszer megérkező kéréseket és válaszokat pedig a sorszámozással ki tudod védeni.
8

abort

zzrek · 2011. Május. 19. (Cs), 12.27
Ez az abort egy jó dolog, nem tudtam róla hogy van, köszi. (A fentebbi gondolatmenetet is nézd meg légyszi)