Le reti interne utilizzano spesso connessioni a 1 Gbps o più veloci. Le connessioni in fibra ottica o il collegamento consentono larghezze di banda molto più elevate tra i server. Ora immagina la dimensione media di una risposta JSON da un'API. Quante di queste risposte possono essere trasmesse su una connessione da 1 Gbps in un secondo?
Facciamo davvero la matematica. 1 Gbps è 131 072 KB al secondo. Se una risposta JSON media è di 5 KB (il che è abbastanza!), Puoi inviare 26 214 risposte al secondo attraverso il filo con solo una coppia di macchine . Non male, vero?
Questo è il motivo per cui la connessione di rete di solito non è il collo di bottiglia.
Un altro aspetto dei microservizi è che puoi ridimensionare facilmente. Immagina due server, uno che ospita l'API, un altro che la consuma. Se mai la connessione diventa il collo di bottiglia, aggiungi solo altri due server e puoi raddoppiare le prestazioni.
Questo è quando le nostre precedenti 26 214 risposte al secondo diventano troppo piccole per la scala dell'app. Aggiungete altre nove coppie e ora siete in grado di servire 262 140 risposte.
Ma torniamo alla nostra coppia di server e facciamo alcuni confronti.
Se una query media non memorizzata nella cache in un database impiega 10 ms., Hai un limite di 100 query al secondo. 100 query. 26 214 risposte. Raggiungere la velocità di 26 214 risposte al secondo richiede una grande quantità di memorizzazione nella cache e ottimizzazione (se la risposta deve effettivamente fare qualcosa di utile, come interrogare un database; le risposte in stile "Hello World" non si qualificano).
Sul mio computer, in questo momento, DOMContentLoaded per la home page di Google è successo 394 ms. dopo l'invio della richiesta. Sono meno di 3 richieste al secondo. Per la home page di Programmers.SE, è successo 603 ms. dopo l'invio della richiesta. Non sono nemmeno 2 richieste al secondo. A proposito, ho una connessione Internet a 100 Mbps e un computer veloce: molti utenti aspetteranno più a lungo.
Se il collo di bottiglia è la velocità di rete tra i server, quei due siti potrebbero letteralmente fare migliaia di chiamate a diverse API mentre servono la pagina.
Questi due casi mostrano che la rete probabilmente non sarà il tuo collo di bottiglia in teoria (in pratica, dovresti fare i benchmark effettivi e la profilazione per determinare la posizione esatta del collo di bottiglia del tuo particolare sistema ospitato su un particolare hardware). Il tempo impiegato per svolgere il lavoro effettivo (che si tratti di query SQL, compressione o altro) e di inviare il risultato all'utente finale è molto più importante.
Pensa ai database
Di solito, i database sono ospitati separatamente dall'applicazione Web che li utilizza. Ciò può destare preoccupazione: che dire della velocità di connessione tra il server che ospita l'applicazione e il server che ospita il database?
Sembra che ci siano casi in cui, in effetti, la velocità di connessione diventa problematica, cioè quando si archiviano enormi quantità di dati che non devono essere elaborati dal database stesso e dovrebbero essere disponibili in questo momento (ovvero file binari di grandi dimensioni). Ma tali situazioni sono rare: nella maggior parte dei casi, la velocità di trasferimento non è così grande rispetto alla velocità di elaborazione della query stessa.
Quando la velocità di trasferimento in realtà è importante quando un'azienda sta ospitando grandi set di dati su un NAS e al NAS si accede da più client contemporaneamente. Qui è dove una SAN può essere una soluzione. Detto questo, questa non è l'unica soluzione. I cavi Cat 6 possono supportare velocità fino a 10 Gbps; l'incollaggio può anche essere usato per aumentare la velocità senza cambiare i cavi o gli adattatori di rete. Esistono altre soluzioni che prevedono la replica dei dati su più NAS.
Dimentica la velocità; pensa alla scalabilità
Un punto importante di un'app Web è la possibilità di ridimensionare. Mentre le prestazioni effettive contano (perché nessuno vuole pagare per server più potenti), la scalabilità è molto più importante, perché ti consente di gettare hardware aggiuntivo quando necessario.
Se disponi di un'app non particolarmente veloce, perderai denaro perché avrai bisogno di server più potenti.
Se disponi di un'app veloce che non può essere ridimensionata, perderai clienti perché non sarai in grado di rispondere a una domanda crescente.
Allo stesso modo, dieci anni fa le macchine virtuali erano percepite come un enorme problema di prestazioni. In effetti, l'hosting di un'applicazione su un server anziché l'hosting su una macchina virtuale ha avuto un impatto importante sulle prestazioni. Mentre il divario è molto più piccolo oggi, esiste ancora.
Nonostante questa perdita di prestazioni, gli ambienti virtuali sono diventati molto popolari a causa della flessibilità che offrono.
Come con la velocità della rete, potresti scoprire che la VM è il vero collo di bottiglia e, data la tua scala effettiva, risparmierai miliardi di dollari ospitando la tua app direttamente, senza le VM. Ma questo non è ciò che accade per il 99,9% delle app: il loro collo di bottiglia è da qualche altra parte e l'inconveniente di una perdita di alcuni microsecondi a causa della VM è facilmente compensato dai benefici dell'astrazione e della scalabilità dell'hardware.