sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB Schema Design - Realtidschatt

Jag använde Redis , NGINX &PHP-FPM för mitt chattprojekt. Inte superelegant, men det gör susen. Det finns några pusselbitar.

  1. Det finns ett mycket enkelt PHP-skript som tar emot klientkommandon och placerar dem i en enorm LISTA. Den kontrollerar också alla rumslistor och användarnas privata LISTA för att se om det finns meddelanden som den måste leverera. Detta efterfrågas av en klient skriven i jQuery och det görs med några sekunders mellanrum.

  2. Det finns ett kommandorads PHP-skript som driver serversidan i en oändlig loop, 20 gånger per sekund, som kontrollerar den här listan och sedan bearbetar dessa kommandon. Skriptet hanterar vem som finns i vilket rum och behörigheter i skriptminnet, denna info lagras inte i Redis.

  3. Redis har en LISTA för varje rum &en LISTA för varje användare som fungerar som en privat kö. Den har också flera räknare för varje rum som användaren är i. Om användarens räknare är mindre än det totala antalet meddelanden i rummet, får den skillnaden och skickar den till användaren.

Jag har inte kunnat stresstesta den här lösningen, men åtminstone från min grundläggande benchmarking skulle den förmodligen kunna hantera många tusen meddelanden per sekund. Det finns också möjlighet att överföra detta till något som Node.js för att öka prestandan. Redis håller också på att mogna och har några intressanta funktioner som Pub/Subscribe-kommandon, som kan vara av intresse, som eventuellt skulle ta bort pollingen på serversidan.

Jag undersökte Comet-baserade lösningar, men många av dem var komplicerade, dåligt dokumenterade eller skulle kräva att jag lärde mig ett helt nytt språk (t.ex. Jetty->Java, APE->C), etc... Även leverans och att gå igenom proxy kan ibland vara ett problem med Comet. Så det är därför jag har hållit fast vid omröstning.

Jag antar att du kan göra något liknande med MongoDB. En samling per rum, en samling per användare &sedan en samling som underhåller diskar. Du måste fortfarande skriva en back-end-demon eller ett skript för att hantera vart dessa meddelanden går. Du kan också använda MongoDB:s "begränsade samlingar", som håller dokumenten sorterade och även automatiskt rensar bort gamla meddelanden, men det kan vara komplicerat att upprätthålla korrekta räknare.



  1. .insertOne är inte en funktion

  2. Kan inte hitta modulen i Nodejs

  3. Bygga en enkel CRUD-webbapplikation och bildbutik med Cloudera Operational Database och Flask

  4. MongoDB-verktyg från gemenskapen som kompletterar ClusterControl