fbpx
Isso não é microsserviço!
Publicado em: domingo, 21 de jul de 2019

No post passado eu introduzi uma analogia sobre o automobilismo profissional, e como os avanços tecnológicos chegam ao nosso dia-a-dia como consumidores de automotivos, carros de passeio.

Preambulo

A ideia foi contrastar duas realidades: Early Adopters com dinheiro infinito e nós, mundanos com orçamentos apertados.

Esse contraponto tenta trazer para a luz da discussão a lembrança de que Netflix e Amazon são players que podem se dar ao luxo de terem as arquiteturas que têm.

Enquanto isso, nós na tentativa de copiar, fazendo engenharia reversa de suas estratégias, estaremos copiando superficialmente o que nos ressalta aos olhos, ou simplesmente o que é viável.

Se continuarmos a incentivar essa bolha ao redor de Microsserviços, afundemos não só nossos projetos, mas nós mesmos, nossas empresas, e o termo microsserviço será enterrado como SOA foi.

Um novo passo nessa jornada começa agora, dedico esse post à compreensão de um dos principais fatores para o fracasso dos mais variados projetos técnicos:

Incompetência técnica e incapacidade de compreensão.

Sim, é agressivo, mas uma visão míope somada à busca pelo viés de confirmação, tentando achar quem sustente uma ideia que se pareça com a sua, o faz sentir-se cheio de si e firma na sua visão de que seus esforços estão empenhados na direção certa, fazendo a coisa certa.

Se você não conseguir olhar o contraditório, não conseguirá avaliar sua própria decisão. Onde mora a unanimidade, mora a ignorância.

O post

Tudo começa com esse o artigo Microservices do Martin Fowler (Leitura obrigatória para quem quer entender Microsserviços). Dedicarei um post outro inteiro a dissecá-lo. Hoje olhemos para um material um pouco menos denso. Um vídeo da GOTO Conference, realizada em Berlin em 2014.

A apresentação

Vamos começar olhando para as características gerais dos microsserviços:

Componentization via services

3:54

Ao falarmos de Componentização por meio de serviços, precisamos definir o que são Componentes. É aqui reside o primeiro grande dilema de quem não quer entender os conceitos de microsserviços:

Componente são substituíveis e atualizáveis independentemente.

E para isso ser viável, há esforços de engenharia imensos!

Aqui é um dos pontos em que databases compartilhados vão fracassar. É aqui que decisões sobre a infraestrutura errada ou a falta de automação vão fracassar.

Load balancer? Orquestração? DevOps? O que será necessário para que seu serviço de fato seja substituível e atualizável de forma independente e autônoma?

Organized around Business Capabilities

6:37

8:15 – Microservices rejeitam a o approach centralizador dos ESB’s

Quando olhamos para nosso código, quando olhamos para os nossos deployments, nossas solutions e até nossos repositórios GIT, vemos uma divisão bem radical em relação ao que observávamos em uma arquitetura monolítica.

A forma como agrupamos, organizamos e gerenciamos serviços muda, e a palavra de ordem aqui é independência e autonomia.

Decentralized Data Management

9:20

Pelo ponto de vista de microsserviços, ele diz não (em contraponto aos monolitos), cada serviço é responsável pelos seus próprios dados e por sua própria persistência… Você nunca fala com o data store de outro serviço a não ser via sua API.

Pelo ponto de vista de microsserviços, ele diz não (em contraponto aos monolitos), cada serviço é responsável pelos seus próprios dados e por sua própria persistência… Você nunca fala com o data store de outro serviço a não ser via sua API.
Martin Fowler

Mas eu li que Shared Database é um pattern…

Um dos principais contrapontos que recebo sobre o tema está relacionando ao “Pattern: Shared database” que o Chris Richardson documentou em microservices.io (link).

Se você acha esse argumento válido para continuar compartilhando databases e considera que está trabalhando com microsserviços, leia isso:

É o comentário do autor do post. Resolvi tirar o print, pois a ferramenta de comentários utilizada no blog é externa, pode em alguns anos não estar mais no ar e não gostaria de perder isso.

Infrastructure Automation

11:22

Pra fazer tudo isso funcionar, é realmente importante que haja automação de infraestrutura. Várias coisas como Continous Delivery, técnicas como Blue/Green Deployment que permite por coisas online com zero downtime. Esses tipos de coisas são obrigatórios também para colocar este tipo projeto para rodar, porque você está falando sobre construir o que seria uma aplicação como uma dúzia ou duas dúzias de serviços, por isso é muito importante que você tenha uma maneira muito automatizada de fazer essas coisas rodarem.
Martin Fowler

Aqui estamos falando do que muita gente chama de DevOps. Eu não compartilho dessa visão e pelo título do tópico, dado pelo Fowler, aparentemente ele também não compartilha dessa visão.

Em um cenário de microsserviços, fazer deploy manual, seja usando o publish do visual studio não é uma estratégia inteligente. Aliás, ela te trará impactos muito negativos para seu desenho de microsserviços.

Design for failure

12:11

A premissa de que há a necessidade de isolamento dos componentes da arquitetura em deployments independentes nos traz problemas adjacentes. A distribuição de aplicações e a necessidade de comunicação entre elas produz falhas que antes não existiam.

Você nunca precisou testar conectividade ente uma classe A que chama um método da classe B em um monólito. Isso nunca causou falha antes. Mas ao passo que estar remoto nos coloca em uma situação onde falhar é uma possibilidade, quase uma certeza.

A gente encontra não só mensageria como solução, mas também engenharia de caos para produzir falhas ao ponto de conseguirmos avaliar o comportamento dos nossos serviços diante de falhas.

Microservice e SOA

13:23

Você precisa fazer isso tudo para usar microsserviços

E não para por aí. Essa apresentação é incrível e deveria ser exibida como conteúdo introdutório ao assunto. Deveria ser assistida cada vez que se fala em compartilhamento de dados de serviço via banco.

Tanto a apresentação como o texto são incríveis pois apresentam tradeoffs  a respeito da utilização de microsserviços, apontam claramente algumas das complexidades inerentes a esse desenho.

Microsserviços é complexo, um grande problema que vejo repetidamente, hoje, ao redor do assuntos é o olhar simplista, ingênuo e permissivo sobre Componentization via services. Sobre termos como independently replaceable and upgradeable e principalmente, suas conseqüências práticas. Não consigo ver esse tipo de arquitetura trabalhando sem um Event Stream, por exemplo.

Essa permissividade, que facilmente pode ser encontrara em quem se diz fazendo microsserviços com um banco monolítico, produz aberrações que vão na contramão daquilo que toda essa complexidade se preza a resolver:

  • Deploys parciais, independentes e mais frequentes.
  • Alta disponibilidade
  • Modularidade

Conclusão

Microservices ou é necessidade fundamental, ao ponto de sua empresa ou projeto não sobreviver sem.

Ou é desnecessário!

Se inspirar em microsserviços e fazer o que é viável ou o que lhe traz maior resultado é completamente diferente de fazer algo pela metade, que não traz nem de longe metade dos benefícios, e no final dizer que usa microsserviços só para “fazer parte do clubinho”.

Outro ponto relevante: Microsserviços é mais caro, exige mão de obra especializada e Highlanders Full Stack. Suspeite de quem te vende alocação e quer te convencer a usar microsserviços, vendendo como se fosse um passaporte para a terra do nunca. Se você não tem budget para isso tudo, você não tem demanda para isso tudo!

O Cloud Native .NET é meu principal projeto.

Onde empenho energia para ajudar, acompanhar, direcionar Desenvolvedores, Líderes Técnicos e jovens Arquitetos na jornada Cloud Native.

Conduzo entregando a maior e mais completa stack de tecnologias do mercado.

Ao trabalhar com desenvolvedores experientes, eu consigo usar seu aprendizado com .NET, banco de dados, e arquitetura para encurtar a jornada.

Ao restringir à desenvolvedores .NET eu consigo usar do contexto de tecnologias e problemas do seu dia-a-dia, coisas que você conhece hoje, como WCF, WebForms, IIS e MVC, por exemplo, para mostrar a comparação entre o que você conhece e o que está sendo apresentado.

É assim que construímos fundamentos sólidos, digerindo a complexidade com didática, tornando o complexo, simples.

É assim que conseguimos tornar uma jornada densa, em um pacote de ~4 meses.

Eu não acredito que um desenvolvedor possa entender uma tecnologia sem compreender seus fundamentos. Ele no máximo consegue ser produtivo, mas isso não faz desse desenvolvedor um bom tomador de decisões técnicas.

É preciso entender os fundamentos para conseguir tomar boas decisões.

4 Comentários

  1. ALEXANDRE SOARES PAIVA

    Aprender certo para usar certo, quando necessário. Excelente trabalho. Tua preocupação em proteger a arquitetura de microservices é louvável, e educar os arquitetos com os conceitos e técnicas corretas é uma luta que precisa de apoio cada vez que uma nova tecnologia surgir. Tua maturidade para falar sobre estes assuntos e tocar no ponto crucial para a arquitetura é de alto valor.

    Responder
    • Luiz Carlos Faria

      Massa Paiva, obrigado amigo!
      É essa a tentativa, porque as discussões precisam sair da página 1. Nós, enquanto comunidade, estamos presos em narrativas e falácias, estamos buscando o novo, mas na prática muita gente não se dá conta do que frases simples produzem de impacto real, no código, no projeto, no versionamento, na gerência de configuração, deployment…

      E não se dão conta que na real, microservices não é uma decisão do CTO pra baixo.

      Vai além, vai até quem paga a conta…

      Responder
  2. Junior Grão

    Fala meu amigo, ótimas observações e parabéns pelo artigo.

    Trabalho numa empresa fora do país onde definimos e criamos todo o ecossistema de projetos baseada em micro-serviços e usamos AWS como IaaS.

    2 anos após sua implementação, temos uma estrutura muito robusta e, ao mesmo tempo, complexa e apesar de quase tudo ser automatizado, é de longe fácil de gerenciar. A cada novo ambiente criado, é uma dor de cabeça para se manter tudo funcionando num curto espaço de tempo, tamanha é a quantidade de serviços de nuvem que precisa ser clonado e provisionado.

    Por um lado você proporciona a empresa a possibilidade de escalar seus projetos de maneira eficiente, por outro você percebe que o budget disponível não é infinito, como você bem cita no artigo, e toda essa infraestrutura muita das vezes fica mais cara que o valor que se tem disponível para investir na empresa.

    Outro desafio é entender qual o nível de granularidade de informação você deseja criar para seus micro-serviços, falando o português mais claro, quantos micro-serviços é preciso para dividir bem o contexto do seu negócio.

    Você percebe que isso está mal organizado entre os micro-serviços quando você precisa trabalhar com mais redundância de dados do que gostaria, dados do micro-serviços A está no B, C, D, E, e vice-versa. O mal uso dessa abordagem pode incorrer em dados inconsistentes bem facilmente e para o desenvolvedor, pode perder a referência da origem daquela informação.

    Responder
    • Luiz Carlos Faria

      A ideia é muito mais servir de alerta, chamar a atenção para pontos importantes.

      Responder

Enviar um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

[docker de a a z]

Lives

Fique de olho nas lives

Fique de olho nas lives no meu canal do Youtube, no Canal .NET e nos Grupos do Facebook e Instagram.

Aceleradores

Existem diversas formas de viabilizar o suporte ao teu projeto. Seja com os treinamentos, consultoria, mentorias em grupo.