Fale com o CPQD
30 de outubro de 2023

Vamos conversar sobre Cloud Native?

Por: Rafael Augusto Scaraficci; Rafael Fernandes Batistella; Luis Fernando Martins da Rocha

Cloud Native tornou-se uma das expressões da moda na área de tecnologia e normalmente é acompanhada por um conjunto de outros termos, tais como: Microsserviços, Docker, Kubernetes, Devops e CI/CD. O termo está tão presente no dia a dia dos profissionais da área, que a equipe de desenvolvimento de software se sente “obrigada” a dizer que está trabalhando com tecnologias desse ecossistema e que seus produtos são ou estão sendo refatorados para se tornarem Cloud Native. Dizer que “um sistema não possui tal característica” parece uma afirmação equivocada e ultrapassada, podendo ser mal interpretada por clientes e stakeholders que não são necessariamente da área técnica. Porém, faz sentido que todo sistema de software seja Cloud Native? Afinal, o que é ser Cloud Native? 

A própria definição do termo é algo controverso, ou melhor, mal compreendido. Se você pedir para diferentes pessoas dizerem o que entendem por Cloud Native, possivelmente vai receber diferentes respostas, tais como: sistema desenvolvido com serviços da nuvem; sistema desenvolvido com contêineres, microsserviços, Devops e CI/CD; e sistema com alta disponibilidade, resiliente e elástico. 

Apesar de essas respostas não estarem totalmente erradas, elas geram uma ambiguidade que se torna um problema para a comunicação dentro e fora da equipe. Além disso,  o mais preocupante são interpretações que focam nas tecnologias, e não nas características desse tipo de sistema. Isso acaba resultando na adoção de práticas e ferramentas que nem sempre são as mais adequadas para atacar os problemas do sistema em questão e, muitas vezes, são aplicadas sem o devido conhecimento do seu custo-benefício, o que pode se tornar um novo problema em vez de ser a solução.

Mas afinal, qual seria a melhor definição para o termo Cloud Native? Se visitarmos o post de 2010 dos arquitetos da WSO2 que faz a primeira menção a Cloud Native [1], notamos que a essência da definição é de um sistema de software que rode bem na nuvem, ou seja, que tire o máximo proveito desse tipo de ambiente. Para isso, o sistema de software deve ser:

  1. Distribuído de forma a rodar em múltiplos nós.
  2. Elástico, adaptando-se às alterações na demanda.
  3. Multi-tenant, possibilitando oferta no modelo SaaS (Software as a Service).
  4. Capaz de medir e cobrar pelo uso.
  5. Desenvolvido incrementalmente, possibilitando agilidade nas evoluções e atualizações.
  6. Auto aprovisionado e auto gerenciado de forma que a própria equipe de desenvolvimento implanta e opera o sistema.

Características similares [2] aparecem na definição da Cloud Native Computing Foundation (CNCF) [3] criada cinco anos depois:

Tecnologias nativas ao cloud empoderam empresas a criarem e rodarem aplicações escaláveis em ambientes modernos e dinâmicos, como nuvens públicas, privadas e híbridas. Containeres, service meshes, microsserviços, infraestruturas imutáveis e APIs declarativas são alguns exemplos dessa estratégia.

Essas técnicas permitem criar sistemas de baixo acoplamento, resilientes, gerenciáveis e observáveis. Combinadas com automações robustas, elas permitem que os engenheiros façam alterações de alto impacto de forma frequente e previsível, com o mínimo de esforço.

De acordo com essas  duas definições, Cloud Native é um sistema de software que se beneficia do ambiente de nuvem, i.e., um sistema resiliente, escalável, observável, com alta-disponibilidade e com capacidade de ser atualizado frequentemente, seja por motivo de correção, experimentação ou evolução. Note que para atender a essas características, tecnologias como contêineres, microsserviços, Devops e CI/CD podem ser utilizadas. Porém, o simples uso dessas técnicas e ferramentas não caracteriza o  sistema como Cloud Native

Em vez de tentar copiar o modelo das Big Techs, que desenvolvem produtos de software para atender milhões de usuários com necessidades extremas de disponibilidade, elasticidade, desempenho, latência e facilidade de atualização do sistema (dezenas ou centenas de atualizações por dia), é primordial entender  as reais demandas do nosso produto e como podemos atendê-las da melhor maneira no ambiente de nuvem. Para isso, precisamos compreender o que significa para o nosso sistema rodar bem na nuvem e quais estratégias utilizar para alcançar esse objetivo. Pode ser que num primeiro momento (inclusive num segundo), nosso produto não precise de todas as características intrínsecas ao Cloud Native. Não há nada de errado com isso! Errado seria investir massivamente em tecnologias para “modernizar” um sistema sem que isso tenha de fato um retorno significativo para a empresa e os clientes.  

Sendo realmente críticos em relação às “dores” do nosso sistema de software, pode ser que algumas práticas típicas do Cloud Native sejam dispensáveis. Por exemplo, às vezes, a complexidade da arquitetura monolítica é uma questão de modularização e não de segmentação em microsserviços, algo que carrega toda a complexidade de um sistema distribuído. De maneira similar, problemas de desempenho podem ser resolvidos eventualmente com técnicas de cache, processamento assíncrono e balanceamento de carga; sem que haja a necessidade de se ter um sistema elástico, que é simples no conceito, mas complexo de se implementar eficientemente.

Apesar de que nossos produtos nem sempre precisam ser realmente Cloud Native com todas aquelas características, a utilização da nuvem como infraestrutura para os sistemas de software já não é mais uma tendência, mas uma necessidade, em razão dos seus benefícios. Segundo Mary Poppendieck em sua apresentação “The Future of Software Engineering”, a computação em nuvem veio para ficar e a computação on-premises gradualmente deixará de existir. No entanto, apenas hospedar uma solução na nuvem traz ganhos limitados, que dependendo do negócio podem até ser suficientes, mas para ganhos realmente significativos é imprescindível que o software se beneficie mais das características da nuvem e rode bem nela. Dessa forma é importante que sejam aplicadas tecnologias que permitam explorar  o potencial da nuvem de acordo com as necessidades do produto; lembrando que as tecnologias são meios e não fim!

Referências

[1] Cloud Native 

http://pzf.fremantle.org/2010/05/cloud-native.html

[2] Cloud-Native, Seven Years On…

https://thenewstack.io/cloud-native-seven-years/

[3] CNCF Cloud Native Definition v1.0

https://github.com/cncf/toc/blob/main/DEFINITION.md

Compartilhe
esta notícia:
vlibras