Me encantaría recibir comentarios, comentarios o enfoques alternativos sobre esta respuesta.
Editar
Para aquellos interesados, desde entonces escribí una buena cantidad de código y arrojé parte de él a la naturaleza en StackOverflow. Si desea leer más o proporcionarme comentarios (muy necesarios), sea mi invitado: http://stackoverflow.com/questio…
Fondo
- ¿El aprendizaje automático tiende a producir ganancias de rendimiento marginales o revolucionarias?
- ¿Cuál es la mejor tecnología para aprender entre big data, computación en la nube y aprendizaje automático, y por qué?
- ¿Cuáles son las clases que debo tomar como estudiante universitario de B.Tech para una carrera en Data Science y qué buscan exactamente las empresas durante las prácticas?
- ¿Qué tiene el futuro más brillante, big data / data science o desarrollo web?
- ¿Cuál sería una buena pila tecnológica para aprender para un ingeniero de datos principiante?
Los usuarios en la mayoría de los sitios de redes sociales se pueden describir en términos de un gráfico social. Las relaciones entre usuarios están representadas por listas de adyacencia. Si Jack y Jill son amigos, se dice que son adyacentes. Esto se conoce como un “borde” en el gráfico.
Determinando Importancia
Es probable que desee clasificar los bordes por importancia en lugar de simplemente las actualizaciones más recientes, lo que significa que necesita calcular algún tipo de puntaje. EdgeRank de Facebook fue descrito por la fórmula ∑e = ue we de, en donde ise es la suma del rango del borde, ue es el puntaje de afinidad con el usuario que creó el borde, nosotros es el peso para el tipo de contenido, y de es un factor de descomposición del tiempo.
Calcular el puntaje de afinidad de un amigo se puede hacer de la siguiente manera: ∑i = li ni wi, en donde isi es la suma de las interacciones con ese amigo, li es el tiempo transcurrido desde su última interacción (esto debería ponderarse para que 1 día> 30 días), ni es el número de interacciones y wi es el peso de esas interacciones. Este método le permite clasificar a los amigos en una base de datos separada y luego tal vez solo muestre diez actualizaciones de los diez amigos más cercanos, lo que no es una mala idea, ya que pocos de nosotros es probable que tengamos más amigos cercanos que este.
Qué almacenar
Determinar qué datos almacenar depende de su front-end (incluidas las actividades en las que participan sus usuarios) y su back-end. Describiré información general que puede almacenar. La cursiva es información especial y opcional que puede desear o necesitar según su esquema.
Actividad (id, user_id, source_id, activity_type, edge_rank , parent_id , parent_type , data, time)
- user_id: usuario que generó actividad
- source_id: la actividad de registro está relacionada con
- activity_type: tipo de actividad (álbum de fotos, comentario, etc.)
- edge_rank: el rango para esta actividad en particular
- parent_type: el tipo de actividad principal (interés particular, grupo, etc.)
- parent_id: ID de clave principal para el tipo primario
- datos – objeto serializado con metadatos
Suponiendo que está utilizando MySQL como su almacén de bases de datos, puede indexar (user_id, time) y luego realizar sus consultas básicas. Un ejemplo de fila de feed para una foto sería:
(id: 1, user_id: 1, source_id: some_source, activity_type: PHOTO, data: (photo_id: 1, photo_name: Casarse)).
En MySQL, sus tablas estarían fuertemente desnormalizadas ya que realizar uniones perjudicará el rendimiento.
Problemas potenciales
- Visibilidad: debe mostrar actividades interesantes
- Rendimiento: se debe minimizar el tiempo de clasificación
- Publicación: multiplica los puntos de falla según su método de publicación
Métodos de publicación
Modelo “Push” o Fan-out-on-write
Este método implica desnormalizar los datos de actividad del usuario y enviar los metadatos a todos los amigos del usuario en el momento en que ocurre. Solo almacena una copia de los datos como en el esquema anterior, luego envía punteros a los amigos con los metadatos. El problema con este método es que si tienes un gran despliegue (un gran número de seguidores), corres el riesgo de que se rompa mientras tu feed acumula una acumulación. Si sigue esta estrategia, también corre el riesgo de una gran cantidad de búsquedas de disco y escrituras aleatorias. Querrá algún tipo de almacén de datos optimizado para escritura, como Cassandra, HBase o BigTable.
Modelo “Pull” o Fan-out-on-load
Este método implica mantener todos los datos de actividad recientes en la memoria y extraer (o desplegar) esos datos en el momento en que un usuario carga su página de inicio. No es necesario que los datos se envíen a todos los suscriptores tan pronto como sucedan, por lo que no es necesario realizar un registro de respaldo ni buscar discos. El problema con este método es que es posible que no pueda generar las noticias de un usuario por completo. Para mitigar este riesgo, debe tener un mecanismo alternativo que se aproxime al feed del usuario o sirva como una buena alternativa.
Algunas sugerencias
- Si está utilizando MySQL, querrá asegurarse de que su tabla de actividades sea lo más compacta posible, que sus claves sean pequeñas y que esté indexada adecuadamente.
- Es posible que desee utilizar Redis para acceder rápidamente a datos de flujo de actividad nuevos. Redis está optimizado para lectura y almacena todos los datos en la memoria. Este es un buen enfoque para el modelo “Push” descrito anteriormente.
Conclusiones
Si bien esta no es una respuesta exhaustiva, estoy tratando de resumir tanta información como pueda. Mis fuentes para esta respuesta se recopilan en los enlaces a continuación, por lo que cualquier información en esta respuesta lamentablemente no tiene atribución directa. Sin embargo, un agradecimiento especial para Ari Steinberg por su respuesta muy detallada a ¿Cuáles son los problemas de escala a tener en cuenta al desarrollar un feed de redes sociales?
Como dije al principio, me encantaría recibir comentarios, comentarios o enfoques alternativos sobre esta respuesta.
Fuentes
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- ¿Cuáles son los problemas de escala a tener en cuenta al desarrollar un feed de red social?
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…
- http://stackoverflow.com/questio…