Executando verificação de segurança...
11

O Hype dos microserviços (Falei to leve)

Ah, o pessoal que adora falar de microserviços sem realmente entender o que estão dizendo. São como gurus da sabedoria tecnológica, proclamando os benefícios divinos dos microserviços enquanto ainda estão tentando descobrir como fazer um deploy bem-sucedido.

Eles se reúnem em seus círculos de "culto aos microserviços", onde o mantra é "Escalabilidade! Resiliência! Agilidade!" - como se essas palavras mágicas fossem suficientes para resolver todos os problemas do universo da programação.

Você pode reconhecê-los pelo brilho nos olhos quando falam sobre desacoplamento e isolamento de responsabilidades. Parece que estão prestes a ascender a um nível superior de consciência, mas na verdade, estão apenas tentando disfarçar o fato de que ainda estão tentando descobrir como lidar com o monólito legado.

E quando você pergunta a eles sobre os verdadeiros desafios e complexidades dos microserviços, eles respondem com frases vagas e evasivas, como se estivessem recitando um poema filosófico que só eles entendem. Na verdade, estão apenas esperando que você não perceba que ainda estão tentando descobrir como garantir a consistência entre os serviços.

Ah, os entusiastas dos microserviços, esses verdadeiros mestres do "falar muito e fazer pouco". A próxima vez que você os ouvir exaltando as virtudes dos microserviços, apenas dê um sorriso compreensivo e concorde, sabendo que, no fundo, estão todos perdidos em um labirinto de contêineres e documentação confusa.

Carregando publicação patrocinada...
4

Microserviços são a ideia certa, feitos do jeito errado. Será que eu li isso aqui? O problema não são os microserviços per si, mas a complexidade desnecessária que as pessoas adicionam aos seus projetos. Não é porque todas as grandes empresas tecnologias usam, que você deve usar também. Eles precisam de toda essa complexidade, você não.

O que faz sentido, porém, é criar programas que façam uma coisa bem feita e que trabalhem bem com outros programas, a boa e velha filosofia unix:

  1. Make each program do one thing well. To do a new job, build afresh rather than complicate old programs by adding new "features".

  2. Expect the output of every program to become the input to another, as yet unknown, program.

Essa é a essência do que os microservices deveriam ser, não sistemas distríbuidos.

A tese A Note on Distributed Computing, escrito por pesquisadores da Sun é uma leitura essencial para qualquer pessoa interessada em compreender os desafios fundamentais da computação distribuída. Publicado no início dos anos 90, esse trabalho seminal destaca as diferenças cruciais entre programação local e distribuída, argumentando que construir sistemas distribuídos corretamente — seja em termos de desempenho, confiabilidade, escalabilidade, ou qualquer outro critério de "correto" — é notoriamente difícil.

Importante destacar, esse trabalho introduziu as "Falácias da Computação Distribuída", que são suposições errôneas que desenvolvedores frequentemente fazem ao projetar sistemas distribuídos. Quase todos que embarcam na jornada dos microserviços parecem não ter aprendido essas lições, ignorando coisas como latência e falhas de comunicação.

E mesmo que você acerte, e que a adoção de microservices traga vantagens significativas em termos de agilidade, resiliência e escalabilidade, ela invariavelmente introduz muita complexidade. Esta complexidade não deve ser subestimada. Quase sempre as dificuldades de gerenciar uma arquitetura distrubída é desproporcional as suas vantagens.

Na maioria dos cenários uma abordagem modular, inspirada na filosofia Unix, oferece as mesmas vantagens. Isso não apenas simplifica o desenvolvimento e a manutenção, mas também mantém a equipe focada em entregar valor de forma eficiente, sem se perder na gestão de uma arquitetura distribuída (e portanto) complexa.

Existe uma frase famosa que resume tudo: "Você não constrói um sistema distribuído a menos que você absolutamente precise dele"

2

Adorei o seu comentário e as recomendações de artigos.

Me identifiquei pois na empresa que trabalho está sendo desenvolvido uma nova versão da aplicação (que é web). Nessa versão nova estão tentando aderir essa visão de microserviços, separando cada módulo em um microserviço diferente, e cara, com certeza subestimaram muito a complexidade disso, principalmente para uma empresa pequena onde a maioria são Dev Juniores.

