Neste artigo, discutirei como chegamos a este ponto com um breve passeio pela história dos aplicativos em rede. Depois disso, falaremos sobre o modelo de execução imponente da Temporal e como ele tenta resolver os problemas introduzidos pelas arquiteturas orientadas ao serviço (SOA). Em plena divulgação, eu sou o Chefe de Produto da Temporal, então eu posso ser tendencioso, mas eu acho que essa abordagem é o futuro.
Uma pequena lição de história
Vinte anos atrás, os desenvolvedores quase sempre construíram aplicações monolíticas. O modelo é simples, consistente e semelhante à experiência que você tem na programação em um ambiente local.
Os monólitos por natureza dependem de um único banco de dados, o que significa que todo estado é centralizado. Um monólito pode mutar qualquer um de seu estado dentro de uma única transação, o que significa que ele produz um resultado binário — funcionou ou não. Não há espaço para inconsistência. Portanto, os monólitos proporcionaram uma grande experiência para os desenvolvedores, pois significavam que não havia chance de transações fracassadas resultando em um estado inconsistente. Por sua vez, isso significava que os desenvolvedores não tinham que escrever constantemente códigos para adivinhar o estado das coisas.
Por muito tempo, os monólitos faziam sentido. Não havia uma tonelada de usuários conectados, o que significava que os requisitos de escala para software eram mínimos. Até os maiores gigantes do software operavam em uma escala que parece minúscula hoje. Havia um punhado de empresas como Amazon e Google que estavam funcionando em “escala”, mas eram a rara exceção, não a regra.
Pessoas gostam de software
Nos últimos 20 anos, a demanda por software não parava de crescer. Hoje, espera-se que as aplicações atendam a um mercado global desde o primeiro dia. Empresas como Twitter e Facebook fizeram apostas de tabela 24 horas por dia, 7 horas por dia, 7 horas por dia, 70%. O software não está mais apenas alimentando as coisas nos bastidores, ele se tornou a própria experiência do usuário final. Espera-se que todas as empresas tenham produtos de software. Confiabilidade e disponibilidade não são mais recursos, são requisitos.
Infelizmente, os monólitos começam a desmoronar quando a escala e a disponibilidade se tornam requisitos. Desenvolvedores e empresas precisavam encontrar maneiras de acompanhar o rápido crescimento global e exigindo expectativas dos usuários. Eles começaram a procurar arquiteturas alternativas que aliviassem os problemas de escalabilidade que estavam enfrentando.
A resposta encontrada foram microsserviços (bem, arquiteturas orientadas a serviços). Os microsserviços pareciam ótimos inicialmente porque permitiam que os aplicativos fossem divididos em unidades relativamente independentes que poderiam ser dimensionadas independentemente. E como cada microsserviço mantinha seu próprio estado, significava que sua aplicação não se limitava mais ao que cabia em uma única máquina! Os desenvolvedores poderiam finalmente criar aplicativos que atendam às demandas de escala de um mundo cada vez mais conectado. Os microsserviços também trouxeram flexibilidade para equipes e empresas, pois forneceram linhas claras de responsabilidade e separação para arquiteturas organizacionais.
Não existe almoço grátis.
Embora os microsserviços resolvesse os problemas de escalabilidade e disponibilidade que estavam bloqueando fundamentalmente o crescimento do software, nem tudo estava bem. Os desenvolvedores começaram a perceber que os microsserviços vinham com algumas desvantagens sérias.
Com monólitos, geralmente havia uma instância de banco de dados e um servidor de aplicativo. E como um monólito não pode ser quebrado, há apenas duas opções práticas para escalar. A primeira opção é o dimensionamento vertical, o que significa atualizar o hardware para aumentar o throughput/capacidade. O dimensionamento vertical pode ser eficiente, mas definitivamente não é uma solução permanente se a sua aplicação precisar continuar crescendo. Se você escala verticalmente o suficiente, você eventualmente ficar sem hardware para atualizar. A segunda opção é o dimensionamento horizontal, que no caso de um monólito significa apenas criar cópias de si mesmo para que cada um sirva a um conjunto específico de usuários/solicitações etc. Os monólitos de dimensionamento horizontal resultam em subutilização de recursos e em escalas altas o suficiente simplesmente não funcionarão. Não é o caso de microsserviços, cujo valor vem da capacidade de ter vários “tipos” de bancos de dados, filas e outros servidores que são dimensionados e operados de forma independente. Mas o primeiro problema que as pessoas notaram quando mudaram para microsserviços foi que de repente se tornaram responsáveis por muitos tipos diferentes de servidores e bancos de dados. Por muito tempo, esse aspecto dos microsserviços não foi abordado e os desenvolvedores e operadores foram deixados para resolvê-lo eles mesmos. Resolver os problemas de gestão de infraestrutura que vêm com os microsserviços é difícil, o que deixou os aplicativos não confiáveis na melhor das hipóteses.
A demanda é o veículo final da mudança. À medida que a adoção de microsserviços aumentava rapidamente, os desenvolvedores se tornaram cada vez mais motivados a resolver seus problemas de infraestrutura subjacentes. Lentamente, mas certamente, soluções começaram a aparecer, e tecnologias como Docker, Kubernetes e AWS Lambda entraram para preencher o vazio. Cada uma dessas tecnologias reduziu muito a carga de operação de uma infraestrutura de microsserviço. Em vez de ter que escrever código personalizado que lida com a orquestração de contêineres e recursos, os desenvolvedores poderiam contar com ferramentas para fazer o trabalho para eles. Agora, em 2020, finalmente chegamos a um ponto em que a disponibilidade de nossa infraestrutura não está sabotando a confiabilidade de nossos aplicativos. Ótimo trabalho!
Claro, não entramos em uma utopia de software perfeitamente estável. A infraestrutura não é mais a fonte da inconfiabilidade do aplicativo; o código de aplicação é.
O outro problema com microsserviços
Com monólitos, os desenvolvedores escrevem códigos que fazem mudanças imponentes de forma binária. As coisas aconteceram ou não. Com os microsserviços, o estado do mundo passou a ser distribuído em diferentes servidores. Mudar o estado de aplicativo agora é necessário atualizar simultaneamente diferentes bancos de dados. Isso introdu
.png)
.png)
.png)
.png)