Microservices após o hype – O que é? Qual a motivação? E eu realmente preciso disso? – Parte 02

Na parte 01 deste artigo discutimos a arquitetura baseada em microservices. Foram apresentados os problemas encontrados em grandes projetos sob a perspectiva da complexidade e da inovação. Também foi apresentado o conceito de microservices e como microservices trata as dificuldades encontradas em grandes projetos.

Na parte 02, iremos tratar as vantagens e as limitações da arquitetura baseada em microservices.

3) As vantagens da abordagem de microservices

Complexidade

Escalabilidade e confiabilidade

A restrição de tamanho dos casos de uso de um sistema permite o conhecimento de todos os comportamentos de maneira mais detalhada.

O débito técnico é mantido sob controle, permitindo a evolução do software. A comunicação feita através de serviços com outras áreas formaliza as integrações.

Os contratos de interface são menores e permitem, de maneira mais simples, considerar todos os casos, inclusive casos de erro.

Escalabilidade horizontal

Com aplicações de tamanho limitado é mais fácil escalá-las. Mesmo que isso necessite de uma refatoração no código ou até mesmo uma reescrita.

Inovação

Inovação tecnológica

As bases de código e os times tornam-se independentes, o que permite escolhas técnicas de acordo com uma necessidade específica.

Inovação de negócio

Considerando que os sistemas são estruturados em serviços, é mais fácil começar um novo projeto e reutilizar os serviços conforme necessário. Caso o projeto não dê certo, é possível removê-lo sem afetar os serviços existentes.

4) Limitações e requisitos

Se a arquitetura de microservices tem muitas vantagens, pode-se dizer que tem-se também muitos pré-requisitos e algumas limitações

Como microservices são uma variação do SOA, tem-se as mesmas características, porém com um nível adicional de criticidade.

O sistema torna-se distribuído

As arquiteturas convencionais permitem garantir diferentes estados entre diferentes aplicações: cada uma é mestre de seu negócio.

Quando tem-se a arquitetura de microservices, os sistemas tornam-se amplamente distribuído. O que traz novas questões a serem consideradas.

O caso mais complicado está relacionado a transações: sempre que uma transação é compartilhada entre duas aplicações, deve-se gerenciá-las em duas fases ou gerenciar o cancelamento. Em sistemas baseado em serviços, atualmente, não há ferramentas que auxiliem nessa tarefa. O controle de transação deve ser feito manualmente.

Mesmo quando não há transação envolvida, tem-se comumente a referência a dados de outras aplicações. Consequentemente, há a necessidade da gestão de eventos assíncronos ou de uma estratégia de cache para garantir a consistência dos dados.

Também tem-se o caso da indisponibilidade de serviços externos. Usar os serviços de outras aplicações significa criar uma dependência com a outra aplicação. A aplicação do design voltado a falhas ajuda a controlar estes riscos, mas requer rigor técnico.

É, também, importante gerenciar os SLAs para diferentes aplicações.

Eventualmente, o sistema torna-se difícil de testar. Os testes de integração aumentam e necessitam de uma maior cuidado no preparo dos dados e cenários de erros técnicos e de negócio.

Serviços de valor agregado

Apesar de a abordagem REST propor serviços simples, há sempre um conjunto de serviços que envolvem múltiplas áreas de negócio.

Com relação ao microservices, isso significa chamadas entre diversas aplicações.

O que leva a um conjunto muito maior de casos de uso para gerenciar (problema de sistemas distribuído) e adiciona latência de rede.

Em muitos casos, isso leva a criação de novos serviços, específicos a uma necessidade, em diferentes aplicações ou adicionar cache.

Evoluções transversais

Com projetos separados e times independentes, torna-se mais difícil implementar evoluções transversais.

Isto leva a sincronização de diferentes grupos ou ao estabelecimento de um sistema de controle de ciclo de vida complexo.

Esse problema piora quando tem-se iterações curtas, pois requer a sincronização de todos a todo momento.

Para manter a flexibilidade, é natural isolar clusters de outros projetos e limitar a interconexão entre esses grupos . O risco é adição de um nó intermediário não diretamente ligado aos projetos.

grupos

Projetos agrupados e serviços específicos para integração de grupos.

DevOps e provisionamento

Múltiplas aplicações levam a múltiplos deploys.

Afim de evitar erros e custos excessivos, é necessário um processo muito eficiente e boas ferramentas, que permitam o maior grau de automação possível. Essa automação é ainda mais necessária em casos de testes ou provas de conceito, nos quais ambientes temporários são necessários.

Início de projeto e alocação de pessoas

Escolher as pessoas, alocá-las, estabelecer o orçamento, etc…: em empresas mais "tradicionais" criar um projeto requer tempo e dinheiro.

Como forma de ter múltiplo projetos, cada um tendo seu próprio ciclo de vida, faz-se necessário uma industrialização destes aspectos.

Em grandes projetos, a capacidade de produção pode ser realocada entre as diferentes partes, enquanto pequenos projetos são mais sensíveis a tais realocações. É necessário desenvolver uma capacidade de aumentar ou reduzir times de modo eficiente.

Não se trata apenas de gerenciar desenvolvedores como um pool de recursos ou movê-los entre projetos como simples profissionais, mas de ter certa flexibilidade. É preciso entender o valor de cada pessoa envolvida no projeto e estabelecer uma estratégia para gerenciar as alocações.

Monitoramento e operação

Serviços independentes requerem:

  • Uma ferramenta de monitoramento de fluxo para identificar rapidamente os problemas
  • Um bom nível de maturidade operacional, pois os desafios relacionados com indisponibilidades serão maiores
  • Interface que mostre o estado atual dos serviços para os consumidores.

Tecnologia e manutenção

As escolhas tecnológicas se darão de maneira decentralizada, o que faz com que seja mais fácil cometer erros. O equilíbrio entre inovação e sustentabilidade torna-se mais difícil de gerenciar. Para permitir a inovação como forma de atender aos requisitos, precisa-se aceitar que erros serão cometidos.

Há ainda o risco de negligenciar boas práticas de desenvolvimento uma vez que o desafio de desenvolvimento é menor devido ao escopo mais limitado.

Finalmente, aplicações com escopo mais focados tendem a caírem em períodos de estagnação, os quais podem levar a um esquecimento por parte do time sobre a aplicação.

Estratégia e governança

Para grandes projetos relacionados a produtos de empresas, a visão estratégica é definida pela área de negócio. Há poucos parceiros e é um pouco simples avaliar demandas diferentes baseadas em seu valor para o negócio.

Com microservices, há inúmeros projetos técnicos ligados a um produto de negócio, havendo inúmeros interlocutores. Dessa forma, faz-se necessário bons mecanismos de comunicação, gestão e priorização.

Nesta parte 02 da nossa série "Microservices após o hype", apresentamos as vantagens e as limitações que uma arquitetura baseada em microservices pode trazer para as empresa sob diversas perspectivas.

Se você não leu a primeira parte desta série, pode conferi-la neste link.

A terceira parte desta série de artigos já está disponível, basta conferi-la neste link. Nela iremos discutir se precisamos mesmo de microservices e  como dar início a uma implementação ou restruturação de uma arquitetura para a arquitetura baseada em microservices.