Apresentando o projeto e a solução
Vamos conhecer o projeto com o qual trabalharemos neste curso. Solicitamos que baixem em suas máquinas a solução que temos aberta no Visual Studio e faremos uma visão geral dessa solução.
A solução está organizada em dois projetos. O projeto médicos.service.api é o foco do nosso curso. Há outro projeto chamado Vomad Web, que é uma interface web que consome essa API. Não trabalharemos com esse projeto, mas ele demonstra que existe uma aplicação cliente que consome essa API. Outras aplicações clientes, como aplicações desktop e mobile, também podem consumir a mesma API. Nós, como pessoas desenvolvedoras da Vomad, daremos manutenção na API médicos.service.api.
Executando a API e explorando seus recursos
Para executar essa API, no Visual Studio, utilizamos o botão verde ou o atalho Ctrl + F5, garantindo que o projeto médicos.service.api esteja marcado como inicialização. Ao clicar no triângulo verde, apenas a API será executada. Isso abrirá uma janela do terminal, onde alguns comandos SQL serão executados para migração e inclusão automática de registros. Este não é um projeto para produção, mas deixamos assim para termos dados com os quais trabalhar.
Além da janela do terminal, uma janela no navegador será aberta com a documentação da API, a famosa página do Swagger. Essa página mostra os recursos que a API está expondo: consulta, médico e paciente. Esses recursos representam as funcionalidades que a Vomad está mantendo atualmente.
Detalhando os recursos da API
O recurso de consulta permite que pessoas atendentes e pacientes realizem agendamentos. Há um post para salvar consultas, onde se aloca um médico de uma especialidade a um paciente em um horário específico. É possível consultar, alterar, excluir ou cancelar agendamentos.
Também temos a gestão de médicos, onde podemos incluir novos médicos, alterar informações cadastrais, e o mesmo se aplica a pacientes. Podemos alterar dados cadastrais, como e-mail, endereço e celular, além de mudar o contato do paciente.
Importando pacientes em lote e simulando operações simultâneas
Um endpoint importante é o de importação de pacientes em lote. Um dos objetivos do negócio Vomad é aumentar a base de pacientes para alocá-los aos médicos através das consultas. Quanto mais pacientes, melhor para o negócio, indicando crescimento. O post de importação em lote simula essa funcionalidade, permitindo importar pacientes fictícios. Ao executar, ele responde com sucesso, indicando a importação de pacientes.
Imaginemos que essa API serve diversos clientes. Mostramos a interface web, mas podemos ter vários tipos de clientes. Por exemplo, uma interface no consultório médico para agendar consultas de pacientes que chegam, às vezes com emergência. A pessoa atendente consulta a agenda do médico para alocar um horário.
Observando o impacto de operações simultâneas
Simultaneamente, um usuário administrativo ou de suporte pode usar a mesma API para incluir pacientes em lotes. Vamos simular essas duas operações em conjunto para observar o que pode ocorrer nesse cenário comum.
Abriremos mais uma aba com a página do Swagger para simular as duas operações simultaneamente. De um lado, faremos a consulta, e do outro, a importação em lote de pacientes. Ao executar, a pessoa do suporte importa o arquivo no endpoint de importação, enquanto a atendente verifica a consulta do médico. Notamos que a verificação de agendamento só retorna o resultado após a conclusão da importação em lote, causando demora na resposta.
Discutindo problemas de acoplamento e arquitetura monolítica
Vamos simular uma importação maior, com 5 mil pacientes, e observar que a atendente continua esperando. Existe um impacto entre o endpoint de importação de pacientes e a consulta de agendamentos de médicos, um influenciando o outro. Queremos trazer essa discussão e reflexão sobre o que está acontecendo. Nossa API fornece três recursos: consultas, médicos e pacientes.
O problema que demonstramos, um problema comum de lock no banco de dados, ocorre devido ao forte acoplamento entre três recursos distintos do negócio. Essas partes têm características diferentes: consultas precisam estar disponíveis 24 horas por dia, 7 dias por semana, devido à necessidade de agendar pacientes em emergências, enquanto a parte de pacientes e médicos não é tão crítica. É importante destacar essa diferença. No entanto, existe um forte acoplamento entre esses três componentes ou módulos.
Explorando limitações da arquitetura monolítica
Isso acontece porque temos uma arquitetura monolítica, que junta todas essas partes em uma única aplicação. Essa mistura pode gerar código desorganizado, com referências desnecessárias entre áreas específicas do código. As funções de negócio estão misturadas em uma única aplicação e um único banco de dados, o que causa problemas de travamento. Embora essa abordagem ofereça simplicidade e integridade referencial, ela também traz acoplamento entre tabelas e estruturas.
A arquitetura monolítica apresenta várias limitações. Uma delas é o autoacoplamento, que pode causar impacto em diferentes partes do sistema, como o lock que ocorreu. Além disso, ao modificar o código, podemos introduzir defeitos em outras áreas se o código não estiver bem organizado. Outras limitações incluem a dificuldade de escalar a aplicação, já que é um único executável. Se as consultas aumentarem, precisamos escalar também para médicos e pacientes.
Considerando alternativas e o triângulo do sucesso
O deploy possui alto risco, pois uma atualização em uma funcionalidade pode causar indisponibilidade em outra parte do sistema. As atualizações são complexas, pois a parte de consultas, que é crítica, precisa estar sempre atualizada, enquanto pacientes e médicos podem atrasar essa atualização. Além disso, há uma dificuldade organizacional em dividir a aplicação em times funcionais independentes, pois a comunicação entre eles precisa ser mantida.
Essas limitações impactam a agilidade do negócio em implementar decisões estratégicas. A arquitetura monolítica pode ser comparada a um grande cargueiro, eficiente e simples, mas lento para mudanças de rota e sujeito a bloqueios em caso de problemas. A alternativa é uma frota de lanchas pequenas e rápidas, que representam a arquitetura de micro-serviços. Essa abordagem divide a solução em componentes menores e autônomos, permitindo maior agilidade e resiliência.
Chris Richardson, em seu livro, fala sobre o triângulo do sucesso, que inclui arquitetura, processo e organização. A arquitetura de micro-serviços habilita um design organizacional com times interdependentes e um processo mais ágil, resultando em uma entrega de valor rápida, frequente e confiável.
Concluindo e preparando para o próximo passo
O objetivo não é convencer a adotar exclusivamente micro-serviços, mas sim perceber o equilíbrio e tomar decisões importantes para o projeto. A arquitetura de micro-serviços oferece agilidade, mas com maior complexidade de comunicação. Já o monolito garante eficiência e simplicidade, mas pode ser lento para implementar decisões estratégicas. É importante entender qual arquitetura se adequa melhor ao processo.
No próximo passo, vamos discutir uma arquitetura de micro-serviços para a Avonmed. Nos vemos lá.