MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB-Schemadesign – Echtzeit-Chat

Ich habe Redis verwendet , NGINX &PHP-FPM für mein Chat-Projekt. Nicht super elegant, aber es tut seinen Zweck. Das Puzzle besteht aus einigen Teilen.

  1. Es gibt ein sehr einfaches PHP-Skript, das Client-Befehle empfängt und sie in eine riesige LISTE einfügt. Es überprüft auch alle Raumlisten und die private Liste des Benutzers, um zu sehen, ob es Nachrichten gibt, die es zustellen muss. Dies wird von einem in jQuery geschriebenen Client abgefragt und alle paar Sekunden durchgeführt.

  2. Es gibt ein Befehlszeilen-PHP-Skript, das serverseitig 20 Mal pro Sekunde in einer Endlosschleife arbeitet, diese Liste überprüft und diese Befehle dann verarbeitet. Das Skript regelt, wer sich in welchem ​​Raum befindet, und die Berechtigungen im Skriptspeicher, diese Informationen werden nicht in Redis gespeichert.

  3. Redis hat eine LISTE für jeden Raum und eine LISTE für jeden Benutzer, die als private Warteschlange fungiert. Es hat auch mehrere Zähler für jeden Raum, in dem sich der Benutzer befindet. Wenn der Benutzerzähler kleiner ist als die Gesamtzahl der Nachrichten im Raum, dann erhält es die Differenz und sendet sie an den Benutzer.

Ich war nicht in der Lage, diese Lösung einem Stresstest zu unterziehen, aber zumindest nach meinem grundlegenden Benchmarking könnte sie wahrscheinlich viele tausend Nachrichten pro Sekunde verarbeiten. Es besteht auch die Möglichkeit, dies auf etwas wie Node.js zu portieren, um die Leistung zu steigern. Redis ist auch ausgereift und hat einige interessante Funktionen wie Pub/Subscribe-Befehle, die von Interesse sein könnten, die möglicherweise das Abrufen auf der Serverseite möglicherweise entfernen würden.

Ich habe mir Comet-basierte Lösungen angesehen, aber viele von ihnen waren kompliziert, schlecht dokumentiert oder erforderten das Erlernen einer völlig neuen Sprache (z ein Problem mit Comet sein. Deshalb bin ich bei der Umfrage geblieben.

Ich kann mir vorstellen, dass Sie mit MongoDB etwas Ähnliches machen könnten. Eine Sammlung pro Raum, eine Sammlung pro Benutzer und dann eine Sammlung, die Zähler verwaltet. Sie müssen immer noch einen Back-End-Daemon oder ein Skript schreiben, um zu verwalten, wohin diese Nachrichten gehen. Sie könnten auch die "begrenzten Sammlungen" von MongoDB verwenden, die die Dokumente sortiert halten und alte Nachrichten automatisch löschen, aber das könnte bei der Aufrechterhaltung richtiger Zähler kompliziert sein.