Avatar billede anders159 Nybegynder
19. marts 2007 - 20:09 Der er 12 kommentarer

att: arne_v (arkitektur og performance)

Hej Arne.

Håber du ser denne besked og har 10 min til at hjælpe.
Er i et tidligere forsøg på at spørge direkte efter dig blevet bekendtgjort med at man kun må gøre dette hvis man ikke uddeler points, derfor er der ingen points i dette spørgsmål. Håber du gider alligevel.

Mit problem består i at overkue performance/flaskehalse iforhold til valg af arkitektur. Jeg har brug for hjælp til at finde den bedst mulige løsning og eventuelle fejl ved den måde jeg har valgt at gribe det an på.

kort fortalt er jeg ved at lave en webchat og jeg bygger på et eksemple fra nettet. Der andvende AJAX.

----------------------------

Den oprindelige koden er groft sagt delt op i 3 stykker.

klient:
En client.aspx side, ingen nævneværdig codeBehind.
Indeholder html og javascript der bruges ved kald til serveren(server.aspx.cs)

Server:
En Server.aspx.cs, ingen frontcode(kun ref linien).
Siden håndtere klient requesten i 'onPageLoad'. Den kalder chatEngine og retunere svaret til klienten.

ChatEngine:
En chatEngine.cs fil.
ChatEngine håndtere selve chat afviklingen, brugerlogin, beskeder...Alt det der nu skal til.
Bruger og beskeder ligger i hvert deres stirng array.
ChatEngine er skrevet som 1 chatrum og kan pt håndtere 30 brugere.
ChatEngine.cs objectet bliver oprette som en global instans ved applications start.

----------------------------

ovenstående køre fint, men nu kommer så min udbygning.


Jeg tænkte at hvert af de 100 chatrum skulle køre som tråde(tester kun med 3 rum).
der bliver nu lavet 3 instanser af ChatEngine i global.ascx.cs ved runtime og de blive lagt i en liste. Requesten fra klienten indeholde et ekstra id, der
så bruges af Server.aspx.cs til at finde det rigtige chatrum i listen.


prototype test af dette køre ok.

Jeg kan dog ikke overskue konsekvenserne ved 3000 brugere på engang.
Kan en side, idette tilfælde server.aspx.cs, håndtere alle de kald 3000 brugere ville afgive.
skal ChatEngine isted for tråde køre som en NT-Service.
Er dette valg af arkitektur ubrugeligt.
Hvis ja, hvad gør jeg så..........ect ect ect :)

!! Ved ikke lige hvordan jeg skal formulere konkrete spørgsmål, men håber du ud fra ovenstående kan lave en diagnose og en anbefalet kur ;)

Serveren dette skal køre på er en Proliant DL380 G3 med
1 processor.

Med venlig hilsen
Anders
Avatar billede arne_v Ekspert
19. marts 2007 - 20:21 #1
Jeg er ikke helt klar over hvordan du vil gå fra den tråd der processer request
til de tråde du vil bruge til chat engine ...
Avatar billede arne_v Ekspert
19. marts 2007 - 20:23 #2
Generelt er problemet med HTTP baserede chats at de drukner serveren med mange
brugere.

Lad os sige at du refresher hvert sekund - med 3000 brugere er det 3000 requests per
sekund eller 180000 requests per minut.

Ved et alternativ med:

flash/Java applet/.NET smart client på client
en .NET app (ikke ASP.NET web app) på server
scoket kommunikation

så kan du pushe fra server til clients - det er langt mere effektivt.
Avatar billede erikjacobsen Ekspert
19. marts 2007 - 20:33 #3
Sådan i meget grove træk, kan en "almindelig, moderne server" godt levere 3000 requests af en statisk fil - f.x. et billede.  Regn med mindre, hvis det er en dynamisk side (.aspx), og regn med meget mindre, hvis der er diskaktivitet involveret, f.x. en database. I sidste tilfælde måske i størrelsesordenen 100 req./sek, men afhængig hvor mange sql-kald man laver, og udstyret iøvrigt.

