2009-08-22 29 views
35

Estoy trabajando en un sitio web que utilizará las características de las redes sociales (como Facebook, por ejemplo).Patrón de diseño: sistema de notificación

Me gustaría implementar un sistema de notificación que muestre cosas como "X te agregó como amigo", "Y te invito a la fiesta", "Z ha tomado la última prueba" ... y yo no saber cómo hacer.

Me pregunto cuál es la mejor solución:

  • Solución 1, también conocido como "registro".

Una tabla dedicada "notificación". Agrego filas en esta tabla cada vez que surge algo similar a una notificación (agregar amigo, responder preguntas, etc.). La tabla "notificación" tiene campos que contienen información diferente, de acuerdo con el tipo de notificación que se agrega a la tabla.

Bueno: fácil de codificar, separación entre la función de notificación y las características "normales", no consume demasiados recursos cuando necesito leer la tabla.

Malo: Notificación mesa crecerá probablemente muy grande (creo que voy a añadir 10k filas/día en la tabla), "duplicar" la información: la información en la tabla de notificación se puede encontrar en el resto de la mesa usando fecha/lista/lo que sea comparación

  • Solución 2, también conocido como "busque en todas partes".

Cada vez que necesito mostrar la lista de notificaciones o mostrar cuántas notificaciones nuevas hay, miro toda la tabla correspondiente, comparo la fecha/etc para saber si sucedió algo nuevo desde la última vez que el usuario notificación.

Bueno: No es una tabla demasiado grande en comparación con la solución 1, no hay "redundancia" de información.

Malo: Tengo miedo debido a la cantidad de usuarios (~ 1k +), hace que el servidor explote porque consume recursos/tiempo, es un poco más difícil de codificar/mantener.

¿Puede decirme qué piensa mejor y por qué, o tiene una solución que no imaginé?

Gracias =)


Editar: Digamos que utilizar un diseño muy básico DB: los usuarios tienen amigos, puede hacer pruebas. 1 tabla para la lista de usuarios, lista de preguntas, 1 tabla quizz < -> relación de usuario, 1 usuario de tabla < -> usuario de amistad. Cada vez que un usuario visita su propio perfil, puede ver lo que sucedió: nuevo cuestionario < -> relación de usuario, nuevo usuario < -> relación de usuario, etc. ¿Cómo diseñaría una notificación como esa?

Respuesta

20

Crear una cola de sistema, cada mensaje agregado a esta cola tiene una lista de "consumidores" y el contenido. La bomba de mensajes principal procesa cada mensaje y envía el mensaje a todos los consumidores.

Digamos que 2 personas se hacen amigos. Agrega un mensaje a la cola del sistema principal que A es amigo de B y los consumidores son ambos A y B. Cuando su mensaje "bomba" (procesador) ve este mensaje, lo agrega a la cola de A y la cola de B. Entonces ahora el usuario A y el usuario B tienen un nuevo mensaje de que son amigos. A su vez, cada usuario tiene un procesador de mensajes, por lo que cuando ve un mensaje llamado "Soy amigo de [alguien]" procesa esto como agregar una nueva entrada al "muro" visible para los amigos de A que "A es amigo de B ", etc.

Esto es demasiado simplista pero con suerte muestra cómo las colas de mensajes se pueden usar para esto (se usa un sistema muy similar al de Windows UI) entonces ya hay un ejemplo existente y hay mucha cola de mensajes sincronizada patrones que puedes usar

El resto depende de usted para diseñar.

+0

Esa es una solución que me gusta también. Pero me pregunto si la tabla de "cola" que contendría las notificaciones de cada usuario no sería demasiado grande después de un tiempo. Digamos que tengo 2k usuarios, que tienen 5 notificaciones/día (que es aproximadamente lo que sucederá), son 10k/día nuevas filas en esta tabla. Qué piensas ? –

+1

Puede tener colas de "agente libre", que se asignan a usuarios que tienen mensajes pendientes y, una vez que todos los mensajes se han ido, la cola puede ir a un grupo de colas libres para ser utilizadas por otros usuarios. Esto también puede controlar qué tan rápido genera actualizaciones, la agrupación limitada es útil y monitoreando el promedio de mensajes por cola o los mensajes en cola de espera pueden indicarle cuándo necesita escalar horizontalmente el sistema. – AlexC

+1

Mm, ¿puedes explicarlo con mayor precisión? Entre el ayuno que no soy estadounidense ni inglés, y el hecho de que apestaba en dev (^^), no entendí todo lo que dijiste. gracias =) –

14

Realmente esto cae bajo el ¿cómo diseño un automóvil? tipo pregunta categoría ...

La implementación depende del diseño, dónde irá en el futuro y del entorno en el que implementará. Puede elegir una implementación de Twitter, un sistema de XML respaldado por SAN, bases de datos relacionales, Hadoop y toneladas de otros .

Un buen conocimiento de las tecnologías web, experiencia, prueba y error es la única forma en que puede diseñar cualquier función con la certeza de que lo está haciendo de la manera correcta.

¿Cuáles son sus necesidades de rendimiento? Niveles de tráfico? ¿Requisitos de usuario? ¿Desea distribuir más tarde (a través de webhooks, por ejemplo?).

Su pregunta debe ser más específica.

Yo personalmente tendría una tabla de "tipos de notificación" actuando como una enumeración ... y luego un usuario <> tabla de notificación que maneja la relación entre la notificación y el usuario.

Con una buena codificación, puede empalmar el usuario <> tabla de notificación en muchos servidores e ingresar el ID de usuario o similar ... y replicar la tabla de tipos en cada uno de esos nodos para la memoria caché/referencia local. Algo como eso.

+0

Pensé que haría algo así. Gracias, no sabías sobre Hadoop. –

+4

Clement está pidiendo un patrón de notificaciones genéricas que me parece una pregunta justificada. – apotonick

0

Sugiero usar notificaciones simples. Sin tipo de notificación u otra cosa.

Notificaciones
-id
-mensaje
-href (enlace para ir cuando el usuario hace clic la notificación)
-receiverUser
-date uso

Ejemplo: John (34) le gusta una foto de María (47). (Estamos enviando una notificación a Mary)

INSERT INTO Notifications(message,href,receiverUser, date) VALUES ('John liked your photo', 'link of the photo', 47, 01.11.2014) 
+2

¿Qué sucede si la mayoría de las notificaciones son las mismas? ¿No sería más fácil tener una tabla con todos los posibles mensajes de notificación, y luego usar un FK en su tabla de notificaciones? De esta forma, no repetiría la cadena "Ahora es amigo de " millones de veces en su base de datos. –

1

Ahora los servidores de días como Amazon están proporcionando el marco de notificación. Entonces, si usa la notificación de Amazon, puede que no tenga que preocuparse por las estructuras de la tabla.

Espero que esto ayude a otros a buscar soluciones similares.