[ tdusko @ 06.03.2009. 12:55 ] @
Imam asp.net aplikaciju koja se nalazi na windows serveru 2003, a iis je 6. Aplikacija je ogromna i ima mnogo korisnika mada to nije bitno za ovaj problem. Ono sto je bitno jeste da je aplikacija delimicno multitenant. Sta to znaci? Znaci da svi korisnici(firme) dolaze na istu adresu i opsluzuje ih jedan isti kod ali svaka firma ima svoju bazu. Specificnosti u vidu custom slika, xslt-ova, css-ova i sl su resene preko foldera gde svaka firma koja ima nesto specificno ima svoj folder. E sad zasto delimicno multitenant? Pa zato sto se ceo sajt nalazi u jednom pool-u u iis-u.

Zaci, jedan sajt(www.xyz.com), jedan pool(www.xyz.com), isti kod na file sistemu, jedna ip adresa, a vishe baza.

Predpostavljam da uvdjate u cemu je problem, a to je da kada jedan ulogovani korisnik "zakuca" aplikaciju iz bilo kog razloga, svi ostali ostaju bez sesije tako da hocu da mi svaki klijent ili bar vazniji klijenti imaju svoj sopstveni pool tako da ne bi ostajali bez sesije kada neko drugi skrshi aplikaciju. Uslov je da se ostalo nista ne menja drasticno. Znaci, ostaje jedan kod, jedna ip adresa.

Koliko se ja razumem u IIS, na raspolaganju su mi dve mogucnosti da ovo uradim:

1. Napravim n pod domena;pera.xyz.com, zika.xyz.com, mika.xyz.com... i za svaki taj sajt podesim jedan isti home direktorijum u kome se nalazi aplikacija. Takodje, napravim n istoimenih pool-ova tako da svaki sajt ima svoj pool. Podesim svima istu IP adresu ali svaki od njih ima razliciti host header. Dodam u DNS parove simbolicka adresa-IP adresa.

2. Napravim n virtuelnih direktorijuma u postojecem sajtu, /pera, /zika, /mika. Svakom od tih n virtuelnih direktorijuma podesim isti home directorijum i takodje svakome dodam svoj pool. Nema zezanja sa DNS-om i IP adresama.

E sad, konkretan problem i razlog zasto sam otvorio temu:
Ono sto ja ocekujem je da kada su recimo aktivne 3 sesije na 3 razlicita pod domena(na svakom po jedna) da na serveru imam 3 worker procesa i da kada ubijem neki od njih da mi se na klijentu odmah nakon sledeceg request-a pojavi poruka "Service Unavailable"

Medjutim, kada sam probao varijantu 1 to se nije desavalo. Na primer: otvorim sajt iz mozile, zapocne sesija, stopiram pool na serveru - u browseru mi je i dalje aktivna sesija sve dok ne zatvorim tab! Nakon zatvaranja i ponovnog otvaranja taba dobijam poruku "Service Unavailable". Jos cudnije je sto nakon dobijanja poruke "Service unavailable" (podsecam da je pool i dalje stopiran) iz IE-a mogu komotno da otvorim taj sajt.

Kada probam varijantu 2 sve se odigrava bas onako kako ocekujem. Zapocnem sesiju, ubijem pool, sledeci request koji posaljem dobijam "Service Unavailable". Ostali rade ok. Problem sa ovim resenjem 2 je sto moram da pravim izmene u kodu pa mi je jedino zbog toga varijanta 1 izgleda "elegantnije".

Da li je neko iz ovog romana uvideo neki eventualni propust koji dovodi do toga da mi se IIS ne ponasa kako bih ja hteo u varijanti 1? Takodje ako vidi neki potencijalni problem na koji bih mogao da naletim slobodno neka kaze

Hvala

[ pl4stik @ 08.03.2009. 12:10 ] @
Pazi vamo

Odavde..

Citat:
tdusko: Imam asp.net aplikaciju koja se nalazi na windows serveru 2003, a iis je 6. Aplikacija je ogromna i ima mnogo korisnika mada to nije bitno za ovaj problem. Ono sto je bitno jeste da je aplikacija delimicno multitenant. Sta to znaci? Znaci da svi korisnici(firme) dolaze na istu adresu i opsluzuje ih jedan isti kod ali svaka firma ima svoju bazu. Specificnosti u vidu custom slika, xslt-ova, css-ova i sl su resene preko foldera gde svaka firma koja ima nesto specificno ima svoj folder. E sad zasto delimicno multitenant? Pa zato sto se ceo sajt nalazi u jednom pool-u u iis-u.


