TLDR: il ridimensionamento non è possibile per gli algoritmi sequenziali o i dati atomici e può essere un cattivo modo per spendere un budget di sviluppo.
Come altri hanno sottolineato, gli algoritmi sequenziali non possono essere ridimensionati. Un esempio potrebbe essere l'elaborazione di transazioni finanziarie, in cui le transazioni devono essere applicate nell'ordine corretto. Tuttavia, nel tipico scenario CRUD è improbabile che tu possa imbatterti in algoritmi sequenziali di lunga durata, quindi la mia risposta sarà indirizzata a casi in cui non hai a che fare con un tale algoritmo sequenziale.
La chiave per ridimensionare è evitare il lavoro di sincronizzazione tra i server, perché è il lavoro di sincronizzazione che introduce i colli di bottiglia man mano che si ridimensionano. Ad esempio, i server delle applicazioni possono evitare di archiviare i dati localmente, recuperando tutto ciò che è fresco dal livello del database per ogni richiesta. In questo modo, nessun dato deve essere sincronizzato tra i server delle applicazioni (ad esempio i dati della sessione). Un altro esempio è la condivisione dei database, in cui diversi server di database contengono parti diverse dei dati, il che significa che non è necessario alcun lavoro di sincronizzazione tra questi server.
Quindi, la risposta è che anche nei casi in cui non vi sono colli di bottiglia algoritmici per ridimensionare ci sono situazioni in cui la riduzione non è possibile, e questi hanno a che fare con l'atomicità dei dati. Se hai a che fare con un insieme di dati che non possono essere condivisi e devono essere condivisi tra i nodi per implementare la tua logica (es. Un grafico sociale non divisibile), allora l'unica opzione è scalare: un grande server che contiene invece l'intero set di dati di un gruppo di piccoli che hanno ciascuno un sottosegmento. Queste situazioni sono comunque piuttosto rare, quindi nella maggior parte dei casi il software può essere progettato per essere ridimensionato, a condizione che il progetto tenga conto di ciò sin dall'inizio.
Un'altra cosa da tenere in considerazione è il costo del design. La progettazione per il ridimensionamento aumenta il costo di sviluppo. Ad esempio, lo sharding del database richiede una logica a livello di applicazione aggiuntiva per gestire i frammenti. Per questo motivo, ha senso scegliere consapevolmente di scalare, in particolare a livello di DB. Per un esempio, guarda il sito che stai guardando in questo momento.