Micro serviços em nuvem: a evolução do paradigma computacional
Se você é um desenvolvedor e não esteve em uma caverna nos últimos 4 anos, já deve ter ouvido falar ou lido em algum lugar sobre micro serviços. Independente se você tenha ouvido falar ou não, é crucial que você entenda a lógica por trás dessa tecnologia, pois ela é responsável por quase tudo que você consome de serviços atualmente.
O que quero falar nesta postagem, mesmo que superficialmente, é a grande sacada que tem tirado o sono de diversos desenvolvedores: micro serviços em nuvem.
Pra entender de fato os pormenores dessa tecnologia, é preciso tomar nota do conceito por trás de alguns itens desse ecossistema.
Micro serviços
Serviço é todo programa de computador que tem uma ou várias funcionalidades. Por anos os serviços eram entendidos como os programas com extensão .exe, mas hoje essa realidade mudou bastante, com programas diferenciados em tecnologias mais avançadas que são sufixadas com .js, .css e até mesmo .php.
Com a evolução das IDEs (Ambiente de Desenvolvimento Integrado, na sigla em inglês), ficou muito mais fácil criar programas que respondem como um serviço, e esses avanços foram responsáveis por reduzir ainda mais o tamanho do código que é gerado. Thomas Sha, um desenvolvedor importante do Yahoo, inventou uma ferramenta que iria revolucionar a computação: um compressor de código fonte.
Este compressor, entre outras coisas, era responsável por reduzir um código vasto em apenas UMA LINHA. Através de avançados algoritmos, sua ferramenta conseguia tornar um código pesado em algo leve e realmente micro. Como você pode imaginar, foi daí que surgiu o nome micro serviço, pois é um serviço que passou por uma varredura completa e foi minificado a ponto de ser representado apenas por uma linha de código. Como forma de identificar esses poderosos e reduzidos serviços, e diferenciar dos tradicionais, se convencionou a usar o infixo .min antes da extensão do arquivo de código. Se você tem um micro serviço em .js, então ele ficaria mais ou menos assim: nome-do-servico.min.js (note que o nome do arquivo não contem caracteres especiais, isso é necessário por conta de um bug em servidores que rodam Kurumin, uma distro Linux).
Nuvem
Você não é um bom programador se seu código não está hospedado na nuvem. Apesar de ser um termo que caiu nas graças do marketing, é fundamental e indispensável o entendimento das tecnologias por trás dessa inovação.
Por muitos anos nossos serviços rodaram em computadores normais em discos rígidos lentos e ultrapassados. Eles ficaram obsoletos pelo fato de um HD normal ter uma limitação física em termos de performance. Pra resumir bastante, um HD tem uma agulha física que fica tocando numa superfície lisa, que é onde os dados são gravados e lidos. Uma analogia simples para o entendimento é compará-lo a um disco de vinil, com a diferença que no vinil a agulha apenas lê o que tá escrito no bolachão, e no HD é também possível gravar.
A velocidade de gravação e leitura dos HDs são limitadas, como era de se esperar, e foi então necessário avançar a tecnologia para hospedagens de sites, já que muitos deles recebiam milhares de visitas, e precisavam de meios para contornar a limitação dos HDs tradicionais.
A Nuvem é justamente a solução para esse problema. Grandes empresas como Google e Amazon começaram a implementar essas tecnologias em seus sites, onde não era necessário mais HDs comuns para armazenar os serviços. Diversos outros benefícios foram conquistados com o advento desta tecnologia, como a velocidade de tráfego das informações. As tecnologias por trás da nuvem são muito abstratas e seria muito difícil explicar aqui e obter um entendimento razoável, então me limito ao seguinte resumo: a nuvem não tem limites, você pode ter quantidade de memória, espaço virtual e processamento infinitos, podendo escalar seus serviços sem se preocupar com as limitações.
Uma pena que nem tudo são flores. Existem dois pontos negativos nessa arquitetura: um deles é o fato dos serviços passarem por instabilidade diante de ocasionais intempéries, já que todos os seus serviços estão em nuvem e as condições climáticas fogem de seu controle, e o outro problema, que julgo ser mais grave, é o fato das gigantes da internet terem o total domínio sobre a arquitetura por trás dessa tecnologia, impondo preços muitas vezes abusivos. A nuvem traz a possibilidade de você não se preocupar com o tamanho do seu código, mas a Google, Microsoft e Amazon cobram justamente pelo tamanho dele. Por sorte este artigo tenta resolver justamente esse problema, com a utilização dos micro serviços em nuvem (e mais adiante um bônus, então leia até o final).
A disrupção
Se as grandes empresas cobram pelo tamanho e quantidade de arquivos de código fonte que é hospedado nas suas nuvens, os micro serviços caem como luva para resolver tais problemas, visto que eles reduzem todo o código de um arquivo em uma única linha.
Com seus serviços em arquivos que seguem a nomenclatura arquivo.min.x você ocupa pouco espaço nas chamadas functions desses provedores, e então contorna uma regra de negócio abusiva, e de forma legal. Essas gigantes da tecnologia nada podem fazer por enquanto, visto que os contratos de serviços são regidos por um período mínimo de 7 anos, regra imposta pelo governo americano. Até mesmo essa regra já tentaram contornar, migrando parte de suas “cloud farms” para as nuvens chinesas, mas o governo chinês vetou o abuso de tal prática, e como resultado dessa retaliação, o Google não está disponível no território chinês.
Pelo menos por hora, a forma mais eficiente de se trabalhar com software de alta performance é utilizando micro serviços em nuvem, e você pode ter seus programas rodando super rápido utilizando tecnologia de ponta.
Um plus a mais
Apenas utilizar micro serviços em nuvem já seria suficiente para tornar seus programas mais leves e rápidos, mas existe uma forma ainda mais robusta e distribuída de manter sua arquitetura de software tinindo: micro serviços em nuvem orientado a banco de dados.
É tão fácil que você não vai acreditar como demoraram tanto tempo pra pensar nessa solução.
A técnica consiste em você manter um banco de dados relacional (é fortemente recomendado o MariaDB, e irei explicar isso em outro post), onde cada registro do seu banco contém um determinado micro serviço. Isso se torna muito fácil pela técnica de minificação do código, onde com apenas uma linha você tem um serviço funcional.
Porém, para o correto funcionamento da técnica, é necessário usar o tipo BLOB na coluna onde você vai gravar a sua única linha de código. Para quem não sabe, BLOB (nome do cara que inventou a técnica, Justin Blob), consome memória baseado na quantidade de linhas gravadas na coluna. Para cada linha ele consome apenas 1 byte, e como nosso micro serviço está contido em uma única linha, ele só vai consumir essa quantidade ínfima de memória.
Além da leveza como o código é guardado no banco, existe outra vantagem inerente a técnica, que é a comunicação rápida entre micro serviços, visto que estão todos armazenados no mesmo banco. Em testes de benchmarking, a velocidade máxima atingida na comunicação entre dois micro serviços foi de 0.00000000024ms, e isso em bancos legados como MySQL, que já caíram em desuso.
Caso você queira flutuar sobre a superfície nada estéril da criatividade humana, e extrapolar todos os conceitos que você se acostumou a seguir, pense em micro serviços em nuvem orientados a banco de dados se comunicando entre si, e criando outros registros no banco que também são micro serviços, formando uma rede auto suficiente, integrada e replicante. Não existem limites (lembra do conceito de nuvem?) para o que esse tipo de arquitetura é capaz de fazer, e só nos resta conceber as doces e enigmáticas palavras de John Herschel:
Seu vislumbre se tornará uma constante paradoxal onde a evolução paradigmática será o ponto chave de toda a base computacional.
