2015-10-19 8 views
16

abbiamo il nostro vecchio sito Web costruito su stack LAMP con autenticazione utente. Ora abbiamo creato una nuova piattaforma social per gli stessi utenti con funzioni di chat dal vivo, video e forum di discussione ecc. E abbiamo usato node.js per questo scopo.È memcache adatto per il passaggio dei dettagli utente da Apache a Node.js

Quando un utente è connesso nel suo conto nel vecchio sito - consente di dire che può cliccare su un link

 
www.xyz.com/social 

che lo porterà a questa nuova piattaforma node.js.

Quindi non sono sicuro su come passare i dettagli utente da apache a node.js - Tutto ciò di cui ho bisogno è id utente e quindi in node.js - Posso interrogare la tabella mysql e caricare i dettagli dell'utente.

Simple Solution

La soluzione più semplice è quella di hash l'id utente e la posta elettronica e memorizzare l'hash come chiave del server memcache e trasmettere dati utente come valori

 
$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); 

E poi nel link passare il valore hash come parametro di come

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

e in js nodo - recuperare i dati utente da memcache in base alla chiave hash.

1) È proprio questo ad avvicinarsi a questo.

2) Memcache supporta il salvataggio dei dati di così tanti utenti (circa 500 utenti in un dato momento) che si spostano all'interno del sito Web dal vecchio sito al nuovo sito node.js.

Grazie in anticipo per gli input.

+2

se si utilizzano i cookie in php e ci si trova nello stesso dominio li si ha anche nell'app nodejs. Quindi puoi decodificare i tuoi cookie dal nodo o effettuare una chiamata http a php con i cookie dell'utente e lasciare php a dirti chi è veramente l'utente. –

risposta

7

1) È proprio questo ad avvicinarsi a questo.

Sì, è a destra fare così. Ma ci può essere un approccio migliore a questo problema:

  • come suggerito da alex-rokabilis. cioè "cookie", basta condividere sopra chiave memcache utilizzando i cookie.
  • dettagli del negozio da condividere tra Apache e node.js nella memoria di sessione.

Scegliere correttamente le condizioni di annullamento.

2) Will Memcache supporta la memorizzazione dei dati di tanti utenti

Sì, lo farà.
Ma dipende in gran parte dalla distribuzione di memcache, quanta RAM ci stai fornendo?
Calcolare o ottenere una stima approssimativa della quantità di RAM necessaria per memorizzare 500 dettagli utente. Una volta che memcache è andato in swap, servire queste richieste sarebbe un dolore per memcache.


Ma, come per me, metodo migliore per voi sarebbe attenersi a MySQL solo.

  • utente autenticato con stack LAMP
  • fornire Cookie md5(user-id . timestamp. KEY), e salvare questa voce nel database.
  • Get cookie nel applicazione e ricerca MySQL Table node.js
  • recuperare i dati di conseguenza
  • Aggiungi layer di caching in cima a queste chiamate di ricerca di MySQL. (in modo da poter mantenere coppie di kep selettive in memcache solo per gli utenti attivi con timeout piccolo ~ 10 sec?)
  • Quando si effettua il logout, è sufficiente rimuovere la voce dalla tabella MySQL ed eliminare anche la chiave da memcache.

Motivi

  • come è possibile determinare timeout, perché un utente può rimanere all'infinito (o secondo timeout) registrati nel LAMP. Ma, verrà disconnesso da node.js in base al timeout.
  • La persistenza sarà sempre un problema se ci si basa interamente su memcache. Come ricostruirai le coppie di chiavi dopo ogni riavvio di memcache, se non hai una copia da qualche parte (MySQL)?
3

Memcache è pensato per essere un servizio caching, non un servizio di trasferimento dati. Non è garantito che un valore memorizzato nella cache sia disponibile per l'altro componente.

Quello che stai cercando di fare funzionerà per lo più, ma probabilmente avrà problemi strani quando inizi a caricare del sistema. Probabilmente vorresti usare un sistema di accodamento dei messaggi come RabbitMQ o Kafka, o tornare a memcached con un database.

0

Come suggeriscono le risposte precedenti, è un modo corretto con un collo di bottiglia (carico o traffico fino alla RAM) che può essere un vero problema.

Vorrei proporre un nuovo modo. in realtà non è necessario riprodurre "Dati di sessione a livello utente di PHP". Puoi usarlo subito da nodejs. Per ottenere ciò è necessario modificare il gestore di sessione del codice lampada precedente. Memorizza le sessioni in memcache con il formato json. quindi accedervi direttamente da nodejs. dal momento che non hai riprodotto alcun dato; risparmierai un sacco di ram e operazioni di I/O (se memorizzi le sessioni in file o db) anche tu salverai la potenza di calcolo. tutti questi risparmi ti porteranno prestazioni.

Questo è un codice di esempio per memorizzare i dati di sessione come json in memcache.

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

non ho provato il codice. ma penso che tu possa gestirlo facilmente.