2012-11-13 12 views
6

Supose Ho bisogno di implementare un'applicazione web che avrà un volume elevato di utenti simultanei. Decido di utilizzare node.js perché è molto scalabile, ha buone prestazioni, comunità open source, ecc. Quindi, per evitare colli di bottiglia perché potrei avere milioni di utenti nello stesso ciclo di eventi, decido di utilizzare un cluster di processi per sfruttare la CPU multi-core. Inoltre, ho 3 macchine (principale + 2) perché ho bisogno di manipolare i big-data con Cassandra. Fantastico, questo significa che ho 3 * n processi node.js dove n è il numero di core della cpu (le macchine sono identiche).Come progettare un server web node.js distribuito

Ok, allora comincio una ricerca e finisco con il seguente schema:

  • Nginx in ascolto sulla porta 80 e utilizzato solo per servire contenuti statici (img, css, js, ecc).
    Inoltra il traffico dinamico a haproxy. So come configurare nginx, ma devo ancora dare un'occhiata a haproxy, quindi dirò che haproxy sta ascoltando sulla porta 4000. Nginx e haproxy sono installati nella macchina principale (il punto di ingresso).
  • Bilance di carico epossidiche tra le 3 macchine. Si inoltra il traffico sulla porta 4001, vale a dire, i processi Node.JS ascoltano 4001.
  • Ogni node.js ha un gruppo di n processi ascoltare 4001.

Se non sbaglio un singolo la richiesta http verrà inoltrata a un singolo processo node.js.

Creare una sessione è abbastanza normale, giusto? Una sessione è solo una mappa e questa mappa è un oggetto e questo oggetto vive in un processo node.js. Haproxy verrà configurato con uno scheduler round-robin, quindi lo stesso utente può essere inoltrato a diversi processi node.js. Come posso condividere lo stesso oggetto di sessione in tutti i processi node.js? Come posso condividere un oggetto globale (questo include nella stessa macchina (cluster node.js) e attraverso la rete)? Come dovrei progettare un'applicazione web distribuita con node.js? Ci sono dei moduli che facilitano le attività di sincronizzazione?

+1

haproxy ha diversi modi di gestire sessioni persistenti, http: // stacko verflow.com/questions/6498030/load-balancing-haproxy-or-other-sticky-sessions. Per un oggetto globale, usa redis o qualcosa del genere. – numbers1311407

+0

Simile a http://stackoverflow.com/questions/5398209/scaling-node-js-across-multiple-cores-servers Anche solo 3 server. –

risposta

1

È possibile utilizzare memcache o redis per la memorizzazione di oggetti di sessione. È abbastanza utile in caso di processi del nodo di riavvio (se i dati di sessione sono memorizzati nel processo 'la memoria sarà persa).

Inoltre è possibile controllare la lista delle caratteristiche pm2 e forse alcuni di essi sarebbero utili per voi.

La creazione di un'architettura di micro servizi consente una buona scalabilità.

1

Come ha sottolineato Ivan, si memorizzano gli oggetti di sessione in memcache o redis o anche in Couchbase (bucket di memcache). Vorrei anche aggiungere, se si desidera creare un sistema scalabile, l'obiettivo dovrebbe essere quello di creare un sistema in modo da poterlo scalare in modo lineare per aumentare il throughput in base alla domanda. Con ciò intendo, dovresti essere in grado di aggiungere più host in qualsiasi momento (preferibilmente durante il picco) a diversi livelli all'interno della tua infrastruttura per gestire le richieste.

Quindi devi stare molto attento a quale tecnologia scegli e alle decisioni di progettazione che prendi durante lo sviluppo.

Supose Ho bisogno di implementare un'applicazione web che avrà un volume elevato di utenti simultanei.

Un'altra cosa che vorrei aggiungere, se non riesci a misurarla, non puoi gestirla. Un buon inizio dovrebbe definire quale "alto volume di utenti simultanei" significa per te?È quel tipo di volume/concorrenza di facebook o whatsApp? Definisci prima questi aspetti collaborando con i tuoi stakeholder (se ce ne sono), quindi puoi iniziare a prendere decisioni di progettazione e tecnologie di picking.

Una buona cartina tornasole mentre si costruisce un sistema scalabile è chiedersi: "C'è un singolo punto di errore?" se sì, il tuo sistema non si ridimensionerà.

0

Come suggerito da un altro utente; utilizzando Redis è una soluzione perfettamente accettabile a questo problema.

Lo scopo è utilizzare il servizio per la memorizzazione degli oggetti di sessione e lasciare che il middleware si occupi di tutto il resto. Come accennato in precedenza, è utile nei casi in cui il processo del nodo si riavvia, si arresta in modo anomalo, ecc. La memorizzazione dei dati della sessione nel processo del nodo comporta dei rischi. Uno dei vantaggi dell'utilizzo dei servizi Micro (come Redis) è che tali rischi sono ridotti.

Supponendo di utilizzare Express per il middleware, è possibile utilizzare qualcosa chiamato Session store. Ci sono molti moduli che sfruttano questa funzionalità.

Un tale modulo è connect-redis

L'installazione è un gioco da ragazzi, come al solito:

npm install connect-redis express-session 


Quindi si usa in questo modo:

var session = require('express-session') 
var RedisStore = require('connect-redis')(session) 

app.use(session({ 
    store: new RedisStore(options), 
    secret: 'keyboard cat' 
})) 

Ora si utilizza l'oggetto della sessione, proprio come faresti normalmente. (req.session)


Esempi:

Per impostare le informazioni di sessione (da un modulo POST, per esempio):

req.session.email = req.body.email 


per recuperare le informazioni di sessione:

console.log(req.session.email) 
Problemi correlati