¿Cuál es la mejor manera de implementar un flujo de actividad social? [cerrado]

Resuelto asked hace 16 años • 0 respuestas

Me interesa escuchar sus opiniones sobre cuál es la mejor manera de implementar un flujo de actividad social (Facebook es el ejemplo más famoso). Los problemas/desafíos involucrados son:

  • Diferentes tipos de actividades (publicar, comentar..)
  • Diferentes tipos de objetos (publicación, comentario, foto..)
  • 1-n usuarios involucrados en diferentes roles ("El usuario x respondió al comentario del usuario y en la publicación del usuario Z")
  • Diferentes vistas del mismo elemento de actividad ("usted comentó..." frente a "su amigo x comentó" frente a "usuario x comentó..." => 3 representaciones de una actividad de "comentario")

.. y algo más, sobre todo si lo llevas a un alto nivel de sofisticación, como hace Facebook, por ejemplo, combinando varios elementos de actividad en uno (“los usuarios x, y y z comentaron esa foto”

Se agradecería cualquier idea o sugerencia sobre patrones, artículos, etc. sobre los enfoques más flexibles, eficientes y potentes para implementar dicho sistema, modelo de datos, etc.

Aunque la mayoría de los problemas son independientes de la plataforma, es probable que termine implementando un sistema de este tipo en Ruby on Rails.

 avatar Oct 15 '08 01:10
Aceptado

He creado dicho sistema y adopté este enfoque:

Tabla de base de datos con las siguientes columnas: id, userId, tipo, datos, hora.

  • userId es el usuario que generó la actividad
  • tipo es el tipo de actividad (es decir, escribió una publicación de blog, agregó una foto, comentó una foto del usuario)
  • Los datos son un objeto serializado con metadatos para la actividad donde puedes poner lo que quieras.

Esto limita las búsquedas que puedes hacer en los feeds, a usuarios, tiempo y tipos de actividad, pero en un feed de actividad tipo Facebook, esto no es realmente limitante. Y con índices correctos en la tabla las búsquedas son rápidas .

Con este diseño habría que decidir qué metadatos debería requerir cada tipo de evento. Por ejemplo, una actividad de feed para una nueva foto podría verse así:

{id:1, userId:1, type:PHOTO, time:2008-10-15 12:00:00, data:{photoId:2089, photoName:A trip to the beach}}

Puedes ver que, aunque el nombre de la foto seguramente está almacenado en alguna otra tabla que contiene las fotos, y podría recuperar el nombre desde allí, duplicaré el nombre en el campo de metadatos, porque no quieres hacerlo. cualquier combinación en otras tablas de bases de datos si desea velocidad. Y para mostrar, digamos 200 eventos diferentes de 50 usuarios diferentes, se necesita velocidad.

Luego tengo clases que amplían una clase FeedActivity básica para representar los diferentes tipos de entradas de actividad. La agrupación de eventos también se incluiría en el código de representación, para evitar la complejidad de la base de datos.

heyman avatar Oct 15 '2008 16:10 heyman

Esta es una muy buena presentación que describe cómo Etsy.com diseñó sus flujos de actividad. Es el mejor ejemplo que he encontrado sobre el tema, aunque no es específico de los rieles.

http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture

Mark Kennedy avatar Feb 16 '2011 21:02 Mark Kennedy

Hemos abierto nuestro enfoque: https://github.com/tschellenbach/Stream-Framework Actualmente es la biblioteca de código abierto más grande destinada a resolver este problema.

El mismo equipo que creó Stream Framework también ofrece una API alojada, que maneja la complejidad por usted. Eche un vistazo a getstream.io. Hay clientes disponibles para Node, Python, Rails y PHP.

Además, eche un vistazo a esta publicación sobre alta escalabilidad donde explicamos algunas de las decisiones de diseño involucradas: http://highscalability.com/blog/2013/10/28/design-decisions-for-scaling-your-high-traffic- feeds.html

Este tutorial te ayudará a configurar un sistema como el feed de Pinterest usando Redis. Es bastante fácil empezar.

Para obtener más información sobre el diseño de feeds, recomiendo leer algunos de los artículos en los que basamos Feedly:

  • Documento de investigación de Yahoo
  • Twitter 2013 basado en Redis , con respaldo
  • Casandra en Instagram
  • Escalado del feed de Etsy
  • Historia de facebook
  • Proyecto Django , con buenas convenciones de nomenclatura. (Pero solo base de datos)
  • http://activitystrea.ms/specs/atom/1.0/ (actor, verbo, objeto, objetivo)
  • Publicación de Quora sobre mejores prácticas
  • Quora escalando el feed de una red social
  • Ejemplo de rubí de Redis
  • Enfoque de FriendFeed
  • Configuración de Thoonk
  • El enfoque de Twitter

Aunque Stream Framework está basado en Python, no sería demasiado difícil de usar desde una aplicación Ruby. Simplemente puede ejecutarlo como un servicio y colocar una pequeña API http delante de él. Estamos considerando agregar una API para acceder a Feedly desde otros idiomas. Por el momento tendrás que jugar el tuyo propio.

Thierry avatar Oct 30 '2013 13:10 Thierry