sql >> Base de Datos >  >> NoSQL >> MongoDB

Diseño de esquema MongoDB - Chat en tiempo real

Usé Redis , NGINX y PHP-FPM para mi proyecto de chat. No es muy elegante, pero funciona. Hay algunas piezas en el rompecabezas.

  1. Hay un script PHP muy simple que recibe los comandos del cliente y los coloca en una LISTA masiva. También verifica todas las LISTAS de salas y las LISTAS privadas de los usuarios para ver si hay mensajes que debe entregar. Esto lo sondea un cliente escrito en jQuery y se realiza cada pocos segundos.

  2. Hay un script PHP de línea de comandos que opera del lado del servidor en un bucle infinito, 20 veces por segundo, que verifica esta lista y luego procesa estos comandos. La secuencia de comandos maneja quién está en qué sala y los permisos en la memoria de secuencias de comandos, esta información no se almacena en Redis.

  3. Redis tiene una LISTA para cada sala y una LISTA para cada usuario que funciona como una cola privada. También tiene varios contadores para cada sala en la que se encuentra el usuario. Si el contador de usuarios es menor que el total de mensajes en la sala, obtiene la diferencia y se la envía al usuario.

No he podido hacer una prueba de estrés de esta solución, pero al menos desde mi evaluación comparativa básica, probablemente podría manejar muchos miles de mensajes por segundo. También existe la oportunidad de transferir esto a algo como Node.js para aumentar el rendimiento. Redis también está madurando y tiene algunas características interesantes como los comandos Pub/Subscribe, que podrían ser de interés, que posiblemente eliminarían el sondeo del lado del servidor.

Busqué soluciones basadas en Comet, pero muchas de ellas eran complicadas, estaban mal documentadas o me obligaban a aprender un lenguaje completamente nuevo (por ejemplo, Jetty->Java, APE->C), etc. También la entrega y el paso por proxies a veces pueden ser un problema con Comet. Por eso me he quedado con las encuestas.

Me imagino que podrías hacer algo similar con MongoDB. Una colección por habitación, una colección por usuario y luego una colección que mantiene contadores. Aún necesitará escribir un demonio o secuencia de comandos de back-end para manejar la gestión de dónde van estos mensajes. También puede usar las "colecciones limitadas" de MongoDB, que mantienen los documentos ordenados y también borra automáticamente los mensajes antiguos, pero eso podría ser complicado para mantener los contadores adecuados.