Um dos grandes fatores que impulsionam a adoção de uma nova tecnologia ou linguagem é a adoção por grandes empresas já consolidadas. Frameworks que nascem com a ‘marca’ Google, Twitter, Facebook ou Airbnb, por exemplo, ganham uma grande visibilidade frente a outras iniciativas com menos expressão no mercado e acabam atraindo mais desenvolvedores. Bootstrap, AngularJS, Ruby on Rails são alguns exemplos de tecnologias de sucesso e que caíram no gosto dos desenvolvedores, mas não são só Startups que se beneficiam da comunidade Open Source.
Em um painel recente Collin Estes, diretor de Engenharia de Software para a MRI Technologies, uma empresa contratada pela NASA para auxiliar no desenvolvimento do traje espacial para a agência americana revelou que utiliza Node.js nos sistemas que desenvolve. As vantagens que levaram à escolha do Node para essa aplicação você confere nesse post especial.
O Problema
Tudo pode parecer bastante calmo no espaço, a gravidade zero pode até dar uma impressão de tranquilidade, mas não se engane: a órbita terrestre é um ambiente extremamente hostil e perigoso. Tanto que uma equipe de profissionais fica em terra constantemente monitorando sinais vitais, projeções espaciais, velocidades relativas e um sem-número de variáveis advindas das mais diferentes fontes para garantir que tudo corra bem em missões na parte externa da estação espacial.
A partir de um incidente em uma dessas missões, onde água começou a vazar na parte interna do capacete do traje espacial, a equipe de comando de operações em terra identificou que os sistemas utilizados para a tomada de decisões críticas não eram otimizados. Informações e dados precisavam ser reunidos de sistemas espalhados, diferentes redes e fornecedores com tecnologias de propósito único, tipicamente.
Além da integração quase inexistente, dados duplicados, a incapacidade de consultas mais elaboradas e acesso a todas as fontes em tempo real levaram ao desenvolvimento de um novo sistema.
Node.js como solução
No contexto de implementar um sistema distribuído de alta performance, a iniciativa foi partir para um sistema em Elastic Search usando software Open Source com Node, Docker e RethinkDB. Isso permite uma maior flexibilidade e familiaridade com as tecnologias para empresas em futuros contratos com a agência. Toda a base de documentos migrou de datacenters específicos para a nuvem, e APIs RESTful foram criadas para facilitar a integração entre os sistemas. Dessa maneira, aplicações são criadas de maneira mais rápida e integrada, permitindo ao mesmo tempo uma maior escalabilidade e profundidade nas consultas e buscas.
Mas o que torna a linguagem tão revolucionária e adequada para esse tipo de aplicação? Simples: A mudança para um paradigma de orientação a eventos com um sistema de I/O não-bloqueante consegue lidar melhor com aplicações em tempo real, com um grande número de conexões simultâneas.
Feito para escalar
Um modelo de processamento diferente do que estamos acostumados é o responsável pela grande escalabilidade em aplicações I/O Intensive. Ao invés de alocar diversas threads para dar conta das requisições, esperando respostas lentas de acesso ao banco de dados, a arquitetura do Node.JS propõe uma thread única ativada por eventos para lidar com as requisições, enquanto distribui tarefas que demandam mais tempo para workers com respostas em callback.
Esse modelo otimiza a utilização de recursos em aplicações como chats em tempo real, streaming de dados, transações bancárias, ou mesmo proxy, coletando informações de diferentes provedores com tempos de resposta bastante variáveis (bastante utilizado em dashboards).
Dados prontos para uso
Outra grande vantagem é a utilização de bancos de dados como MongoDB ou RethinkDB que utilizam JSON nativamente, o que facilita a comunicação com as aplicações no lado do cliente em Javascript utilizando um único formato de dados seja no banco, servidor ou cliente. Isso evita conversões para modelos de dados intermediários (como acontece em Rails, por exemplo) e produz consultas mais rápidas.
O interpretador também lida de maneira bastante inteligente com requisições ao banco que não precisam de confirmação, como logs de sistema, ou em operações de menor relevância, onde consistência eventual nos dados é suficiente (‘Likes‘ do facebook, por exemplo). O cliente recebe a confirmação da requisição, mas o banco pode enfileirar as operações menos prioritárias para otimizar os recursos do sistema em momentos de gargalos ou alto tráfego.
Onde não usar Node.js?
As vantagens oferecidas pelo Node.js resolvem problemas de nichos específicos de aplicações onde requisições de Entrada-Saída são limitantes no sistema. Sistemas com necessidade intensiva de processamento podem acabar segurando a única thread que se comunica com o cliente (o Event Loop), já que o paralelismo nessa arquitetura só se aplica para tarefas nos workers de acesso ao banco. Além desse risco, o Event Loop acaba não tirando vantagem dos vários núcleos disponíveis nas máquinas na nuvem, o que diminui seu poder de processamento quando comparado com outros sistemas.
Aplicações que utilizam bancos de dados relacionais ainda são pouco suportadas em Node, acabam não aproveitando muito bem suas vantagens, ao passo que outros frameworks como Rails tratam de maneira muito mais simples e rápida esse tipo de desenvolvimento.
Em resumo, é preciso conhecer o domínio da sua aplicação para optar pela melhor solução disponível para determinado problema. Na MRI Technologies, o uso de Node.js facilitou a integração de sistemas através de APIs REST e abriu portas para a introdução de software open source em uma indústria tipicamente bastante fechada. Se você planeja construir serviços semelhantes, com muitos acessos em I/O e bancos de dados não sequenciais, não é nada mal confiar nos engenheiros aeroespaciais.
E você? O que acha sobre tudo isso? Deixe seu comentário!