Sto considerando di spostare un'API REST monolitica in un'architettura a microservizi e mi sto confondendo un po 'sull'archiviazione dei dati. A mio avviso, alcuni dei vantaggi dei microservizi sarebbero:
- Scalabile orizzontalmente: posso eseguire più copie ridondanti di un microservizio per far fronte al carico e / o al malfunzionamento di un server.
- Liberamente accoppiati: posso cambiare le implementazioni interne dei microservizi senza dover cambiare gli altri e posso implementarli e cambiarli in modo indipendente, ecc.
Il mio problema è con l'archiviazione dei dati. A mio avviso, ci sono diverse opzioni:
- Un unico servizio di database condiviso da tutti i microservizi: ciò sembrerebbe eliminare completamente qualsiasi vantaggio derivante dall'accoppiamento libero.
- Un'istanza di database installata localmente su ciascun microservizio: non riesco a vedere un modo per ridimensionare orizzontalmente questo, quindi non penso che sarebbe un'opzione.
- Ogni microservizio ha il proprio servizio di database - questo sembra il più promettente, in quanto preserva i vantaggi dell'accoppiamento lento e del ridimensionamento orizzontale (usando copie di database ridondanti e / o sharding tra più)
Per me, la terza opzione sembra essere l'unica, ma mi sembra incredibilmente pesante e una soluzione molto ingegnosa. Se lo capisco bene, quindi per una semplice applicazione con 4-5 microservizi dovrei eseguire 16-20 server - due istanze effettive di microservizi per microservizio (in caso di guasto del server e per la distribuzione senza tempi di inattività), e due istanze del servizio di database per microservizio (in caso di errore del server ecc ...).
Questo, francamente, sembra leggermente ridicolo. 16-20 server per eseguire una semplice API, tenendo presente che un progetto realistico avrà probabilmente più di 4-5 servizi? C'è qualche concetto fondamentale che mi manca che spiegherà questo?
Alcune cose che possono essere utili durante la risposta:
- Sono l'unico sviluppatore di questo progetto e lo sarà per il prossimo futuro.
- Sto usando Node.js e MongoDB, ma sarei interessato a risposte indipendenti dalla lingua - una risposta potrebbe anche essere che sto usando solo le tecnologie sbagliate!