Az új szerver néha kihagy
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!
■ 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!
ezt nezd meg
Köszi
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)
Rossz tervezés
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?
beszéltem velük
(
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)
)
Párhuzamos kérések
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.abort?
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.
Lehet hogy én egyszerűsítem
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 :-/
Mélyen
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!
Igen
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.Köszi!
Köszönöm a segítséget!
Ezt tesztelni kéne...
A kétszer megérkező kéréseket és válaszokat pedig a sorszámozással ki tudod védeni.
abort