2009-03-16 10 views
53

Desidero conoscere i motivi tecnici per cui il Webfile di sollevamento presenta prestazioni elevate e scalabilità? So che usa scala, che ha una libreria di attori, ma secondo le istruzioni di installazione la sua configurazione predefinita è con jetty. Quindi usa la libreria degli attori per ridimensionare?perché la struttura del sollevatore è scalabile?

Ora la scalabilità è subito pronta all'uso. Basta aggiungere server e nodi aggiuntivi e questo verrà automaticamente ridimensionato, è così che funziona? Può gestire oltre 500.000 connessioni simultanee con i server di supporto.

Sto cercando di creare un framework di servizi Web per il livello aziendale, in grado di battere ciò che è là fuori ed è facile da scalare, configurare e manutenibile. La mia definizione di ridimensionamento è solo l'aggiunta di più server e dovresti essere in grado di sopportare il carico aggiuntivo.

Grazie

+1

Questo è davvero un argomento enorme, penso che sia meglio focalizzare la risposta a specifiche aree del software server –

risposta

3

Jetty forse il punto di ingresso, ma l'attore finisce per la manutenzione della richiesta, vi suggerisco di avere uno sguardo all'esempio twitter-esque, 'Skitter' per vedere come si sarebbe in grado di creare un servizio molto scalabile. IIRC, questa è una delle cose che ha fatto prendere atto alle persone di Twitter.

170

L'approccio dell'ascensore alla scalabilità è all'interno di una singola macchina. Il ridimensionamento tra le macchine è un argomento più ampio e impegnativo. La risposta breve è: Scala e Lift non fanno nulla per aiutare o ostacolare il ridimensionamento orizzontale.

Per quanto riguarda gli attori all'interno di una singola macchina, Lift raggiunge una migliore scalabilità poiché una singola istanza può gestire più richieste simultanee rispetto alla maggior parte degli altri server. Per spiegare, devo prima sottolineare i difetti nel classico modello di gestione thread-per-request. Abbi pazienza, questo richiederà qualche spiegazione.

Un framework tipico utilizza un thread per soddisfare una richiesta di pagina. Quando il client si connette, il framework assegna un thread a un pool. Quel thread quindi fa tre cose: legge la richiesta da un socket; esegue alcuni calcoli (potenzialmente coinvolgendo l'I/O nel database); e invia una risposta sul socket. Ad ogni passo, il thread finirà per bloccarsi per un po 'di tempo. Durante la lettura della richiesta, può bloccarsi mentre attende la rete. Quando esegue il calcolo, può bloccare su disco o I/O di rete. Può anche bloccare durante l'attesa del database. Infine, durante l'invio della risposta, può bloccare se il client riceve i dati lentamente e le finestre TCP vengono riempite. Nel complesso, il thread potrebbe spendere il 30 - 90% del tempo bloccato. Trascorre il 100% del suo tempo, tuttavia, su quella richiesta.

Una JVM può supportare solo molti thread prima che rallenti davvero. La schedulazione dei thread, la contesa per le entità a memoria condivisa (come i pool di connessione e i monitor) ei limiti del sistema operativo nativo impongono restrizioni sul numero di thread che una JVM può creare.

Bene, se la JVM è limitata nel numero massimo di thread e il numero di thread determina il numero di richieste simultanee che un server può gestire, il numero di richieste simultanee sarà determinato dal numero di thread.

(Ci sono altri problemi che possono imporre limiti inferiori --- GC botte, per esempio. Thread sono un fattore limitante fondamentale, ma non l'unica!)

Ascensore disaccoppia filo dalle richieste. In Lift, una richiesta fa non legare una discussione. Piuttosto, un thread esegue un'azione (come leggere la richiesta), quindi invia un messaggio a un attore. Gli attori sono una parte importante della storia, perché sono programmati tramite thread "leggeri". Un pool di thread viene utilizzato per elaborare i messaggi all'interno degli attori. È importante evitare il blocco delle operazioni all'interno degli attori, quindi questi thread vengono restituiti rapidamente al pool.(Si noti che questo pool non è visibile all'applicazione, fa parte del supporto di Scala per gli attori.) Una richiesta attualmente bloccata sul database o sull'I/O del disco, ad esempio, non mantiene occupato un thread di gestione richieste. Il thread di gestione richieste è disponibile, quasi immediatamente, per ricevere più connessioni.

Questo metodo per il disaccoppiamento delle richieste dai thread consente a un server di sollevamento di avere molte più richieste simultanee rispetto a un server di thread per richiesta. (Vorrei anche sottolineare che la libreria Grizzly supporta un approccio simile senza attori.) Più richieste contemporanee significa che un singolo server Lift può supportare più utenti rispetto a un normale server Java EE.

+5

Voglio più voti per darti. Questa è stata una risposta perfetta. –

+23

Penso che tu sia vittima di un mittente e fai l'interrogatorio. La tua risposta è molto meglio allora la domanda stessa merita. –

+1

@mtnygard: tu dici "è importante evitare le operazioni di blocco all'interno degli attori". Cosa succede se ho bisogno di fare qualche I/O che potrebbe bloccare per qualche tempo? Devo lanciare un altro thread? –

20

a mtnyguard

"Scala e di sollevamento non fanno nulla per aiutare o ostacolare scala orizzontale"

non è giusto. Lift è una struttura altamente affermativa. Ad esempio, se un utente richiede un modulo, può solo inviare la richiesta alla stessa macchina da cui proviene il modulo, poiché l'azione di elaborazione del modulo viene salvata nello stato del server.

E questo è in realtà una cosa che ostacola la scalabilità in un modo, perché questo comportamento è incoerente all'architettura nulla condivisa.

Non c'è dubbio che l'ascensore è altamente performante ma la perfomance e la scalabilità sono due cose diverse. Quindi, se vuoi scalare orizzontalmente con lift, devi definire sessioni appiccicose sul loadbalancer che reindirizzerà un utente durante una sessione sulla stessa macchina.

+12

Sì ...è giusto così e Foursquare e Novell Pulse dimostrano entrambi che il requisito della sessione appiccicosa di Lift non è stato un problema per il ridimensionamento orizzontale ... e con l'imminente Lift Cluster Manager commerciale, la gestione del cluster sarà ancora più semplice. –

+1

Dov'è Lift Cluster Manager? – Lukasz

1

Mi piace molto la risposta di @ dre perché afferma correttamente che lo stato dell'ascensore rappresenta un potenziale problema per la scalabilità orizzontale.

Il problema - Invece di descrivere di nuovo l'intera faccenda, controlla la discussione (non il contenuto) su questo post. http://javasmith.blogspot.com/2010/02/automagically-cluster-web-sessions-in.html

La soluzione sarebbe come @dre ha detto la configurazione della sessione appiccicosa sul bilanciamento del carico nella parte anteriore e aggiungendo più istanze. Ma dal momento che la gestione delle richieste in ascensore viene eseguita nella combinazione di thread + attore, è possibile aspettarsi che un'istanza gestisca più richieste rispetto ai normali framework. Ciò darebbe un vantaggio rispetto alle sessioni appiccicose in altri quadri. Ad esempio, la capacità dell'istanza individuale di elaborare di più può aiutarti a ridimensionare

  • hai un'integrazione con Akka lift che sarebbe un altro vantaggio in questo.
Problemi correlati