php node.js apache memcached

php - ¿Es memcache adecuado para pasar detalles de usuario de Apache a Node.js?



memcached (3)

Tenemos nuestro antiguo sitio web construido en pila LAMP con autenticación de usuario. Ahora hemos construido una nueva plataforma social para los mismos usuarios con funciones de chat en vivo, videos y foros de discusión, etc., y hemos utilizado node.js para este propósito.

Cuando un usuario inicia sesión en su cuenta en el sitio anterior, digamos que puede hacer clic en un enlace

www.xyz.com/social

Lo que lo llevará a esta nueva plataforma node.js.

Así que no estoy seguro de cómo pasar los detalles del usuario de apache a node.js. Todo lo que necesitaré es la identificación del usuario y luego en node.js. Puedo consultar la tabla mysql y cargar los detalles del usuario.

Solución simple

La solución simple es el hash de la identificación del usuario y el correo electrónico y almacenar el hash como clave en el servidor de memcache y pasar los detalles del usuario como valores

$hash = md5($user_id+$email); $memcache = new Memcache; $memcache->connect("localhost",11211) or die ("could not connect"); $data = json_encode(array("id"=>$user_id,"name"=>"aaa")); $memcache->set("key-".$hash,$data);

Y luego en el enlace pase el valor de hash como parámetro

www.xyz.com/social/$$hash-value$$

y en el nodo js: recupera los detalles del usuario de memcache en base a la clave hash.

1) ¿Es esta la razón para acercarse a esto?

2) ¿Memcache admitirá el almacenamiento de datos de tantos usuarios (alrededor de 500 usuarios en un momento dado) que se mueven dentro del sitio web del sitio antiguo al sitio nuevo node.js.

Gracias de antemano por sus entradas.


1) ¿Es esta la razón para acercarse a esto?

Sí, es correcto hacer esto. Pero puede haber una mejor aproximación a este problema:

  • como sugirió @ alex-rokabilis. es decir, "cookies", solo comparte la clave anterior de memcache usando cookies.
  • almacene los detalles que necesita compartir entre Apache y node.js en el almacenamiento de la sesión.

Elija las condiciones de invalidación correctamente.

2) ¿Memcache soportará el almacenamiento de datos de tantos usuarios?

Si lo sera
Pero depende en gran medida de su implementación de memcache, ¿cuánta RAM le está proporcionando?
Calcule u obtenga una estimación aproximada de la cantidad de RAM necesaria para almacenar 500 detalles de usuario. Una vez que memcache se cambiara, entonces atender estas solicitudes sería un dolor para memcache.

Pero, según mi criterio, un método mejor para usted se limitaría a MySQL solamente .

  • Usuario autenticado con pila LAMP
  • Proporcione la cookie md5(user-id . timestamp. KEY) y guarde esta entrada en la base de datos.
  • Obtenga una cookie en la aplicación node.js y busque la tabla mysql
  • Recuperar datos en consecuencia
  • Agregue la capa de almacenamiento en caché sobre estas llamadas de búsqueda de MySQL. (para que pueda mantener los pares de kep selectivos solo en memcache, es decir, de usuarios activos con un pequeño tiempo de espera ~ 10seg?)
  • Cuando el usuario cierre la sesión, simplemente elimine la entrada de la tabla MySQL y también elimine la clave de memcache.

Razones

  • ¿Cómo puede determinar los tiempos de espera, ya que un usuario puede permanecer infinitamente (o según el tiempo de espera) conectado a LAMP? Pero se desconectará de node.js de acuerdo con el tiempo de espera.
  • la persistencia siempre será un problema si confía completamente en memcache. ¿Cómo reconstruirá los pares de claves después de cada reinicio de memcache, si no tiene una copia en algún lugar (MySQL)?

Como lo sugieren las respuestas anteriores, es una forma correcta con un cuello de botella (carga o tráfico hasta RAM) que puede ser un problema real.

Me gustaría sugerir una nueva forma. en realidad no es necesario reproducir "datos de sesión de nivel de usuario de PHP". Puedes usarlo directamente desde nodejs. Para lograr esto, necesita cambiar el controlador de sesión del código de la lámpara anterior. Almacenar sesiones en memcache con formato json. Luego acceda directamente desde nodejs. ya que no has reproducido ningún dato; ahorrará una gran cantidad de RAM y operaciones de E / S (si almacena sesiones en archivos o db) también ahorrará poder de cómputo. Todos estos ahorros te traerán rendimiento.

Aquí hay un código de ejemplo para almacenar datos de sesión como json en memcache.

https://github.com/lboynton/memcached-json-session-save-handler/blob/master/library/Lboy/Session/SaveHandler/Memcached.php

No probé el código. Pero creo que puedes manejarlo fácilmente.


Memcache está destinado a ser un servicio de almacenamiento en caché de datos, no un servicio de transferencia de datos. No hay garantía de que un valor almacenado en el caché esté disponible para el otro componente.

Lo que intenta hacer funcionará principalmente, pero es probable que tenga problemas extraños cuando comience a poner algo de carga en el sistema. Es probable que desee utilizar un sistema de colas de mensajes como RabbitMQ o Kafka, o hacer copias de seguridad con una base de datos.