Why do we even need it?
L'enorme vantaggio dei microservizi - e più in gran parte, SOA - è l'alto livello di astrazione degli interni: non solo l'implementazione, ma anche le tecnologie utilizzate. Ad esempio, se un sistema viene sviluppato in 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, sono quelle scelte tecnologiche che influenzano il modo in cui si utilizzano quei servizi? ... E ancora più importante, se si spostano in un altro database, dovresti cambiare la tua applicazione client di conseguenza?
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 basa su una funzionalità obsoleta rimossa in SQL Server 2016.
-
Il servizio 1 è un enorme successo. L'hosting del database su due macchine (master e failover) non è più un'opzione. Ma ridimensionare il cluster su più macchine richiede strategie come lo sharding. Nel frattempo, la squadra 2 è soddisfatta della scala attuale e non vede alcun motivo per passare a qualsiasi altra cosa.
-
Il servizio 1 dovrebbe passare a UTF-8 come codifica predefinita. Il servizio 2, tuttavia, è felice di utilizzare Code Page 1252 Windows Latin 1.
-
Il servizio 1 decide di aggiungere un utente con un nome specifico. Tuttavia, questo utente esiste già, creato pochi mesi fa dal secondo team.
-
Il servizio 1 ha bisogno di molte caratteristiche diverse. Service 2 è un componente estremamente critico e deve mantenere le funzionalità del database al minimo per ridurre il rischio di attacchi.
-
Il servizio 1 richiede 15 TB di spazio su disco; la velocità non è importante, quindi gli hard disk ordinari sono perfettamente a posto. Il servizio 2 richiede al massimo 50 GB, ma deve accedervi il più velocemente possibile, il che significa che i dati devono essere memorizzati su un SSD.
-
...
Ogni piccola scelta colpisce tutti. Ogni decisione deve essere presa in collaborazione, da persone di ogni squadra. I compromessi devono essere fatti. Confrontalo con una completa libertà per fare ciò che vuoi in un contesto SOA.
it's too [...] unmanageable.
Allora stai sbagliando. Suppongo che tu stia implementando manualmente .
Questo non è il modo in cui le cose dovrebbero essere fatte. È 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, colpisce 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 che sono utilizzati da un solo team possono essenzialmente essere gestiti da questo team (DevOps è anche a riguardo), liberando il tempo degli amministratori di sistema.
it's too costly
Definisci costo.
I costi di licenza dipendono dal database. Nell'era del cloud computing, sono abbastanza sicuro che tutti i principali attori hanno ridisegnato le loro licenze per adattarsi al contesto in cui invece di un enorme database ci sono molti piccoli. In caso contrario, si può prendere in considerazione il passaggio a un altro database. Tra l'altro, ci sono un sacco di open source.
Se parli di potenza di elaborazione, sia le macchine virtuali sia i contenitori sono ottimizzati per la CPU, e non sarei molto affermativo sul fatto che un enorme database consuma meno CPU di molti piccoli che fanno lo stesso lavoro.
Se il tuo problema è la memoria, allora le macchine virtuali non sono una buona scelta per te. I contenitori sono Sarete in grado di estendervi quante ne volete, sapendo che non consumeranno più RAM del necessario. Mentre il consumo totale di memoria sarà maggiore per molti piccoli database rispetto a uno grande singolo, suppongo che la differenza non sarà troppo importante. YMMV.