Quelle est la meilleure manière de mettre en œuvre une activité sociale stream?
Je suis intéressé à entendre vos opinions dans ce qui est la meilleure façon de mettre en œuvre une activité sociale (flux de Facebook est l'exemple le plus célèbre). Problèmes/défis sont:
- Différents types d'activités (poster, commenter,..)
- Différents types d'objets (message, commentaire, photo ..)
- 1-n utilisateurs impliqués dans les différents rôles ("Utilisateur x a répondu à l'Utilisateur d'y commenter l'Utilisateur Z post")
- Vues différentes de la même rubrique de l'activité ("vous avez dit .." vs "votre ami x, a commenté:" par rapport à "l'utilisateur x a commenté .." => 3 les représentations d'un "commentaire" de l'activité)
.. et un peu plus, surtout si vous le prenez pour un haut niveau de sophistication, comme Facebook, par exemple, la combinaison de plusieurs éléments d'activité dans l'une (les"utilisateurs x, y et z, a commenté sur la photo"
Des pensées ou des pointeurs sur les modèles, les documents, etc sur la plus flexible, efficace et puissant approches pour mettre en œuvre un tel système, le modèle de données, etc. serait appréciée.
Bien que la plupart des questions sont à la plate-forme agnostique, les chances sont que je finis par mettre en place un tel système sur Ruby on Rails
Vous devez vous connecter pour publier un commentaire.
J'ai créé un tel système et j'ai profité de cette approche:
Base de données de tableau avec les colonnes suivantes: id, nom d'utilisateur, de type, de données, de temps.
Cela limite les recherches/des recherches, vous pouvez le faire dans les flux rss, les utilisateurs, le temps et les types d'activité, mais dans un facebook-type de flux d'activités, ce n'est pas vraiment un facteur limitant. Et avec les bons indices sur la table, les recherches sont rapide.
Avec cette conception vous de décider ce que les métadonnées de chaque type d'événement devrait exiger. Par exemple un flux d'activité pour une nouvelle photo pourrait ressembler à quelque chose comme ceci:
Vous pouvez voir que, bien que le nom de la photo est certainement plus stockés dans un autre tableau contenant les photos, et j'ai pu récupérer le nom à partir de là, je vais dupliquer le nom dans le champ de métadonnées, parce que vous ne voulez pas le faire toutes les jointures sur d'autres tables de base de données si vous voulez de la vitesse. Et afin d'afficher, de dire 200, différents événements de 50 utilisateurs, vous avez besoin de vitesse.
Puis j'ai des cours qui s'étend de base FeedActivity classe pour le rendu des différents types d'activité des entrées. Le regroupement des événements peut être intégré dans le code de rendu ainsi, pour conserver à l'écart de la complexité de la base de données.
C'est une très bonne présentation sur la façon Etsy.com l'architecture de leurs flux d'activité. C'est le meilleur exemple que j'ai trouvé sur le sujet, si ce n'est pas les rails spécifiques.
http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture
Nous avons open source de notre approche:
https://github.com/tschellenbach/Stream-Framework
C'est actuellement la plus grande bibliothèque open source visant à résoudre ce problème.
La même équipe qui construit des Flux de Cadre offre également hébergé API, qui gère la complexité pour vous. Jetez un oeil à getstream.io Il y a des clients disponibles pour le Nœud, Python, Rails et PHP.
En outre jeter un oeil à cette grande évolutivité post ont nous expliquer certaines décisions de conception impliqués:
http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic-feeds.html
Ce tutoriel vous aidera à configurer un système comme Pinterest flux à l'aide de Redis. C'est assez facile à prendre en main.
Pour en savoir plus à propos de nourrir design, je recommande fortement la lecture de certains articles dans lesquels nous avons basé Feedly sur:
Bien que les Flux de Cadre est basé sur Python, il ne serait pas trop difficile à utiliser à partir d'une application Ruby. Vous pouvez simplement exécuter en tant que service et coller un petit http API en face d'elle. Nous envisageons d'ajouter une API pour accéder à Feedly à partir d'autres langues. En ce moment, vous aurez pour rôle de votre propre bien.
Plus grands problèmes avec les flux d'événements sont la visibilité et la performance; vous avez besoin de restreindre les activités indiquées à l'intéressantes pour cet utilisateur particulier, et vous avez besoin de garder la quantité de temps qu'il faut pour trier et identifier les événements gérable. J'ai construit un petit réseau social; j'ai trouvé qu'à de très petites échelles, gardant les "événements" de la table dans une base de données fonctionne, mais qu'il arrive à être un problème de performances sous charge modérée.
Avec un plus grand flux de messages et les utilisateurs, il est préférable d'aller avec un système de messagerie, où les événements sont envoyés sous forme de messages à des profils individuels. Cela signifie que vous ne pouvez pas facilement s'abonner à des gens du flux d'événements et de voir les événements précédents très facilement, mais vous êtes tout simplement rendu un petit groupe de messages lorsque vous avez besoin pour rendre le flux d'un utilisateur particulier.
Je crois que c'était de Twitter à l'origine de défauts de conception - je me souviens avoir lu qu'ils étaient de frapper la base de données pour récupérer et filtrer les événements. Cela a tout à voir avec l'architecture et rien à voir avec les Rails, qui (malheureusement) a donné naissance à la "ruby n'a pas d'échelle de" mème. J'ai vu récemment une présentation où le développeur a utilisé Amazon Simple File D'Attente De Service que leur messagerie backend pour un twitter-like que la demande n'ont de loin le plus élevé de mise à l'échelle des capacités - c'est peut-être intéressant de regarder dans SQS dans le cadre de votre système, si vos charges sont assez élevés.
Si vous êtes prêt à utiliser un autre logiciel, je suggère la Graphity serveur qui résout le problème pour les flux de l'activité (bâtiment sur le dessus de neo4j graphique de la base de données).
Les algorithmes ont été mis en œuvre en tant qu'unité autonome de REPOS serveur, de sorte que vous pouvez héberger votre propre serveur pour fournir des flux de l'activité: http://www.rene-pickhardt.de/graphity-server-for-social-activity-streams-released-gplv3/
Dans le document de référence et j'ai montré que la récupération des news flux ne dépend que linéaire sur le nombre d'objets que vous souhaitez récupérer sans aucune redondance de la dénormalisation des données:
http://www.rene-pickhardt.de/graphity-an-efficient-graph-model-for-retrieving-the-top-k-news-feeds-for-users-in-social-networks/
Sur le lien ci-dessus vous trouverez des screencasts et une référence de cette approche (montrant que graphity est capable de récupérer plus de 10k de flux par seconde).
J'ai commencé à mettre en œuvre un système de ce type hier, voici où j'en ai eu pour...
J'ai créé un StreamEvent classe avec les propriétés Id, ActorId, TypeId, Date, ObjectId et une table de hachage de supplémentaires Détails paires clé/valeur. Ceci est représenté dans la base de données par un StreamEvent table (Id, ActorId, TypeId, Date, ObjectId) et un StreamEventDetails table (StreamEventId, DetailKey, DetailValue).
La ActorId, TypeId et ObjectId permettre un Sujet-Verbe-Objet événement pour être capturé (et, plus tard, interrogé). Chaque action peut entraîner plusieurs StreamEvent instances en cours de création.
J'ai ensuite créé une sous-classe pour de StreamEvent chaque type d'événement, par exemple LoginEvent, PictureCommentEvent. Chacun de ces sous-classes a plus le contexte spécifique des propriétés telles que PictureId, Vignette, CommenText, etc (tout ce qui est nécessaire pour l'événement), qui sont en fait stockées comme des paires clé/valeur dans la table de hachage/StreamEventDetail table.
Lors de l'extraction de ces événements de la base de données j'utilise une méthode de fabrique (basé sur le TypeId) pour créer le bon StreamEvent classe.
Chaque sous-classe de StreamEvent a un Rendu(contexte Comme StreamContext), une méthode de sorties de l'événement à l'écran basé sur le passé StreamContext classe. Le StreamContext classe permet d'options à définir en fonction du contexte de la vue. Si vous regardez Facebook par exemple votre flux d'actualités sur la page d'accueil répertorie les fullnames (et des liens vers leur profil) de toutes les personnes impliquées dans chaque action, alors que la recherche d'un ami d'alimentation vous ne voyez que son prénom (mais les noms et prénoms des autres acteurs).
Je n'ai pas mis en œuvre un total de l'alimentation (de Facebook à la maison) mais j'imagine que je vais créer une AggregateFeed table qui a les champs UserId, StreamEventId qui est renseigné sur une sorte de " Hmmm, vous pourriez trouver cela intéressant d'algorithme.
Tout commentaire serait très apprécié.
Lors de la création de l'évènement, choisissez les aliments qu'il apparaît dans et les ajouter à events_feeds.
Pour obtenir un flux, sélectionnez à partir de events_feeds, à participer à des événements, order by timestamp.
Le filtrage et l'agrégation peut alors être effectuée sur les résultats de cette requête.
Avec ce modèle, vous pouvez modifier les propriétés de l'événement après la création, aucun travail supplémentaire.
Si vous décidez que vous allez mettre en œuvre dans les Rails, peut-être que vous trouverez le plugin utile:
ActivityStreams: http://github.com/face/activity_streams/tree/master
Si rien d'autre, vous aurez à regarder de mise en œuvre, à la fois en termes de modèle de données, ainsi que l'API fournie pour pousser et tirer des activités.
J'ai eu une approche similaire à celle de heyman - un dénormalisée tableau contenant toutes les données à afficher dans un flux d'activité. Il fonctionne très bien pour un petit site avec une activité limitée.
Comme mentionné ci-dessus, il est susceptible de faire face à des problèmes d'évolutivité que le site grandit. Personnellement, je ne suis pas inquiet au sujet de la mise à l'échelle questions dès maintenant. Je vais vous inquiéter à ce sujet à une date ultérieure.
Facebook a évidemment fait un excellent travail de mise à l'échelle, donc je vous recommande de lire leur blog, car il a une tonne de contenu -> http://www.facebook.com/notes.php?id=9445547199
J'ai été à la recherche dans de meilleures solutions que la table dénormalisée je l'ai mentionné ci-dessus. Une autre façon que j'ai trouvé pour arriver à ce résultat est de condenser l'ensemble du contenu qui serait dans une activité donnée flux dans une seule ligne. Il pourrait être stockées en XML, JSON, ou certains sérialisé format qui peut être lu par votre application. Le processus de mise à jour serait trop simple. Lors de l'activité, de la place de la nouvelle activité dans une file d'attente (peut-être l'aide d'Amazon SQS ou autre chose) et ensuite continuellement sondage la file d'attente pour le prochain article. Prenez cet élément, l'analyser, et de placer son contenu dans le flux approprié objet stocké dans la base de données.
La bonne chose à propos de cette méthode est que vous avez seulement besoin de lire une seule table de base de données chaque fois que le flux est demandé, plutôt que de prendre une série de tableaux. Aussi, il vous permet de maintenir une liste restreinte d'activités que vous pouvez faire apparaître le plus ancien de l'activité point à chaque fois que vous mettez à jour la liste.
Espérons que cette aide! 🙂
Il y a deux railscasts sur un tel flux d'activité:
Ces solutions ne tient pas compte de toutes vos exigences, mais il devrait vous donner quelques idées.
Je pense que Plurk de l' approche est intéressante: ils approvisionnement de l'ensemble de votre montage dans un format qui ressemble beaucoup à Google Finance les graphiques boursiers.
Il peut être intéressant de regarder Ning de voir comment un réseau social réseau fonctionne. Le développeur pages look particulièrement utile.
J'ai résolu ce problème il y a quelques mois, mais je pense que mon application est trop basique.
J'ai créé les modèles suivants:
Exemple
Après la mise en œuvre de flux d'activité pour permettre les flux de réseaux sociaux, micro-blogging, et les fonctionnalités de collaboration dans plusieurs applications, j'ai réalisé que la fonctionnalité de base est assez simple et pourrait être transformé en un service externe que vous utilisez via une API. Si vous êtes à la construction du flux dans une application de production et ne sont pas uniques ou profondément besoins complexes, en utilisant un service éprouvé, peut-être la meilleure façon d'aller. Je recommanderais ceci pour des applications de production de plus de roulement de votre propre solution simple sur le dessus d'une base de données relationnelle.
Mon entreprise Collabinate (http://www.collabinate.com) est née de cette prise de conscience, et nous avons mis en place une solution évolutive, de haute performance de l'activité de moteur de flux en haut d'un graphique de la base de données pour l'atteindre. Nous avons utilisé une variante de la Graphity algorithme (adapté à partir du début des travaux de @RenePickhardt qui a également fourni une réponse ici) pour construire le moteur.
Si vous souhaitez héberger le moteur vous-même ou d'exiger des fonctionnalités spécialisées, le code de base est en fait de l'open source à des fins non commerciales, vous êtes les bienvenus pour prendre un coup d'oeil.