Og tallene er selvfølgelig bare grove estimater, men forhåbentlig brugbare som et udgangspunkt.
Avatar billede anders159 Nybegynder
19. marts 2007 - 21:07 #4
hejsa og tak for jeres response.

du har nok ret med trådene, det hele er lige styrtet sammen..tror aldrig det har kørt i tråde men bare som enkelte objekter.

havde tænkt at refresh skulle være 2 sekunder.

Det er desværre et ufravigeligt krav at dette bliver webbaseret, så jeg må finde den bedst mulige måde inden for denne ramme..

hvad ville du i grove træk anbefale?
Avatar billede arne_v Ekspert
19. marts 2007 - 21:14 #5
jeg ved ikke om jeg vil anbefale noget - der er ikke mange valgmuligheder

kan du tillade dig at antage:
1) antal brugere begrænse af hvad en server kan klare
2) hvis serveren går ned så er alle samtaler tabt
?

fordi så kan du køre det hele i memory - og det hjælper da altid lidt
Avatar billede dna Nybegynder
19. marts 2007 - 21:20 #6
Ellers skulle du skalere på serverne... lave det således at f.eks. forskellige chatrum kører på forskellige servere.

Hardware er trods alt meget billigt i forhold til programmør-løn.

dna
Avatar billede innercitydk Nybegynder
20. marts 2007 - 16:19 #7
Jeg ville kigge på AJAX teknologi til opdatering af klienterne ved ændringer (nye beskeder, brugere etc). Det smarte her er at du undgår postbacks. Dvs at siden ikke står og klikker ved hvert refresh. Du kan læse mere her: http://en.wikipedia.org/wiki/AJAX

Du kan hente Ajax.Net (tidligere Atlas) her: http://ajax.asp.net/

Der findes forskellige easy to use løsninger til .net. Bla. http://www.anthemdotnet.com, dog skal du være opmærksom på at et library som anthem sløver systemet yderligere. Lav derfor selv jscripts (der findes et hav af eksempler og tutorials på nettet)

Hvad angår selve chatten kan du nøjes med at opdatere databasen, den binære fil, eller hvad du bruger som persistens hvert 10 sek, eller f.eks hver gang der er skrevet 100 beskeder. på den måde kan du gøre belastningen væsentligt mindre. På den måde kan du sikkert også håndtere flere brugere. Husk på at er det et offentligt chatrum du laver så skal du logge alle bekseder, hvor lang tid ved jeg ikke.

Hvis du regner med ekstrem mange brugere på een gang skal du klart overveje selv at hoste løsningen.

Bare lige et par tanker herfra.

Vh Nicki
Avatar billede arne_v Ekspert
20. marts 2007 - 16:33 #8
En ting man skal huske er at AJAX goer at brugeren ikke ser refresh blink, men
beladtning server side fra requests per minut aendres ikke ved at det er AJAX
initierede requests.
Avatar billede anders159 Nybegynder
01. maj 2007 - 09:28 #9
Først undskyld mit fravær.

derefter, tak for alle jeres indlæg. Har fået lavet en ok løsning tror jeg.
ajax kaldt fra javascript.
8 server.aspx sider til at håndtere 1600 chatrum.
set hele ser ud til at køre fint og nogenlunde let at udbygge.

planen er selv at hoste løsningen, selv om jeg ingen erfaring har med dette, men det lærer man vel hen af vejen.

endnu engang tak for alle jeres svar :)
Avatar billede anders159 Nybegynder
17. august 2007 - 19:18 #10
lukket
Avatar billede anders159 Nybegynder
17. august 2007 - 19:19 #11
ingen været væk alt for længe... points anyone :)
Avatar billede arne_v Ekspert
18. august 2007 - 02:05 #12
selvfølgelig ! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester