Estou pensando em mudar uma API REST monolítica para uma arquitetura de microsserviço e estou ficando um pouco confuso sobre o armazenamento de dados. A meu ver, alguns dos benefícios dos microsserviços seriam:
- Escalonável horizontalmente - posso executar várias cópias redundantes de um microsserviço para lidar com a carga e / ou com o servidor inoperante.
- Fracamente acoplado - posso alterar implementações internas de microsserviços sem precisar alterar as outras, e posso implantá-las e alterá-las independentemente, etc ...
Meu problema é com armazenamento de dados. A meu ver, existem várias opções:
- Um único serviço de banco de dados compartilhado por todos os microsserviços - isso parece eliminar completamente qualquer benefício do acoplamento flexível.
- Uma instância de banco de dados instalada localmente em cada microsserviço - não vejo uma maneira de dimensionar horizontalmente isso, então não acho que seria uma opção.
- Cada microsserviço possui seu próprio serviço de banco de dados - isso parece o mais promissor, pois preserva os benefícios do acoplamento flexível e do dimensionamento horizontal (usando cópias de banco de dados redundantes e / ou sharding em vários)
Para mim, a terceira opção parece ser a única opção, mas parece incrivelmente pesada para mim, e uma solução muito superengenharia. Se estou entendendo direito, para um aplicativo simples com 4-5 microsserviços, eu precisaria executar 16 a 20 servidores - duas instâncias reais de microsserviço por microsserviço (em caso de falha do servidor e para implantação sem tempo de inatividade) e duas instâncias de serviço de banco de dados por microsserviço (em caso de falha do servidor etc ...).
Francamente, isso parece um pouco ridículo. 16-20 servidores para executar uma API simples, tendo em mente que um projeto realista provavelmente terá mais de 4-5 serviços? Existe algum conceito fundamental que me falta que explique isso?
Algumas coisas que podem ajudar ao responder:
- Sou o único desenvolvedor deste projeto e será no futuro próximo.
- Estou usando o Node.js e o MongoDB, mas estaria interessado em respostas independentes de idioma - uma resposta pode até ser que eu esteja usando as tecnologias erradas!