Je suis au début de la construction d'un système de notification de style Facebook pour notre page (type 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 quelque chose comme ça (même pour l'instant). Je recherche comment construire le système sur le serveur (comment stocker les notifications, où les stocker, comment les récupérer etc...).
Donc ... quelques exigences que nous avons :
- aux heures de pointe, nous avons environ 1 000 utilisateurs connectés simultanément (et beaucoup plus d'invités, mais ils n'ont pas d'importance ici car ils n'ont pas de notifications), ce qui génère 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 au jeu X, ...)
- la plupart des événements génèrent une notification pour un utilisateur (l'utilisateur X a aimé votre image), mais il y a des cas où un événement génère plusieurs 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 (comme le fait FB)
Je me disais donc que je devrais créer une sorte de file d'attente où je pourrais stocker les événements lorsqu'ils se produisent. Ensuite, j'aurais un travail en arrière-plan ( réducteur ?) qui examinerait cette file d'attente et générerait des notifications en fonction de ces événements. Cette tâche stockerait ensuite les notifications dans la base de données pour chaque utilisateur (ainsi, si un événement affecte 10 utilisateurs, il y aurait 10 notifications distinctes). Ensuite, lorsque l'utilisateur ouvrirait une page contenant la liste des notifications, je lirais toutes ces notifications pour lui (nous pensons limiter cela à 100 notifications récentes), je les regrouperais et je les afficherais enfin.
Ce qui me préoccupe dans cette approche :
- complexe comme l'enfer :)
- La base de données est-elle la meilleure solution de stockage ici (nous utilisons MySQL) ou dois-je utiliser autre chose (redis semble être une bonne solution également) ?
- Qu'est-ce que je dois stocker dans une notification ? l'ID de l'utilisateur, l'ID de l'utilisateur qui a initié l'événement, le type d'événement (pour que je puisse les grouper et afficher le texte approprié) mais ensuite je ne sais pas comment stocker les données réelles de la notification (par exemple l'URL et le titre de l'image qui a été aimée). Dois-je simplement intégrer cette information lorsque je génère la notification, ou dois-je stocker l'ID de l'enregistrement (image, profil, ...) affecté et extraire l'information 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 de notifications.
- problème de performance possible à chaque requête 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). Ce problème 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 la solution que je propose et de mes préoccupations ? N'hésitez pas à commenter si vous pensez que je dois 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.
0 votes
Combien de temps il vous a fallu pour construire ce système de notification en tant qu'effort individuel. Je veux juste avoir une estimation pour faire les délais en conséquence.
0 votes
@Shaharyar Je pense que cela dépend de la complexité du système de notification.
0 votes
J'ai utilisé le même système avec MySQL pour construire un système de notification basé sur les priorités. La bonne chose est qu'il s'adapte à quelques milliers d'utilisateurs, si cela va plus loin, il explose, surtout avec Android et GCM. J'aimerais connaître des alternatives à MySQL comme redis, rabbitMQ, Kafka qui présentent naturellement une queue de message, une sorte de fonctionnalité.