Continuo a vedere nelle offerte di lavoro che il candidato deve avere esperienza nella scrittura di candidature “scalabili”. Cosa rende scalabile unapplicazione e come faccio a sapere che il mio codice può essere scalabile a milioni di utenti?
Immagino che un modo migliore per formulare questa domanda sia: come posso scrivere il mio codice con la scalabilità in mente? In modo che il codice sia scalabile sin dallinizio invece di un ripensamento. Esistono determinate metodologie di progettazione? O si tratta semplicemente di scegliere gli algoritmi corretti per il lavoro?
Risposta
Ci sono due direzioni di scalabilità:
- verticale (noto anche come ridimensionamento): CPU più veloce, più RAM, più spazio su disco;
- orizzontale (noto anche come scalabilità orizzontale): più core nella CPU, più CPU, più server ;
Per il primo, devi solo fare attenzione a non avere limitazioni arbitrarie. Questi a causa di dimensioni intere troppo piccole o strutture di lunghezza fissa / limitata. Queste strutture potrebbero essere correlate al sistema operativo sottostante. Ad esempio, se cerchi di aumentare la scala utilizzando più thread o processi, a un certo punto “raggiungerai i limiti del sistema operativo”. Questo è il motivo per cui attualmente i server creati per unelevata scalabilità eseguono la concorrenza basata su eventi asincroni. Questo problema è descritto nel famoso C10K documento .
Il secondo è più difficile. Richiede una programmazione con due cose in mente: i dati verranno elaborati in parallelo e i dati potrebbero essere distribuito fisicamente. La comunicazione tra i nodi dovrebbe essere limitata. In pratica ciò di solito significa sacrificare alcune parti di ACID (è dimostrato che non si può avere ACID completo e capacità di scale-out allo stesso tempo). La soluzione più conosciuta per i dati larchiviazione in questo paradigma sono soluzioni NoSQL . Si va da archivi di valori-chiave molto semplici, a sistemi simili a RDBMS, privi solo della possibilità di eseguire join. Il negozi di valori-chiave sono estremamente scalabili, ma questo ha un prezzo. In pratica puoi eseguire query solo sulla chiave primaria. Tuttavia, esiste una soluzione per cioè “s map reduce . Potrebbe sembrare molto subottimale se guardi al punto di vista della complessità cumulativa, ma devi tenere presente che sta funzionando in modo massicciamente parallelo.
Se vuoi leggere di più sulla scalabilità con esempi di vita reale , controlla il HighScalability.com blog .
Commenti
- +1 per aver menzionato lo scale out. Laggiunta di più risorse è molto veloce e attraente per i decisori (acquista alcuni hex-core e raddoppia la memoria! ). Ma se lapplicazione non può ‘ mettere pressione su di loro, hai un problema più grande.
Risposta
La scalabilità viene misurata in termini di velocità effettiva sulla base di alcune variabili. Ad esempio, numero di richieste / secondo con utenti X . Il modo più semplice per descrivere la scalabilità è:
Una misura dell efficienza allaumentare del carico.
La prima cosa che devi capire nella progettazione della scalabilità è quale misura è più importante per la tua applicazione? Esistono diversi modi per misurare l efficienza che è un componente chiave della scalabilità:
- Richieste simultanee al secondo
- Tempo medio di risposta per richiesta
- Numero di record elaborati al secondo / minuto
Ci sono più misurazioni dellefficienza che possono essere utilizzate, ma queste sono comuni per i sistemi basati sul web o per i sistemi di elaborazione batch.
Il prossimo aspetto della scalabilità è misurare ciò che accade alla tua efficienza quando il carico aumenta. I metodi comuni per aumentare il carico sono:
- Più utenti che raggiungono il server (cioè più traffico web)
- Più dati nel database (cioè le query richiedono più tempo o lelaborazione richiede più lungo)
- Guasto del disco rigido in un RAID (le prestazioni / laffidabilità dello storage sono influenzate)
- Saturazione della rete
Lobiettivo per unapplicazione scalabile è per mantenere o migliorare lefficienza mentre affrontiamo il problema del carico. In breve, se il tempo di risposta richiede troppo tempo, possiamo aggiungere un altro server per distribuire il carico in modo uniforme? Questo approccio riduce la quantità di lavoro che un server deve fare e mantiene i server operativi in quel “punto ottimale” per lefficienza.
La tua applicazione dovrà essere progettata specificamente per essere scalabile. Ciò significa che prestare attenzione ai dati di sessione, instradando le richieste al server giusto, riducendo i colli di bottiglia che limitano la capacità di scalabilità dellapplicazione.
Risposta
Fondamentalmente vuoi evitare colli di bottiglia delle prestazioni quando aumenti il numero di utenti e / o elabori un set di dati più grande e / o offri la tua interfaccia in più lingue, ecc.
Fondamentalmente dai unocchiata allo schema del tuo database, ai tuoi algoritmi e al tuo processo di sviluppo del software e cerchi di prevedere i problemi futuri. Vuoi anche impostare il monitoraggio delle prestazioni per identificare i problemi quando iniziano a svilupparsi.
Ho raccolto questi suggerimenti quando ho letto Creazione di siti Web scalabili (collegamento ad amazon).
Spero che questo aiuti!
Rispondi
Lunico modo in cui le applicazioni può essere veramente scalabile, è non avendo alcuna restrizione che non può essere passata (o solo molto costoso).
Un tipico esempio è cosa succede quando si esauriscono i cicli della CPU disponibili? Se il tuo programma è multi-battistrada puoi girare su una scatola con più core, ma cosa succede quando non puoi più comprare una scatola più grande? La tua applicazione semplicemente non può più crescere e quindi non è scalabile.
Qualsiasi applicazione veramente scalabile deve essere in grado di diffondersi su più computer in modo trasparente e farlo senza intoppi evidenti. Non è facile ed è uno dei motivi per cui Google ha avuto così tanto successo.
Risposta
Ci sono problemi unici forniti con il supporto di applicazioni su larga scala. Lofferta di lavoro è alla ricerca di candidati che hanno lavorato in quellambiente e hanno dovuto risolvere tali problemi.
Da unapplicazione di alto livello le applicazioni vengono rese scalabili ponendosi costantemente la domanda su cosa accadrebbe se questo pezzo di codice venisse richiesto di essere eseguito migliaia di volte in un periodo molto breve. Ciò significa gestire le impronte di memoria , facendo uso della memorizzazione nella cache di totali e dati, utilizzando sorgenti di dati scalabili a loro volta, ecc.
Risposta
Se tu fossi creazione di una funzione di ricerca che abbia un buon rendimento quando ha 100 righe nel database da cercare e 10 utenti che la utilizzano contemporaneamente. Qual è il rendimento se 100 utenti la utilizzano contemporaneamente e ci sono 100.000 righe da cercare.
Se esegue lo stesso indipendentemente da cosa, allora è molto buono. Se funziona in modo proporzionale alla quantità di utenti / dati (ovvero 10 volte più dati == 10 volte più tempo per lelaborazione) va bene. Se funziona molto abbassare più dati ha (dati in modalità 10x == 10x ^ 10 più a lungo da elaborare), quindi non si ridimensiona bene.
I miei esempi dovrebbero davvero essere mostrati in notazione Big O ma io cu Raramente non lo so abbastanza bene da scrivere gli esempi in Big O.
Puoi simulare più dati scaricando dati fittizi nel tuo DB e ci sono strumenti per simulare più utenti come Apache AB.