Je suis au début de la construction d'un système de notification de style Facebook pour notre page (type de jeu social) et je recherche maintenant quelle serait la meilleure façon de concevoir un tel système. Je ne suis pas intéressé par la façon de pousser les notifications à l'utilisateur ou quoi que ce soit du genre (pour l'instant même). Je recherche comment construire le système sur le serveur (comment stocker les notifications, où les stocker, comment les récupérer, etc.).
Donc ... certaines exigences que nous avons:
- aux heures de pointe, nous avons environ 1k utilisateurs connectés simultanément (et beaucoup plus d'invités, mais ils n'ont pas d'importance ici car ils n'auront pas de notifications) qui généreront de nombreux événements
- il y aura différents types de notifications (l'utilisateur A vous a ajouté comme ami, l'utilisateur B a commenté votre profil, l'utilisateur C a aimé votre image, l'utilisateur D vous a battu sur le jeu X, ...)
- la plupart des événements généreront 1 notification pour 1 utilisateur (l'utilisateur X a aimé votre image), mais il y aura des cas où un événement générera de nombreuses notifications (c'est l'anniversaire de l'utilisateur Y par exemple)
- les notifications devraient être regroupées; si, par exemple, quatre utilisateurs différents aiment une image, le propriétaire de cette image devrait recevoir une notification indiquant que quatre utilisateurs ont aimé l'image et non quatre notifications distinctes (tout comme FB)
OK, donc ce que je pensais, c'est que je devrais créer une sorte de file d'attente où je stockerais les événements lorsqu'ils se produisent. Ensuite, j'aurais un travail d'arrière-plan ( gearman ?) Qui examinerait cette file d'attente et générerait des notifications en fonction de ces événements. Ce travail stocke ensuite les notifications dans la base de données pour chaque utilisateur (donc si un événement affecte 10 utilisateurs, il y aura 10 notifications distinctes). Ensuite, lorsque l'utilisateur ouvrait une page avec la liste des notifications, je lisais toutes ces notifications pour lui (nous pensons à limiter cela à 100 dernières notifications) et les regroupais, puis les afficherais enfin.
Choses qui me préoccupent avec cette approche:
- complexe comme l'enfer :)
- est la base de données le meilleur stockage ici (nous utilisons MySQL) ou devrais-je utiliser autre chose (redis semble également être un bon choix)
- que dois-je stocker comme notification? ID utilisateur, ID utilisateur qui a initié l'événement, type d'événement (afin que je puisse les regrouper et afficher le texte approprié) mais ensuite je ne sais pas comment stocker les données réelles de la notification (par exemple, URL et titre de l'image qui a été aimé). Dois-je simplement "cuire" cette information lorsque je génère la notification, ou dois-je stocker l'ID de l'enregistrement (image, profil, ...) affecté et extraire les informations de la base de données lors de l'affichage de la notification.
- les performances devraient être correctes ici, même si je dois traiter 100 notifications à la volée lors de l'affichage de la page des notifications
- problème de performance possible à chaque demande car je devrais afficher le nombre de notifications non lues à l'utilisateur (ce qui pourrait être un problème en soi puisque je regrouperais les notifications). Cela pourrait être évité si je générais la vue des notifications (où elles sont regroupées) en arrière-plan et non à la volée
Alors, que pensez-vous de ma solution proposée et de mes préoccupations? Veuillez commenter si vous pensez que je devrais mentionner autre chose qui serait pertinent ici.
Oh, nous utilisons PHP pour notre page, mais cela ne devrait pas être un facteur important ici, je pense.