sql >> Database >  >> NoSQL >> MongoDB

MongoDB Schema Ontwerp - Realtime Chat

Ik heb Redis gebruikt , NGINX &PHP-FPM voor mijn chatproject. Niet super elegant, maar het doet de truc. Er zijn een paar stukjes van de puzzel.

  1. Er is een heel eenvoudig PHP-script dat clientopdrachten ontvangt en in één enorme LIJST plaatst. Het controleert ook alle kamer LIST's en de privé LIST van de gebruiker om te zien of er berichten zijn die het moet bezorgen. Dit wordt opgevraagd door een klant die is geschreven in jQuery en het wordt om de paar seconden gedaan.

  2. Er is een commandoregel PHP-script dat 20 keer per seconde aan de serverzijde in een oneindige lus werkt, die deze lijst controleert en vervolgens deze opdrachten verwerkt. Het script regelt wie zich in welke kamer bevindt en permissies in het geheugen van de scripts, deze info wordt niet opgeslagen in Redis.

  3. Redis heeft een LIJST voor elke kamer en een LIJST voor elke gebruiker die werkt als een privéwachtrij. Het heeft ook meerdere tellers voor elke kamer waarin de gebruiker zich bevindt. Als de gebruikersteller minder is dan het totale aantal berichten in de kamer, krijgt het het verschil en stuurt het naar de gebruiker.

Ik heb deze oplossing niet kunnen stresstesten, maar op basis van mijn basisbenchmarking zou het waarschijnlijk vele duizenden berichten per seconde kunnen verwerken. Er is ook de mogelijkheid om dit over te dragen naar iets als Node.js om de prestaties te verbeteren. Redis wordt ook volwassener en heeft een aantal interessante functies, zoals Pub/Subscribe-commando's, die van belang kunnen zijn, die mogelijk de polling aan de serverkant zouden verwijderen.

Ik heb gekeken naar op Comet gebaseerde oplossingen, maar veel ervan waren ingewikkeld, slecht gedocumenteerd of vereisen dat ik een geheel nieuwe taal moet leren (bijv. Jetty->Java, APE->C), enz... een probleem zijn met Comet. Daarom ben ik bij polls gebleven.

Ik kan me voorstellen dat je iets soortgelijks zou kunnen doen met MongoDB. Een verzameling per kamer, een verzameling per gebruiker &dan een verzameling die balies bijhoudt. Je zult nog steeds een back-end daemon of script moeten schrijven om het beheer van deze berichten af ​​te handelen. Je zou ook de "beperkte verzamelingen" van MongoDB kunnen gebruiken, die de documenten gesorteerd houdt en ook automatisch oude berichten wist, maar dat kan ingewikkeld zijn bij het onderhouden van de juiste tellers.



  1. Hoe om te gaan met pagineringsquery's met mongodb en php?

  2. Hoe de grootte van een enkel document in Mongodb te krijgen?

  3. mongodb 3.x-stuurprogramma Android-compatibiliteit

  4. Is er een manier om pyspark-dataframe naar Azure-cache te schrijven voor redis?