205 votes

Quelle est la meilleure façon de mettre en œuvre un flux d'activités sociales ?

J'aimerais connaître votre avis sur la meilleure façon de mettre en œuvre un flux d'activités sociales (Facebook est l'exemple le plus connu). Les problèmes/défis à relever sont les suivants :

  • Différents types d'activités (postage, commentaires )
  • Différents types d'objets (message, commentaire, photo )
  • 1-n utilisateurs impliqués dans des rôles différents ("L'utilisateur x a répondu au commentaire de l'utilisateur y sur le post Z de l'utilisateur")
  • Différentes vues du même élément d'activité ("vous avez commenté .." vs. "votre ami x a commenté" vs. "l'utilisateur x a commenté .." => 3 représentations d'une activité "commentaire")

et bien plus encore, surtout si l'on atteint un haut niveau de sophistication, comme le fait Facebook, par exemple, en combinant plusieurs éléments d'activité en un seul ("les utilisateurs x, y et z ont commenté cette photo").

Toute réflexion ou indication sur des modèles, des articles, etc. sur les approches les plus flexibles, efficaces et puissantes pour mettre en œuvre un tel système, modèle de données, etc. serait appréciée.

Bien que la plupart des problèmes soient indépendants de la plate-forme, il est probable que je finisse par mettre en œuvre un tel système sur Ruby on Rails.

9voto

jammus Points 1796

J'ai commencé à mettre en place un système comme celui-ci hier, voici où j'en suis...

J'ai créé un StreamEvent avec les propriétés Id , ActorId , TypeId , Date , ObjectId et une table de hachage de Détails paires clé/valeur. Ceci est représenté dans la base de données par un StreamEvent tableau ( Id , ActorId , TypeId , Date , ObjectId ) et un StreamEventDetails tableau ( StreamEventId , Clé de détail , Valeur détaillée ).

Le site ActorId , TypeId et ObjectId permettent de capturer un événement Sujet-Verbe-Objet (et de l'interroger par la suite). Chaque action peut entraîner la création de plusieurs instances StreamEvent.

J'ai ensuite créé une sous-classe de StreamEvent pour chaque type d'événement, par exemple LoginEvent , PictureCommentEvent . Chacune de ces sous-classes possède des propriétés plus spécifiques au contexte, telles que PictureId , ongle du pouce , CommenText etc. (tout ce qui est nécessaire pour l'événement) qui sont en fait stockés comme des paires clé/valeur dans la table hashtable/StreamEventDetail.

Lorsque je récupère ces événements depuis la base de données, j'utilise une méthode d'usine (basée sur la fonction TypeId ) pour créer la classe StreamEvent correcte.

Chaque sous-classe de StreamEvent possède une fonction Render( contexte Comme StreamContext ) qui transmet l'événement à l'écran en fonction de l'information transmise. StreamContext classe. La classe StreamContext permet de définir des options en fonction du contexte de la vue. Si vous regardez Facebook par exemple, votre flux d'actualités sur la page d'accueil liste les noms complets (et les liens vers leur profil) de toutes les personnes impliquées dans chaque action, alors qu'en regardant le flux d'un ami, vous ne voyez que son prénom (mais les noms complets des autres acteurs).

Je n'ai pas encore mis en place un flux agrégé (Facebook home) mais j'imagine que je vais créer un AggregateFeed qui contient les champs UserId , StreamEventId qui est alimenté sur la base d'une sorte d'algorithme "Hmmm, vous pourriez trouver cela intéressant".

Tout commentaire serait très apprécié.

6voto

Alderete Points 406

Si vous décidez de mettre en œuvre Rails, vous trouverez peut-être le plugin suivant utile :

ActivityStreams : http://github.com/face/activity_streams/tree/master

Vous aurez ainsi l'occasion d'examiner une mise en œuvre, tant au niveau du modèle de données que de l'API fournie pour les activités de poussée et d'extraction.

6voto

Rene Pickhardt Points 137

Si vous souhaitez utiliser un logiciel distinct, je vous suggère le serveur Graphity qui résout exactement le problème des flux d'activité (en s'appuyant sur la base de données de graphes neo4j).

Les algorithmes ont été implémentés en tant que serveur REST autonome afin que vous puissiez héberger votre propre serveur pour fournir des flux d'activité : http://www.rene-pickhardt.de/graphity-server-for-social-activity-streams-released-gplv3/

Dans l'article et le benchmark, j'ai montré que la récupération des flux de nouvelles ne dépend que linéairement de la quantité d'éléments que vous voulez récupérer sans aucune redondance que vous obtiendriez en dénormalisant les 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 un benchmark de cette approche (montrant que graphity est capable de récupérer plus de 10 000 flux par seconde).

3voto

warren Points 12172

Je pense Plurk's est intéressante : elle fournit l'ensemble de votre chronologie dans un format qui ressemble beaucoup aux graphiques boursiers de Google Finance.

Il peut être intéressant de regarder Ning pour voir comment fonctionne un réseau social. Le site développeur Les pages semblent particulièrement utiles.

3voto

pinouchon Points 7706

Il existe deux émissions ferroviaires sur un tel flux d'activités :

Ces solutions n'incluent pas toutes vos exigences, mais elles devraient vous donner quelques idées.

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