2011-06-14 14 views
6

Estoy jugando con la construcción de una aplicación de chat usando PHP y CodeIgniter.Uso de memcached como buffer de base de datos para mensajes de chat

Para esto, estoy implementando un 'buffer' de caché con memcached para contener los mensajes de chat más recientes en la memoria, reduciendo la carga en la base de datos. Lo que quiero hacer es lo siguiente:

  1. Cuando llega un mensaje, lo guardo en memcached usando el minuto actual (AAAA-MM-DD-HH-MM) como la clave. No hay E/S de base involucrada. La idea es que todos los mensajes del mismo minuto se recopilen bajo la misma clave.
  2. Los usuarios reciben nuevos mensajes de chat también recuperados de memcached (por el momento estoy usando long-polling, pero esto se moverá a WebSockets en Node.js por razones obvias de rendimiento). Nuevamente, no hubo E/S en la base de datos involucrada.
  3. Se ejecutará una secuencia de comandos del servidor automatizada (cronjob) una vez cada 5 minutos, recopilando los datos de memoria de los últimos 5 minutos e insertando los mensajes en la base de datos.
  4. Los objetos memcached se establecen para echarse a perder después de 6 minutos, por lo que nunca necesitan mantener más de 6 minutos de datos de mensajes en la memoria

Esto para un total de operación de escritura una base de datos por 5 minutos y cero operaciones de lectura de base de datos.

¿Esto suena factible? ¿Hay alguna forma mejor (¿incluso integrada?) De usar memcached para este fin?


actualización: He estado experimentando un poco ahora, y tengo una idea para un acceso directo (es decir: piratear). Puedo 'almacenar temporalmente' los mensajes temporalmente en el script del servidor Node.js hasta que esté listo para almacenarlos. Un objeto/conjunto de mensajes de Javascript en el servidor Node.js es básicamente un caché de memoria, más o menos.

Entonces: Cada N mensajes/segundos, puedo pasar los mensajes almacenados en el búfer (los contenidos de la matriz JS) a mi base de datos, utilizando el método que desee, ya que no se llamará con mucha frecuencia.

Sin embargo, me preocupa que esto pueda paralizar el proceso del servidor Node.js, ya que probablemente no disfrutará transportar esa matriz de 200 KB.

¿Alguna idea de esta estrategia? ¿Está completamente loco?

+0

Tecnologías a tener en cuenta: COMET y erlang/jabber (Facebook utilícelas) O: HTML5 y Web Sockets (con un respaldo de socket flash - Google para estos) –

Respuesta

2

¿Por qué no utilizar INSERT DELAYED? Le ofrece casi la misma funcionalidad que está tratando de lograr sin la necesidad de memcached.

De todos modos, su solución también se ve bien.

+0

Idea interesante. Realmente no me gusta la idea, ya que parece forzar la alimentación del servidor SQL esperando que recuerde masticar correctamente (escalado a 100 inserts por segundo), pero en realidad podría funcionar –

+0

@Jens: eso no es una esperanza.INSERT DELAYED se hacen específicamente para este caso. – dynamic

+0

Pero si mi instancia de node.js recibe 100 mensajes/seg y necesita emitir una instrucción INSERT DELAYED al servidor SQL para cada uno, ¿no tendrá que establecer 100 conexiones al servidor de la base de datos? A menos que pueda hacer un pool de conexiones además de eso usando node.dbslayer.js. –

3

¿Ha analizado las conexiones de socket HTML5? Con un servidor de socket, no necesita almacenar nada. El servidor recibe un mensaje de un suscriptor y lo envía de inmediato a los suscriptores correctos. No he hecho esto yo mismo usando HTML5, pero sé que la funcionalidad ahora existe. Lo he hecho antes de usar Flash, que también es compatible con las conexiones de socket.

+1

WebSockets son el objetivo, claro, pero no están disponibles en la mayoría de los navegadores hasta ahora. , así que por ahora usaré Socket.IO (que usa WebSockets cuando está disponible, pero tiene varios mecanismos alternativos) –

Cuestiones relacionadas