.. do ovde i deo onoga kad pravish foldere po organizacijama/korisnicima (obicno su tu i dinamicki fajlovi xml, aspx, moze tu svasta) je programerski deo. Posto "Aplikacija je ogromna i ima mnogo korisnika mada to nije bitno za ovaj problem" verovatno znaci odlican postojeci hardver*softver.
Ostalo je da se code na jednom mestu izvrsava i o tome mozes da pitash sta te interesuje kao i deo sa bazama. Kolko sam mogo da shvatim ovako uopsteno tebi predstavlja problem (ni manje ni vishe nego) app state pa bi za to trebao da navedesh gresku koju app vraca i jesi li pogledao sta je i kako radi Membership Provider ASP.NET2.0 core component (class).

Za onaj deo o IIS-u proveri http://learn.iis.net

Happy workarounding






[ tdusko @ 11.03.2009. 10:09 ] @
Par reci o samoj aplikaciji koje sam napisao bilo je samo u svrhu uvoda kako bih blize objasnio problem, a opet da bi neko uopste razumeo o cemu se radi i da mi mozda pomogne. Ocigledno da nisam bio dovoljno jasan cim ti mislis da je problem u app state-u i da imam neku gresku.

Pokusacu da pojasnim malo bolje:

Postojece stanje:
- Jedna web aplikacija(asp. net)
- Jedna IP adresa
- Jedan pool
- Jedan working directory
- SSL
- Svaki klijent, svoja baza

Aplikacija radi najnormalnije, nikakvih problema sa state-om nema. Medjutim, problem je u tome sto je administratorima u aplikaciji dozvoljeno da pishu odredjenim jezikom neke formule koje ce se izvrsavati na klijentskom delu. U nekom trenutku, desava se da ta formula prouzrokuje beskonacnu petlju i u tom trenutku sajt postaje down. Posledica: user x iz kompanije y je skrsio sesiju SVIMA zato sto su svi u jednom pulu.

Moja ideja je da svakom velikom klijentu kreiram novi sajt koji ce imati svoj pool. Pa kad za*ebe formulu, neka samo njemu pukne sesija. E sad, problem je sto taj novi sajt MORA da bude nad istim direkrorijumom i MORA da bude na istom IP-u. Razlicit IP ne dolazi u obzir jer su u najavi desetine pa i stotine novih sajtova.

Probao sam da u okviru postojeceg sajta napravim virtualne direktorijume sa svojim pool-ovima nad istim direktorijumom i to radi skroz ok. Problem je sto cu morati da menjam kod u tom slucaju.

Drugi nacin je da napravim nove poddomene, osvezim DNS i da dodam host header-e sajtovima kako bi iis znao koji sajt sam pozvao posto su svi na istom IP-u. Taj pristup mi je pozeljniji jer u tom slucaju ne moram da menjem kod. Medjutim, ne radi mi to kako treba. Sta se desava, opisao sam u prvom postu.

Ono sto sam uspeo da otkrijem od kada sam pokrenuo ovu temu jeste to da postoji problem kada sajtovi na istom IP-u koriste SSL i host header-e.

[ pl4stik @ 18.03.2009. 09:49 ] @
Ma, mi se nesto ne razumemo.. Aplication state je nesto sto zapocne kad sajt postane aktivan i trebalo bi da se zavrsi kad nastane greska na nivou app ili se sajt jednostavno ugasi znaci ne prekida se i ima ga jedan, a session se kreira za svakog korisnika posebno kad se autentifikuje i traje po defaultu (ako nista ne diras) nekih 20 i kusur minuta valjda bese i ima ih vise. E ti sad kazes "skrsi" session svima i to mene muci, zato sam i napisao da dash gresku koju vrati kad se to nesto desi. Ovo pricam jer i ja radim na intranetu sa vise IIS-a i vise razlicitih DB-a i jednom IP adresom gde je sajt ali sam sajt kontaktira vise racunara gde su te baze i drugi sajtovi/servisi, ~2000 korisnika koji rade crud itd... i greske se desavaju al taman posla da mogu da obore sajt u bilo kojoj varijanti. Sve u svemu nedopustivo je da jedan korisnik prekine Aplikation state jer session state sluzi bas za kontrolu toga sto tebi treba (izmedju ostalog) tako da sam ubedjen da ti arhitektura ne valja, naravno ovo je samo moje misljenje.. Opet kazem meni se cini da pokusavas da konfigurises IIS tako da svaki korisnik dobije svoj app state !?!

P.S. Izasli su novi filmovi na www.asp.net/learn pa IIS
[ tdusko @ 18.03.2009. 10:41 ] @
Kada sam rekao da jedan moze da skrsi svima sesiju nisam mislio da direktno poubija svima sesije vec indirektno tako sto izazove restartovanje pool-a. Iz toga sledi da su sve sesije ubijene. Konkretno, kod mene se to desava kada se napravi beskonacna petlja u COM objektu koji moja ASPX aplikacija koristi, a greska se vidi u Windows-ovom Event Viewer-u, u System odeljku i kaze:

A process serving application pool 'v60 AppPool' suffered a fatal communication error with the World Wide Web Publishing Service. The process id was '1572'. The data field contains the error number.

To je razlog zasto hocu da mi svaki klijent ima svoj pool.