2009-12-06 11 views
5

Voy a trabajar en un sitio de inspiración para una ONG, y estoy buscando implementar algún tipo de secuencia de eventos de Facebook, con eventos como "Michael recomendó pastel de manzana", "John comentó sobre chocolate torta”,‘Caramel Fudge fue envíado hace 8 horas por Alicia’, etc.¿Cómo implementar una secuencia de eventos personalizada?

lo que pasa es que estos eventos son basada en intereses, por lo que alguien solamente estar interesado en caramelo y cerezas y no debe ver tartas de manzana o pasteles de chocolate entonces. Hay muchas permutaciones para esto, y la generación de un flujo de eventos personalizado del usuario sobre la marcha significaría algunas consultas de bases de datos bastante costosas.

Así que mi pensamiento era pregenerar una relación entre el usuario que recibe y el evento publicado (probablemente una simple tabla JOIN de SQL) haciendo algún tipo de procesamiento de fondo cada vez que ocurre un evento de acción.

El trabajo requerido para ponderar las preferencias de cientos de usuarios frente a un evento va a ser sustancial, por lo que no se puede hacer como parte de la solicitud POST que desencadena el trabajo, así que tendré que hacer un montón de el trabajo en un proceso diferente. Actualmente estoy buscando Gearman para esta tarea, pero estoy muy abierto a sugerencias.

No estoy buscando a alguien que haga mi trabajo por mí, pero si alguien tiene alguna experiencia previa en la creación de este tipo de cosas, me gustaría escuchar sus ideas.

+0

Como nota al pie, estamos construyendo todo esto encima de [Drupal] (http://drupal.org/), PHP y MySQL, pero como esta tarea no es muy específica de Drupal, tratamos de mantenerla fuera de la cuestión. Entonces, si tienes experiencia con este tipo de transmisiones, comparte :) – mikl

Respuesta

2

He tenido cierta experiencia en la creación de un flujo de noticias en un sitio de redes sociales y sí, las consultas pueden volverse muy complejas muy rápidamente cuando tienes múltiples tipos de eventos y múltiples niveles de interés (o configuraciones de privacidad o permisos de usuario) .

Suponiendo que los eventos se visualizan con más frecuencia de la que se generan, tiene sentido realizar una desnormalización y calcular los posibles espectadores de un evento cuando ocurre, en lugar de cada vez que alguien solicita el flujo de noticias.

Sugeriría ejecutar un proceso en segundo plano que convierta estos objetos de evento (relacionados con sus creadores) en objetos de mensaje más simples (relacionados con su lector, las personas que los ven en el flujo de noticias). Puede terminar con muchos mensajes por evento, pero esto hará que las solicitudes al front-end sean mucho más rápidas, y descargará el trabajo en los procesos en segundo plano.

No he usado Gearman, pero si es el tipo de cosa que te permite cargar el entorno de tu aplicación en un proceso en segundo plano y recibir los eventos para procesar a través de una cola, entonces es una buena idea.

Mi solución simple fue rodar la mía usando beanstalkd y mis propios scripts PHP.

+0

Bien, gracias por la sugerencia, eche un vistazo a Beanstalk :) – mikl

1

No sabe cómo se estructura su base de datos (es posible que desee decirnos más), pero algo obvio, como

SELECT events.* FROM events, event_tags, user_tags 
    WHERE event_tags.event_id = events.id 
     AND event_tags.tag_id = user_tags.tag_id 
     AND user_tags.user_id = <$user_id> 

no parece muy pesado para mí, suponiendo que tiene índices de todo el lugar

+0

Sí, podría ser bueno poder consultar los eventos directamente, pero dada la cantidad de cosas que entran en consideración (etiquetas, palabras clave, autor, recomendaciones, comentarios y patrones de uso), no creo que sea posible construir un índice eficiente mientras se mantiene la flexibilidad para futuros cambios. Aunque me gustaría que se demuestre que estoy equivocado. – mikl

1

Esto suena como algo que se puede resolver con un índice adecuado. Construiría la solución en torno a la presunción de que la base de datos es capaz de manejarla, pero coloque un servicio frente a la base de datos y deje que todos los clientes pasen por este punto. Si las cosas comienzan a ir demasiado lento, puede introducir varios tipos de almacenamiento en caché en esta capa. Como con la mayoría de las decisiones de rendimiento, tratar de hacerlo desde el principio probablemente no sea una buena idea.

+0

Dada la complejidad y la cantidad de datos a considerar (ver mi respuesta a Stereofrog), realmente no puedo ver cómo se podría hacer ese índice, sin tener que hacer 15-30 UNIDAS ... y asumiendo que MySQL puede para manejar una gran cantidad de consultas pesadas, en mi opinión estaría pidiendo problemas :) – mikl

1

Facebook desarrolló su propia base de datos para hacer este tipo de cosas y abrir sus fuentes, no sé mucho al respecto, pero supongo que podría ser worth a look.

+0

Que yo sepa, Cassandra es principalmente un mecanismo de almacenamiento de datos de transmisión, y no todo lo relacionado con la generación de la misma. – mikl

1

¿Has mirado el módulo Activity? Aquí hay un extracto de su página de proyecto:

... realiza un seguimiento de las cosas que la gente hace en su sitio y proporciona mini-alimentaciones de estas actividades en bloques, en una tabla especializada y a través de RSS. El módulo es extensible para que cualquier otro módulo pueda integrarse con él. Los mensajes que se producen son personalizables a través de la interfaz de administración y son sensibles al contexto.

Tengo curiosidad acerca de lo que se te ocurre porque necesito hacer algo como esto en un futuro semi-cercano.

+0

No, pero lo comprobaré, gracias :) – mikl

Cuestiones relacionadas