Devido a uma combinação de requisitos de negócios / empresa e as preferências de nosso arquiteto, chegamos a uma arquitetura específica que me parece um pouco complicada, mas eu tenho um conhecimento de arquitetura muito limitado e ainda menos conhecimento em nuvem, portanto, gostaria de uma verificação de sanidade para ver se houver melhorias que possam ser feitas aqui:
Antecedentes: estamos desenvolvendo uma substituição para um sistema existente que é uma reescrita completa desde o início. Isso exige que obtenhamos dados de uma instância do SAP por meio dos serviços da Web BAPI / SOAP, além de usarmos alguns bancos de dados próprios para dados que não estão no SAP. Atualmente, todos os dados que gerenciaremos existem em bancos de dados locais em um aplicativo distribuído ou em um banco de dados MySQL que precisará ser migrado. Precisamos criar um punhado de aplicativos da Web que replicam a funcionalidade do aplicativo distribuído existente, além de fornecer funcionalidades relacionadas a administração sobre os dados que controlamos.
Requisitos de Negócios / Empresa:
Quaisquer bancos de dados que controlamos devem ser implementados no MS SQL Server
Minimize o número de bancos de dados criados
A Fase 1 nos permitirá implantar nossos aplicativos no Azure, mas precisamos da capacidade de colocar esses aplicativos no local no futuro
Nossa equipe de operações deseja que reduzamos o tamanho de tudo que acham que isso facilitará muito o gerenciamento do código.
Minimizar / eliminar a replicação de dados
A pilha de codificação será o .NET Core para microsserviços e aplicativos de administração, mas o Angular 5 para o aplicativo front-end principal.
A partir desses requisitos, nosso arquiteto criou este design:
Nossos front-ends serão alimentados por uma série de microsserviços (eu uso esse termo levemente, pois são de nível 'Domínio' e bastante grandes), que serão divididos em Serviços de Leitura e Serviços de Gravação em cada domínio. Ambos serão escalonáveis e com balanceamento de carga no Kubernetes. Cada um também terá uma cópia somente leitura do banco de dados anexada a eles em seu contêiner, com uma única instância mestre do db disponível para gravações que enviará atualizações para essas cópias somente leitura.
(Desculpe pelas imagens de baixa qualidade, estou refazendo-as de memória, pois, naturalmente, não há documentação real para essas coisas, exceto na cabeça do arquiteto)
A comunicação serviço a serviço ocorrerá através de uma fila de mensagens que cada serviço ouvirá e processará as mensagens relevantes. O principal uso disso será na geração de e-mails, pois ainda não identificamos mais nada que exija serviço a serviço de comunicação de informações ainda. Qualquer coisa relacionada à "lógica de negócios" que exigiria a participação de vários serviços provavelmente fluiria dos front-ends, onde os front-ends chamariam cada serviço individualmente e lidariam com a atomicidade.
Na minha perspectiva, o que me atrapalha de maneira incorreta são as instâncias de banco de dados somente leitura girando dentro dos contêineres do docker para os serviços. O serviço em si e o banco de dados teriam demandas drasticamente diferentes em termos de carga, portanto, faria muito mais sentido se pudéssemos equilibrar a carga separadamente. Eu acredito que o MYSQL tem uma maneira de fazer isso com configurações de mestre / escravo, onde novos escravos podem ser ativados sempre que a carga fica alta. Especialmente enquanto temos nosso sistema na nuvem e pagamos por cada instância, exibir uma nova instância de todo o serviço quando precisamos apenas de outra instância de banco de dados parece um desperdício (assim como o oposto, gerar uma nova cópia de banco de dados quando realmente apenas precisa de uma instância de serviço da web). No entanto, não conheço as limitações do MS SQL Server para isso.
Minha maior preocupação é com a implementação do MS SQL Server. Acoplar as instâncias somente leitura com tanta firmeza aos serviços parece errado. Existe uma maneira melhor de fazer isso?
NOTA: Perguntei isso sobre engenharia de software e eles me indicaram aqui. Desculpe se este não é o SE apropriado.
Também não há tag do MS SQL Server