Recentemente, a equipe de engenharia da Netflix publicou um post no blog oficial detalhando como a Netflix havia adotado microsserviços em GraphQL para acelerar o desenvolvimento de aplicações. Dane Avilla, Engenheiro de Software da Netflix, descreveu seus principais aprendizados no processo e também sobre como o GraphQL funciona bem para desenvolver prova de conceito.
Antes, um parênteses: o GraphQL, é uma linguagem para manipulação e query de dados em código aberto para APIs e um runtime para preencher queries com dados existentes. Foi desenvolvida internamente pelo Facebook em 2012 antes de ser lançada publicamente em 2015 e tem ganhado força nos últimos anos como uma alternativa às APIs REST mais tradicionais.
Avilla observa que há duas abordagens para a criação de esquemas GraphQL: um método usa o GraphQL como o único ponto de entrada para navegar pelos dados estruturados de uma organização inteira (“One Graph to Rule Them All“). Outra opção seria usar o GraphQL apenas como uma especificação de API enriquecida para a construção de aplicativos CRUD. A Netflix, no caso, acabou adotando a segunda opção para dar maior fluidez para seus esforços no desenvolvimento de aplicativos:
“A implementação bem-sucedida de um aplicativo interno em 4-6 semanas com requisitos iniciais limitados e uma equipe distribuída (sem histórico anterior de colaboração) despertou um grande interesse em todo o Netflix Studio. Outras equipes da Netflix estão descobrindo que a abordagem de microsserviços em GraphQL (…) é uma solução viável para ferramentas CRUD internas que historicamente teriam usado REST. ”
Para implementar esses microsserviços com mais facilidade, os engenheiros da Netflix padronizaram uma imagem Docker personalizada usando o Graphile. Graphile é um conjunto de ferramentas criadas para construir aplicativos robustos, de alto desempenho e extensíveis, centralizados em PostgreSQL e GraphQL, tudo muito rapidamente. Por exemplo, o uso do Graphile permitiu aos engenheiros da Netflix expor um conjunto de dados PostgreSQL como uma API rapidamente. Avilla descreveu da seguinte forma:
“Usando o Docker, definimos um container leve e autônomo que nos permitiu empacotar a biblioteca Graphile e seu código de suporte em um pacote autônomo que qualquer equipe na Netflix pode usar, sem a necessidade de codificação adicional. Basta puxar a imagem de base do Docker definida e executá-la com a string de conexão de banco de dados apropriada. Essa abordagem provou ser muito bem-sucedida e rendeu vários insights sobre o uso do Graphile.”
Uma ideia é usar visualizações de banco de dados como uma “camada de API”. O uso de visualizações permite preservar a flexibilidade e possibilitar a modificação de tabelas sem alterar um esquema GraphQL existente. Além disso, as visualizações podem fazer a formatação básica dos campos. Outra ideia é usar os composite types do PostgreSQL. Por padrão, o Graphile expõe vários tipos não escalares como um “JSON GraphQL”. Usar os tipos compostos do PostgreSQL e o suporte do Graphile para anotações em comentários permite gerar esquemas GraphQL fortemente tipados, que, por sua vez, aceleram ainda mais o desenvolvimento da aplicação.
Um terceiro insight gira em torno do processo de desenvolvimento. De acordo com Avilla, eles viram que permitir inicialmente ao cliente “acesso total” às consultas e mutações do GraphQL geradas automaticamente levava a uma maior flexibilidade no desenvolvimento quando o comportamento da UI ainda não estava finalizado. Mais tarde, quando a equipe solidificasse a API requisitada, eles poderiam então bloquear o esquema e expor apenas a funcionalidade necessária. Além disso, esta fase poderia permitir otimizar as queries de banco de dados restantes usando índices, denormalization, clustering etc.
Os engenheiros da Netflix atualmente não oferecem suporte à adição de queries e mutações personalizadas a um esquema gerado pelo Graphile. No entanto, eles podem obtê-lo usando makeExtendSchemaPlugin no Graphile, que permite mesclar tipos personalizados, queries e mutações no esquema gerado pelo Graphile.
Fonte: InfoQ