Skalerbar chat

Tags:    php

Hej igen folkens ;)

Jeg har på det seneste siddet og knækket hovedet med en hjernevrider jeg har påkastet mig selv. Jeg har da selvfølgelig sat mig for at skrive en AJAX chat med PHP ! :)

Indtil nu lader jeg den blot opdatere hvert 2 sekund og når brugeren indsender en besked.

Jeg har så hurtigt ramt en mur. Jeg har valgt at bruge MySQL som backend da det umiddelbart virkede logisk.

Lad os starte med "showchat.php" :
Jeg har en query i toppen der opdaterer den nuværende loggede ind brugers "latestactive" field, så brugeren kan blive logget ud efter 10 sekunders inaktivitet (Det er jo en chat og der skal være fart på.) og så ellers så henter den de seneste 25 beskeder ud fra chatten og returnerer, hvis en session (chat-count) ikke er sat. Og derefter sætter den sessionen til det sidste id den spyttede ud, så næste gang behøves den kun tage beskeder derfra.
- Den opdaterer hvert 2. sekund.

Så har jeg også en "showusers.php"
Den laver noget lignende, den henter bare alle brugere hvor "login" er lige med "true" og så løber dem dem igennem og checker om hver brugers lastactive er inden for 10 sekunder, hvis de er bliver de printet, ellers bliver deres login = false.
- kører hvert 10 sek.



Jeg er ret sikker på jeg har kvajet mig i stor stil mange steder, men det er mit første forsøg på en skalerbar ajax applikation, så bær over med mig :S. Jeg kan trække 20 - 30 brugere før vi rammer 100% cpu på en 1,8GHz single core maskine med 1GB ram (lighttpd og MySQL på FreeBSD)

Jeg er allerede ret sikker på sessions trækker en del tid pga de bruger disken, og at mysql queriesne måske kan optimeres en smule. Jeg har også mistanke til min måde at vise brugere ikke er den bedste, men der er foreslag velkomne. Caching har jeg ikke rigtigt set som en mulighed fordi at en chat (sigter efter 100 bruger mindst på den her maskine - 200 - 300 på produktionsserveren) og det vil gå rigtigt stærkt med så mange i et rum.


Alt kritik og eventuelt hjælp, erfaring, opfordringer osv. er velkomne. Det er bare et hobby projekt det her, men skalerbarhed er altid rart at have lidt erfaring med :P




En HTML side, med dit DOM træ. Et javascript der periodisk kalder din Flash/Java chat klient, og henter output, som du så renderer i DOM træet, vha. JavaScript.


Det er tæt på men ikke helt det, som jeg foreslår, for JavaScriptet behøver ikke periodisk at tjekke, om der er noget nyt. Appletten starter en tråd som udfører et blokerende read() kald på en socket. Så snart, der er data på forbindelsen, så reagerer appletten på det og sender et event til en JavaScript funktion, som så opdaterer DOM træet.

Altså push istedet for pull/poll.

Men fin tegning :)



En HTML side, med dit DOM træ. Et javascript der periodisk kalder din Flash/Java chat klient, og henter output, som du så renderer i DOM træet, vha. JavaScript.


Det er tæt på men ikke helt det, som jeg foreslår, for JavaScriptet behøver ikke periodisk at tjekke, om der er noget nyt. Appletten starter en tråd som udfører et blokerende read() kald på en socket. Så snart, der er data på forbindelsen, så reagerer appletten på det og sender et event til en JavaScript funktion, som så opdaterer DOM træet.

Altså push istedet for pull/poll.

Men fin tegning :)


Hvorfor dog et blokkerende read? :)

Legede lige lidt med XMLSocket i Flash og der kan man kam bruge en fin lille event til at håndtere det :)



Legede lige lidt med XMLSocket i Flash og der kan man kam bruge en fin lille event til at håndtere det :)

Cool nok. Men inde bagved i Flash er der helt sikkert et blokerende kald til en event kø. I Java skriver man så selv det kald, medmindre man bruger et library, hvor nogen har skrevet det for dig.



t