Fiquei curioso sobre o tópico da abordagem modular que você citou. Teria algum artigo ou pode dissertar mais sobre?

2

Ótimo, obrigado pelo retorno.

Comece com "The Art of Unix Programming" por Eric S. Raymond, que está disponível gratuitamente na internet, você encontrará um recurso inestimável para entender os princípios da supracitada filosofia Unix. Há um capítulo inteiro dedicado à modularidade, além de outro focado em estratégias para gerenciar a complexidade. Este livro é uma excelente introdução de como os princípios de design que promovem a clareza e a simplicidade tornaram o Unix parte fundamental da computação moderna.

Depois avance para "Patterns of Enterprise Application Architecture" por Martin Fowler. Este trabalho aprofunda-se nos padrões de design que são essenciais para construir aplicações empresariais robustas e escaláveis. Enquanto Raymond fornece uma base filosófica e abstrata, Fowler oferece um catálogo de soluções prontas que podem ser aplicados para lidar com a complexidade das aplicações de grande escala.

Ao explorar estes livros, você perceberá que, no coração do desenvolvimento de software modular, está a definição de interfaces claras e precisas. Interfaces bem definidas são o fundamento para a criação de componentes de software que podem ser desenvolvidos, testados e mantidos de forma independente.

1
1

Ultimamente tenho visto mais gente se opor aos microserviços... Meio que um "hype reverso". Parece que estão aos poucos notando os drawbacks de ter sistemas assim.

1

Transformar tudo em microserviços faz sua conta na AWS ficar muito extensa no final do mês.
Querem fazer a mesma arquitetura que o spotify mas esquecem que o mundo inteiro conhece o spotify.

1

Eu fui um dos que faziam parte desse culto. Depois do último projeto, me arrependo. Mas me arrependo só um pouco.

Resumindo: a experiência do seu time é um fator fundamental pra tomar a decisão de monolito X microsserviços.

Eu, o engenheiro de dados do projeto (com experiência prévia em dev), argumentei bravamente contra o líder técnico e o desenvolvedor full-stack (que era quem ia de fato desenvolver o nosso backend, sozinho). Ele queria fazer um monolito, pra entregar a solução o mais rápido possível. Eu disse que fazer um monolito ali não era a melhor solução, dada a complexidade do nosso sistema (não era um sistema simples, a empresa é de grande porte). Ele queria entregar rápido, porque ia sair da empresa em poucos meses, e nós íamos ficar lá com um monolito legado, de difícil manutenção. Eu estava pensando na manutenabilidade do sistema, e nada importava mais do que isso. Afinal, depois que ele saísse, a bomba iria cair no nosso colo.

Entretanto, eu falhei em levar em consideração que nem ele nem o líder técnico tinham experiência com arquitetura de microsserviços, e eles não tinham a quem recorrer para tirar dúvidas - a não ser eu. E eu não tenho tanta experiência assim com arquitetura de microsserviços! E mesmo se tivesse, eu tinha minhas tarefas com deadlines também. E ainda por cima acho que ele ficou com raiva de mim, porque não pediu ajuda também, mesmo eu me dispondo pra ajudar no que pudesse.

O resultado é que cerca de dois meses depois ele entregou um "microsserviço" por página da aplicação. Ou seja, como vocês já devem imaginar, havia duplicação de código por todo lado. Por exemplo, ao invés de fazer um microserviço para efetuar o log, o mesmo código era copiado em todos os microsserviços. Havia alto acoplamento, duplicação de código, e baixa coesão. Qualquer benefício de se ter um microsserviço passou a ser inexistente, mas mantivemos toda a complexidade de ter que manter várias bases de código separadas, e toda a dificuldade de administração da computação distribuída.

Portanto, eu diria que se você não tiver uma pessoa MUITO experiente no time, que irá parar tudo que ela está fazendo só para arquitetar bem os microsserviços, então faça um monolito.
Não subestime a quantidade de coisas que são necessárias de se aprender para se fazer corretamente um sistema orientado a microsserviços! DDD é só a ponta do iceberg, e só uma pessoa no time com esse conhecimento não será o suficiente!

... mas sigo dizendo que eu só me arrependo um pouco, porque continuo pensando que se tivéssemos feito uma arquitetura bem-feita, nós não teríamos o mesmo problema, e teria sido a melhor decisão para a saúde do projeto.