sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB Schema Design - Chat i realtid

Jeg brugte Redis , NGINX &PHP-FPM til mit chatprojekt. Ikke super elegant, men det gør tricket. Der er et par brikker til puslespillet.

  1. Der er et meget simpelt PHP-script, der modtager klientkommandoer og sætter dem i én massiv LISTE. Den tjekker også alle rumlister og brugernes private LISTE for at se, om der er beskeder, den skal levere. Dette er pollet af en klient skrevet i jQuery og det gøres med få sekunders mellemrum.

  2. Der er et kommandolinje PHP-script, der driver serversiden i en uendelig løkke, 20 gange i sekundet, som tjekker denne liste og derefter behandler disse kommandoer. Scriptet håndterer hvem der er i hvilket rum og tilladelser i scriptets hukommelse, denne info gemmes ikke i Redis.

  3. Redis har en LISTE for hvert værelse og en LISTE for hver bruger, der fungerer som en privat kø. Den har også flere tællere for hvert rum, brugeren er i. Hvis brugerens tæller er mindre end det samlede antal beskeder i rummet, får den forskellen og sender den til brugeren.

Jeg har ikke været i stand til at stressteste denne løsning, men i det mindste fra min grundlæggende benchmarking kunne den nok håndtere mange tusinde beskeder i sekundet. Der er også mulighed for at overføre dette til noget som Node.js for at øge ydeevnen. Redis er også ved at modnes og har nogle interessante funktioner som Pub/Subscribe-kommandoer, som kunne være af interesse, som muligvis ville fjerne pollingen på serversiden.

Jeg undersøgte Comet-baserede løsninger, men mange af dem var komplicerede, dårligt dokumenterede eller ville kræve, at jeg lærte et helt nyt sprog (f.eks. Jetty->Java, APE->C), osv... Også levering og gennemgang af proxyer kan nogle gange være et problem med Comet. Så derfor har jeg holdt mig til afstemning.

Jeg forestiller mig, at du kunne gøre noget lignende med MongoDB. En samling pr. værelse, en samling pr. bruger og derefter en samling, der vedligeholder tællere. Du skal stadig skrive en backend-dæmon eller et script for at håndtere, hvor disse beskeder går hen. Du kan også bruge MongoDB's "begrænsede samlinger", som holder dokumenterne sorteret og også automatisk rydder gamle meddelelser ud, men det kan være kompliceret med hensyn til at vedligeholde korrekte tællere.



  1. Mongoose:Hvordan befolker man en dyb befolkning på 2 niveauer uden at befolke felter på første niveau? i mongodb

  2. Mongodb Aggregation efter Dag derefter Time

  3. CDH 6.2-udgivelse:Hvad er nyt i HBase

  4. Redis pub/sub til chatserver i node.js