Perché ne abbiamo bisogno?
L'enorme vantaggio dei microservizi - e più in gran parte, della SOA - è l'alto livello di astrazione degli interni - non solo l'implementazione, ma anche le tecnologie utilizzate. Ad esempio, se un sistema è sviluppato in una forma di cinque microservizi da cinque team, un team può decidere di passare a uno stack tecnologico completamente diverso (ad esempio dallo stack Microsoft a LAMP) senza nemmeno chiedere ad altri team la propria opinione.
Guarda Amazon AWS o Twilio. Sai se i loro servizi sono implementati in Java o Ruby? Usano Oracle o PostgreSQL o Cassandra o MongoDB? Quante macchine usano? Ti importa anche di questo; in altre parole, quelle scelte tecnologiche stanno influenzando il modo in cui usi quei servizi? ... E ancora più importante, se si spostano in un database diverso, dovresti cambiare di conseguenza la tua applicazione client?
Ora, cosa succede se due servizi utilizzano lo stesso database? Ecco una piccola parte dei problemi che possono sorgere:
Il team che sviluppa il servizio 1 desidera passare da SQL Server 2012 a SQL Server 2016. Tuttavia, il team 2 si affida a una funzionalità obsoleta che è stata rimossa in SQL Server 2016.
Il servizio 1 è un enorme successo. Ospitare il database su due macchine (master e failover) non è più un'opzione. Ma il ridimensionamento del cluster su più macchine richiede strategie come lo sharding. Nel frattempo, il team 2 è soddisfatto dell'attuale scala e non vede alcun motivo per passare a qualcos'altro.
Il servizio 1 dovrebbe passare a UTF-8 come codifica predefinita. Il servizio 2, tuttavia, è soddisfatto dell'uso della pagina codice 1252 Windows Latin 1.
Il servizio 1 decide di aggiungere un utente con un nome specifico. Tuttavia, questo utente esiste già, creato alcuni mesi fa dal secondo team.
Il servizio 1 richiede molte funzionalità diverse. Il servizio 2 è un componente estremamente critico e deve ridurre al minimo le funzionalità del database per ridurre il rischio di attacchi.
Il servizio 1 richiede 15 TB di spazio su disco; la velocità non è importante, quindi i normali dischi rigidi vanno benissimo. Il servizio 2 richiede al massimo 50 GB, ma deve accedervi il più rapidamente possibile, il che significa che i dati devono essere archiviati su un SSD.
...
Ogni piccola scelta riguarda tutti. Ogni decisione deve essere presa in modo collaborativo, da persone di ogni squadra. I compromessi devono essere fatti. Confrontalo con una completa libertà di fare quello che vuoi in un contesto di SOA.
è troppo [...] ingestibile.
Allora stai sbagliando. Suppongo che stai distribuendo manualmente .
Non è così che dovrebbero essere fatte le cose. È necessario automatizzare la distribuzione di macchine virtuali (o contenitori Docker) che eseguono il database. Una volta automatizzati, la distribuzione di due server o venti server o duemila server non è molto diversa.
La cosa magica dei database isolati è che è estremamente gestibile . Hai provato a gestire un enorme database utilizzato da dozzine di team? È un incubo. Ogni squadra ha richieste specifiche e non appena tocchi qualcosa, ciò influisce su qualcuno. Con un database associato a un'app, l'ambito diventa molto ristretto, il che significa che ci sono molte meno cose a cui pensare.
Se un enorme database richiede amministratori di sistema specializzati, i database utilizzati da un solo team possono essenzialmente essere gestiti da questo team (DevOps è anche questo), liberando il tempo degli amministratori di sistema.
è troppo costoso
Definire il costo.
I costi di licenza dipendono dal database. Nell'era del cloud computing, sono abbastanza sicuro che tutti i principali attori hanno riprogettato le loro licenze per adattarsi al contesto in cui invece di un enorme database ce ne sono molti di piccole dimensioni. In caso contrario, è possibile passare a un altro database. A proposito, ce ne sono molti open source.
Se stai parlando di potenza di elaborazione, sia le macchine virtuali che i contenitori sono compatibili con la CPU e non sarei molto sicuro che un enorme database consumerà meno CPU rispetto a molti di quelli piccoli che fanno lo stesso lavoro.
Se il tuo problema è la memoria, le macchine virtuali non sono una buona scelta per te. I contenitori sono. Sarai in grado di estendere quanti ne vuoi, sapendo che non consumeranno più RAM del necessario. Mentre il consumo totale di memoria sarà maggiore per molti database di piccole dimensioni rispetto a uno grande, suppongo che la differenza non sarà troppo importante. YMMV.