43 votes

Modèle de conception: système de notification

Je travaille sur un site web qui permettra d'utiliser les fonctionnalités de réseaux sociaux (comme facebook par exemple).

Je tiens à mettre en œuvre un système de notification qui montre des trucs comme "X de vous ajouter comme ami", "Y vous inviter à la fête", "Z a pris la dernière quizz"... et je ne sais pas comment faire.

Je me demande quelle est la meilleure solution :

  • Solution 1, aka "logging".

Dédié table de "notification". J'ai ajouter des lignes dans cette table, chaque fois que quelque chose de cette hausse, une notification dans les parages (un ami l'ajout d', répondre à des quizz, etc.). Le tableau "notification" a des champs qui contient des informations différentes, selon le type de notification est ajoutée à la table.

Bon : facile à coder, la séparation entre la fonction de notification et "normal" les fonctionnalités, pas trop de ressources-de consommer quand j'ai besoin de lire la table.

Mauvais : de la Notification table augmentera probablement très gros (je pense que je vais ajouter 10k lignes/jour dans le tableau), "doublé" de l'information : les informations dans le tableau de communication peuvent être trouvés dans tous les autres table à l'aide de la date/liste/quelle que soit la comparaison.

  • La Solution 2, aka "chercher partout".

Chaque fois que j'ai besoin d'afficher la liste de notification ou de le montrer combien les nouvelles notifications il y a, je regarde à tous les concernés de la table, de comparer la date/etc pour savoir si quelque chose de nouveau qui s'est passé depuis la dernière fois que l'utilisateur a coché la notification.

Bon : Pas trop grosses par rapport à la solution 1, pas de "redondance" de l'information.

La mauvaise : j'ai peur parce que le nombre d'utilisateur (~1k+), il rendre le serveur exploser parce que c'est des ressources, de temps, peu plus fort à code ou à maintenir.

Pouvez-vous s'il vous plaît dites-moi ce que tu pense que le mieux et pourquoi, ou vous avez une solution, je n'avais pas imaginé ?

Merci =)


Edit : Disons que j'utilise une base vraiment DB design : les utilisateurs ont des amis, peut faire des quiz. 1 tableau pour la liste des utilisateurs, quizz liste, 1 table quizz<->user rapport, 1 table de l'utilisateur<->de l'utilisateur de l'amitié. A chaque fois qu'un utilisateur visite à son propre profil, il peut voir ce qui s'est passé : nouveau quizz<->user rapport, nouvel utilisateur<->de l'utilisateur de la relation, etc. Comment voulez-vous concevoir une notification comme ça ?

23voto

AlexC Points 560

Créer un système de file d'attente, chaque message ajouté à cette file d'attente a une liste de "consommateurs" et le contenu. Le message principal de la pompe à chaque message et envoie le message à tous les consommateurs.

Permet de dire que 2 personnes se lier d'amitié avec les uns des autres. Vous ajoutez un message à la file d'attente que l'Un est amis avec B et les consommateurs sont à la fois A et B. Lorsque le message "pompe" (processeur) voit ce message, il l'ajoute à la file d'attente de l'Un et la file d'attente de B. Donc, maintenant, l'utilisateur A et utilisateur B ont un nouveau message qu'ils sont amis. Tour à tour, chaque utilisateur dispose d'un processeur de messages, de sorte que quand il voit un message disant "je suis amis avec [quelqu'un]" il traite cela comme ajouter une nouvelle entrée dans le "mur" visible pour les amis de "A est amis avec B", etc.

C'est un peu trop simpliste mais espérons-le, montre comment les files d'attente peuvent être utilisés pour ce (très semblable système est utilisé comme INTERFACE utilisateur windows le cadre) donc il y a déjà un exemple et il y a beaucoup de synchonized message de la file d'attente des modèles que vous pouvez utiliser.

Reste, c'est à vous de concevoir.

14voto

Aiden Bell Points 19856

Vraiment cela relève de la comment faire la conception d'une voiture? question de type de la catégorie ...

La mise en œuvre dépend de la conception, où il ira à l'avenir et de l'environnement vous permettra de mettre en. Vous pourriez choisir un twitter-esque de la mise en œuvre, un SAN adossés à des système de XML, Bases de données Relationnelles, Hadoop et des tonnes d'autres.

Une bonne connaissance des technologies web, l'expérience, l'essai et l'erreur est la seule façon vous pouvez concevoir une fonction avec certitude que vous avez à faire c'est la droite(ish) façon.

Quels sont vos besoins en termes de performances? Les niveaux de trafic? Les exigences de l'utilisateur? Voulez-vous distribuer plus tard (à travers les webhooks par exemple?).

Votre question doit être plus précis.

Personnellement, j' aurais une table de "notification-type", agissant comme un enum ... et puis d'un utilisateur<>table de notification de la manipulation de la relation entre la notification et de l'utilisateur.

Avec de la bonne codage, vous pouvez épissure de l'utilisateur<>tableau de communication à travers de nombreux serveurs et la clé sur userid ou similaire ... et de reproduire les types de tableau, à travers chacun de ces nœuds de cache local/de référence. Quelque chose comme ça.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X