Estoy comenzando a construir un sistema de notificación de estilo Facebook para nuestra página (tipo de juego social) y ahora estoy investigando cuál sería la mejor manera de diseñar dicho sistema. No estoy interesado en cómo enviar notificaciones al usuario ni nada por el estilo (por ahora incluso). Estoy investigando cómo construir el sistema en el servidor (cómo almacenar notificaciones, dónde almacenarlas, cómo buscarlas, etc.).
Entonces ... algunos requisitos que tenemos:
- en las horas pico tenemos alrededor de 1k usuarios concurrentes conectados (y muchos más invitados, pero no importan aquí ya que no tendrán notificaciones) que generarán muchos eventos
- habrá diferentes tipos de notificaciones (el usuario A te ha agregado como amigo, el usuario B ha comentado tu perfil, al usuario C le ha gustado tu imagen, el usuario D te ha ganado en el juego X, ...)
- la mayoría de los eventos generarán 1 notificación para 1 usuario (al usuario X le ha gustado su imagen), pero habrá casos en los que un evento generará muchas notificaciones (por ejemplo, es el cumpleaños del usuario Y)
- las notificaciones deben agruparse juntas; si, por ejemplo, a cuatro usuarios diferentes les gusta alguna imagen, el propietario de esa imagen debería recibir una notificación que indique que a cuatro usuarios les gustó la imagen y no cuatro notificaciones separadas (al igual que FB)
Bien, lo que estaba pensando es que debería crear algún tipo de cola donde almacenaría eventos cuando ocurrieran. Entonces tendría un trabajo de fondo ( ¿ gearman ?) Que miraría esa cola y generaría notificaciones basadas en esos eventos. Este trabajo luego almacenaría notificaciones en la base de datos para cada usuario (por lo que si un evento afecta a 10 usuarios, habría 10 notificaciones separadas). Luego, cuando el usuario abría una página con la lista de notificaciones, leía todas esas notificaciones para él (pensamos limitar esto a las 100 últimas notificaciones) y las agrupaba y finalmente las mostraba.
Cosas que me preocupan con este enfoque:
- complejo como el infierno :)
- es la base de datos el mejor almacenamiento aquí (estamos usando MySQL) o debería usar otra cosa (redis parece ser una buena opción también)
- ¿Qué debo guardar como notificación? ID de usuario, ID de usuario que inició el evento, tipo de evento (para que pueda agruparlos y mostrar el texto apropiado) pero luego no sé cómo almacenar los datos reales de la notificación (por ejemplo, URL y título de la imagen que me gustó). ¿Debo "hornear" esa información cuando genero la notificación, o debo almacenar la identificación del registro (imagen, perfil, ...) afectado y extraer la información de la base de datos cuando muestre la notificación?
- el rendimiento debería estar bien aquí, incluso si tengo que procesar 100 notificaciones sobre la marcha cuando visualizo la página de notificaciones
- posible problema de rendimiento en cada solicitud porque tendría que mostrar el número de notificaciones no leídas al usuario (lo que podría ser un problema en sí mismo ya que agruparía las notificaciones). Sin embargo, esto podría evitarse si generara la vista de notificaciones (donde están agrupadas) en segundo plano y no sobre la marcha
Entonces, ¿qué opinas sobre mi solución propuesta y mis preocupaciones? Comente si cree que debería mencionar algo más que sería relevante aquí.
Oh, estamos usando PHP para nuestra página, pero eso no debería ser un gran factor aquí, creo.