Escalando para 14 Milhões de Registros em Tempo Real: Nossa Arquitetura com Ruby on Rails, GraphQL, PostGIS e Elasticsearch

Imagine consultar 14 milhões de registros e visualizar os resultados em gráficos e mapas personalizados em tempo real. Nossa plataforma torna essa experiência possível graças a uma arquitetura cuidadosamente projetada, que combina o melhor de diversas tecnologias. Ao utilizar React para a interface, Ruby on Rails como backend, GraphQL para otimizar as consultas, Elasticsearch para indexar os dados, PostGIS para lidar com informações geográficas e Google Cloud para gerenciar a infraestrutura, conseguimos entregar uma aplicação rápida, escalável e intuitiva, que coloca o usuário no centro das atenções.
Hoje vamos passar rapidamente por cada uma dessas tecnologias e mostrar como elas se encaixam para criar uma experiência de usuário excepcional. Mas antes vamos falar um pouco mais sobre o problema
O problema da agregação
O problema da agregação de dados surge quando é necessário processar grandes volumes de informações e realizar cálculos, como somas, médias ou contagens, sobre atributos específicos, frequentemente combinando múltiplas dimensões ou categorias. Este é exatamente o que encontramos nesta aplicação, 14 milhões de registros, claro esse desafio se intensifica à medida que construímos interfaces que permitam os usuários realizem cruzamentos dinâmicos e agreguem dados com base em qualquer (ou quase todos) atributo de interesse, sem pré-definição ou resultados calculados previamente. Para isso, a aplicação precisa ser prototipada e ser capaz de lidar com consultas complexas e responder rapidamente, mesmo quando os dados são vastos e as possíveis combinações são inúmeras. O pensamento tradicional usando relacionamento em bancos de dados tradicionais enfrenta desafios, pois esse tipo de flexibilidade demanda recursos intensivos, já consultas complexas exigem varreduras completas e podem sobrecarregar a infraestrutura. Encontrar soluções eficientes para agregações dinâmicas e escaláveis é crucial para uma performace em poucos segundos e que permita criar interfaces interativas e responsivas, especialmente em cenários com milhões de registros e múltiplos atributos.
É neste cenário que os dados e a plataforma do SEEG se encaixam e nos dá a oportunidade de explorar novas tecnologias e abordagens para resolver esse problema e trazer uma nova experiência para os 10 anos do SEEG.

Banco de dados
O PostGIS desempenha um papel crucial na arquitetura, agindo como o sistema de gerenciamento de banco de dados relacional e espacial. Ele armazena e manipula dados geográficos, como coordenadas de pontos e polígonos, permitindo que realizemos consultas espaciais complexas. Entretando como falamos sobre o problema da agregaçao isso impacta diretamente na performance, pois consultas complexas podem ser lentas e ineficientes, especialmente quando lidamos com grandes volumes de dados. A extratégia utilizada foi a união do PostGIS com o Elasticsearch, o PostGIS com o Elasticsearch, com isso somos capazes de indexar esses dados geográficos e executar buscas espaciais de alta performance, essa combinação nos permite gerar mapas personalizados e interativos, oferecendo aos usuários uma visualização precisa e detalhada dos dados geográficos
Indexação e Consulta
O Elasticsearch é o coração da nossa estratégia de busca e análise de dados. Com sua capacidade de indexar grandes volumes de dados, ele nos permite realizar consultas complexas e obter resultados quase instantâneos! Ao indexar os 14 milhões de registros do SEEG, o Elasticsearch nos proporciona uma ferramenta poderosa para explorar os dados de diversas maneiras, como realizar buscas por campos específicos e agrupar os resultados que até então seria inviávies com um banco de dados relacional tradicional. Além disso, o Elasticsearch oferece funcionalidades de autocompletar e sugestões, tornando a experiência de busca ainda mais intuitiva para os usuários.Cacheamento
O Redis atua como um cache de dados in-memory, acelerando significativamente o tempo de resposta das consultas. Ao armazenar os resultados de consultas frequentes, o Redis reduz a carga sobre o banco de dados principal (Postgres) e o Elasticsearch, permitindo que a aplicação responda às solicitações dos usuários de forma mais rápida. A natureza in-memory do Redis garante um acesso extremamente rápido aos dados, tornando-o ideal para aplicações que exigem baixa latência.
API GraphQL com o Ruby on Rails
O Ruby on Rails, com sua convenção sobre configuração e produtividade, serve como a espinha dorsal da nossa servidor. Ele é responsável por lidar com as requisições, processar a lógica de negócio e interagir com os outros componentes da arquitetura. O GraphQL, por sua vez, atua como a API que expõe os dados do Elasticsearch para o cliente. Para quem ainda não conhece o GraphQL ele ao invés de oferecer endpoints fixos, ele permite que o cliente solicite exatamente os dados que precisa, reduzindo a quantidade de dados transferidos e otimizando o desempenho da aplicação. A combinação do Rails e GraphQL nos permite criar uma API flexível e eficiente, capaz de atender às diversas necessidades.

Resultados da arquitetura
No quesito desempenho a arquitetura implementada demonstrou um desempenho notável! Com um tempo médio de resposta para requisições em torno de 983 milissegundos. Essa latência extremamente baixa é resultado da combinação de diversas otimizações, como o uso de cache no Redis, a indexação eficiente dos dados no Elasticsearch e a otimização das consultas já mencionadas acima.
Agora, falando de escalabilidade a arquitetura foi projetada com a escalabilidade em mente: O uso de containers Docker permite que adicionemos novos nós ao cluster de forma simples e rápida, aumentando a capacidade de processamento da aplicação. Além disso, o Elasticsearch é altamente escalável, permitindo que indexemos um volume cada vez maior de dados sem comprometer o desempenho.
Experiência do Usuário
A interface da aplicação foi completamente redesenhada para oferecer uma experiência mais intuitiva para os usuários. Ao centralizar as consultas em uma única página, eliminamos a necessidade de navegar por diversas páginas específicas para cada tipo de visualização, como era a versão anteriormente com o Power BI e o banco de dados relacional. Essa mudança simplifica o fluxo de trabalho dos usuários e permite que eles encontrem as informações que precisam de forma mais rápida e fácil. Além disso, a utilização de gráficos e mapas interativos só se tornou possível graças à integração do PostGIS com o Elasticsearch, que nos permite gerar visualizações precisas e personalizadas dos dados geográficos.
Veja o resultado acessando a plataforma do https://plataforma.seeg.eco.br/ ou conheça mais sobre a metodologia e os dados em https://seeg.eco.br/
Siga e acompanhe também no LinkedIn e Instagram.

Glauco Munsberg
Cientista de dados, apaixanado por inovação e tecnologia.
Mestre em Inteligência Artificial/UFPel.