Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GraphQL na GetNinjas (2017-09-20)

Avatar for Bruno Soares Bruno Soares
September 22, 2017

GraphQL na GetNinjas (2017-09-20)

• Introdução ao GraphQL
• Pontos Positivos
• Pontos Negativos
• Nosso Caso de Uso

Avatar for Bruno Soares

Bruno Soares

September 22, 2017

More Decks by Bruno Soares

Other Decks in Programming

Transcript

  1. O que é GraphQL? Introdução Uma especificação criada pelo Facebook

    em 2012 e aberta ao público em 2015 (graphql.org). Trata-se de uma linguagem de consulta para APIs e um runtime para preencher essas consultas com seus dados.
  2. Por que o Facebook criou isso? Principalmente por: • Desempenho:

    Seus aplicativos faziam diversas requisições na API para renderizar cada tela. • Flexibilidade: Diversos aplicativos sendo criados, uma série demandas de API diferentes. Introdução
  3. Sim! • O GraphQL não tem nada a ver com

    o banco de dados. • E nem com a camada de transporte. Funciona com qualquer banco de dados? Introdução
  4. Sim. Você pode fazer uma chamada de API, uma query

    no banco, rodar uma lógica qualquer… Só colocar dentro da resolve function. Da pra retornar qualquer coisa em um field? Introdução
  5. Da pra alterar dados? Introdução Sim! Via Mutations. Tecnicamente qualquer

    query pode ser usada para modificar dados, porém, por convenção devemos usar mutations para escritas.
  6. Da pra alterar dados? Introdução Exemplo de mutation da nova

    API GraphQL do Github usando a GraphiQL IDE.
  7. Flexibilidade Pontos Positivos Você pode consultar o schema navegando através

    das relações entre os recursos, economizando requisições ao servidor, sem a necessidade de definir novos recursos contendo o set de campos que você precisa no momento.
  8. Flexibilidade Pontos Positivos Exemplo de consulta / resposta da nova

    API GraphQL do Github usando a GraphiQL IDE.
  9. Desenvolvimento Pontos Positivos Evolua todo o schema da API em

    vez de apenas um endpoint de uma API REST. Quando você adiciona um campo, ele pode ser usado por outros consumidores da sua API.
  10. Versionamento orgânico Pontos Positivos Basta adicionar campos quando precisar ou

    marcá-los como deprecated quando você planeja parar de usá-los.
  11. Monitoramento Pontos Positivos Acompanhe o uso de cada campo em

    sua API, você pode acompanhar quem está usando, o desempenho e o uso de campos deprecated.
  12. O GraphQL não faz consulta em profundidade indefinida, então, se

    você tiver uma árvore e quiser retornar um ramo sem saber a profundidade, você terá que fazer algum tipo de paginação. Consulta em profundidade indefinida Pontos Negativos
  13. Resposta com estrutura específica Pontos Negativos No GraphQL, a resposta

    corresponde ao formato da consulta, portanto, se você precisar responder em uma estrutura muito específica, você terá que adicionar uma camada de transformação para remodelar a resposta.
  14. Cache à nível de rede Pontos Negativos Devido à maneira

    que o GraphQL é usado em APIs (POST em um único endpoint), o cache à nível de rede torna-se difícil. Uma maneira de resolver é usar persisted / static queries.
  15. Imprevisibilidade da execução Pontos Negativos A flexibilidade é um dos

    pontos mais fortes do GraphQL, porém, ela não é gratuita. • Queries complexas • Optimização de SQL; N+1 • Segurança
  16. Digamos que um cliente da sua API faça uma consulta

    gigante. Seu backend sofrerá para responder. • Maximum Depth: Bloqueia consultas que excedem a profundidade máxima pré-definida. • Cost Analysis: Bloqueia consultas que excedem o custo máximo de execução. O custo máximo é uma soma do custo definido para cada campo. • Persisted / Static Queries: Executa somente consultas pré-aprovadas; O Facebook parece estar usando essa estratégia (bit.ly/gql-gn-face). Queries complexas Pontos Negativos • Imprevisibilidade da execução
  17. Em APIs como REST, com endpoints para cada recurso, você

    tem a oportunidade de optimizar as consultas SQL, melhorando a performance e vitando N+1. • Facebook DataLoader: Ajuda a carregar dados de várias fontes, como bancos de dados ou serviços da Web, faz batch e cache (github.com/facebook/dataloader). • GraphQL::Batch: Um executor em batches para a gem graphql (github.com/Shopify/graphql-batch). Optimização de SQL; N+1 Pontos Negativos • Imprevisibilidade da execução
  18. Evoluir um Schema de GraphQL sem pensar em autorização de

    acesso pode ser extremamente perigoso, dado que um usuário da API poderia navegar pelo schema todo sem restrição nenhuma. • graphql-guard: Esta gem fornece autorização à nível de field para a gem graphql-ruby (github.com/exAspArk/graphql-guard). • GraphQL::Pro: Versão PRO da gem graphql-ruby, fornece recursos de autorização à nível de field e mais algumas coisas (graphql.pro). Segurança Pontos Negativos • Imprevisibilidade da execução
  19. No caso de um serviço que expõe uma API muito

    simples, o GraphQL somente adicionará complexidade desnecessária, então uma simples API REST pode resolver o seu problema. • Responder um JSON é muito simples. • Em muitas linguagem o JSON já vem built-in. • GraphQL é uma dependência a mais. APIs super simples Pontos Negativos
  20. Patentes e licença de uso Pontos Negativos Existe uma polêmica

    sobre as patentes dos projetos do Facebook, mesmo "parecendo" existir um esforço para deixar tudo claro (bit.ly/gql-gn-patents).
  21. Usamos GraphQL para acesso aos dados de outros sistemas durante

    a execução dos BPMNs das nossas réguas de comunicação. E o que raios é um BPMN? Business Process Model and Notation (Notação de Modelagem de Processos de Negócio) é uma série de ícones padrões para o desenho de processos. Nosso caso de uso Nosso Caso de Uso
  22. Processa os eventos disparados pelos outros sitemas e quando necessário

    inicia processos de BPMN no Camunda. Nosso Caso de Uso Arquitetura
  23. Ajudante do Camunda. Possui um admin onde são cadastradas as

    tarefas que o Camunda precisa executar. Nosso Caso de Uso Arquitetura
  24. Execução O Kitana lança um evento de "fatura_criada" contendo o

    ID da Fatura e o ID do Usuário. Nosso Caso de Uso
  25. A engine de processamento de eventos, inicia o BPMN de

    cobrança no Camunda via API. Nosso Caso de Uso Execução
  26. Executa o BPMN e chama o Gaara sempre que precisa

    executar alguma tarefa ou carregar mais dados. Nosso Caso de Uso Execução
  27. Tomando como exemplo uma tarefa de envio de e-mails: ref:

    "enviar-email-cobranca-1" invoice_id: 1 user_id: 1 Nosso Caso de Uso Execução
  28. - Executa as queries de GraphQL cadastradas no admin. -

    Roda a operação cadastrada passando como parâmetro o resultado obtido via GraphQL. Nosso Caso de Uso Execução
  29. Subscriptions Bônus Uma forma de manter a conexão aberta com

    o servidor, sendo avisado a cada alteração. bit.ly/gql-gn-sub