Ich bin am Anfang des Aufbaus eines Benachrichtigungssystems im Facebook-Stil für unsere Seite (Social-Gaming-Typ) und recherchiere jetzt, wie ein solches System am besten gestaltet werden kann. Ich bin nicht daran interessiert, wie ich Benachrichtigungen an den Benutzer oder ähnliches senden kann (vorerst sogar). Ich recherchiere, wie man das System auf dem Server erstellt (wie man Benachrichtigungen speichert, wo man sie speichert, wie man sie abruft usw.).
Also ... einige Anforderungen, die wir haben:
- In Spitzenzeiten haben wir ungefähr 1k gleichzeitig angemeldete Benutzer (und viele weitere Gäste, aber sie spielen hier keine Rolle, da sie keine Benachrichtigungen haben), die viele Ereignisse generieren
- Es wird verschiedene Arten von Benachrichtigungen geben (Benutzer A hat Sie als Freund hinzugefügt, Benutzer B hat Ihr Profil kommentiert, Benutzer C hat Ihr Bild gefallen, Benutzer D hat Sie in Spiel X geschlagen, ...)
- Die meisten Ereignisse generieren 1 Benachrichtigung für 1 Benutzer (Benutzer X hat Ihr Bild gefallen), aber es gibt Fälle, in denen ein Ereignis viele Benachrichtigungen generiert (z. B. der Geburtstag von Benutzer Y).
- Benachrichtigungen sollten zusammengefasst werden. Wenn zum Beispiel vier verschiedene Benutzer ein Bild mögen, sollte der Besitzer dieses Bildes eine Benachrichtigung erhalten, die besagt, dass vier Benutzern das Bild gefallen hat und nicht vier separate Benachrichtigungen (genau wie FB).
OK, ich dachte also, ich sollte eine Art Warteschlange erstellen, in der ich Ereignisse speichern würde, wenn sie eintreten. Dann hätte ich einen Hintergrundjob ( Gearman ?), Der sich diese Warteschlange ansieht und Benachrichtigungen basierend auf diesen Ereignissen generiert. Dieser Job speichert dann Benachrichtigungen in der Datenbank für jeden Benutzer (wenn also ein Ereignis 10 Benutzer betrifft, gibt es 10 separate Benachrichtigungen). Wenn der Benutzer dann eine Seite mit der Liste der Benachrichtigungen öffnet, liest ich alle diese Benachrichtigungen für ihn (wir denken daran, diese auf 100 neueste Benachrichtigungen zu beschränken) und gruppiert sie und zeigt sie schließlich an.
Dinge, die mir bei diesem Ansatz Sorgen machen:
- komplex wie die Hölle :)
- Ist die Datenbank hier der beste Speicher (wir verwenden MySQL) oder sollte ich etwas anderes verwenden (Redis scheint auch gut zu passen)?
- Was soll ich als Benachrichtigung speichern? Benutzer-ID, Benutzer-ID, die das Ereignis ausgelöst hat, Art des Ereignisses (damit ich sie gruppieren und den entsprechenden Text anzeigen kann), aber dann weiß ich nicht, wie die tatsächlichen Daten der Benachrichtigung gespeichert werden sollen (z. B. URL und Titel des Bildes, das wurde gemocht). Soll ich diese Informationen beim Generieren der Benachrichtigung nur "backen" oder die ID des betroffenen Datensatzes (Bild, Profil, ...) speichern und die Informationen beim Anzeigen der Benachrichtigung aus der Datenbank ziehen?
- Die Leistung sollte hier in Ordnung sein, auch wenn ich beim Anzeigen der Benachrichtigungsseite 100 Benachrichtigungen im laufenden Betrieb verarbeiten muss
- Mögliches Leistungsproblem bei jeder Anfrage, da ich dem Benutzer die Anzahl der ungelesenen Benachrichtigungen anzeigen müsste (was für sich genommen ein Problem sein könnte, da ich Benachrichtigungen zusammenfassen würde). Dies könnte jedoch vermieden werden, wenn ich die Ansicht von Benachrichtigungen (wo sie gruppiert sind) im Hintergrund und nicht im laufenden Betrieb generiere
Was halten Sie von meinem Lösungsvorschlag und meinen Bedenken? Bitte kommentieren Sie, wenn Sie der Meinung sind, dass ich noch etwas erwähnen sollte, das hier relevant wäre.
Oh, wir verwenden PHP für unsere Seite, aber das sollte hier kein großer Faktor sein, denke ich.