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

GraphQL para reduzir complexidade no front e no back

GraphQL para reduzir complexidade no front e no back

Kete Martins Rufino

August 11, 2018
Tweet

More Decks by Kete Martins Rufino

Other Decks in Technology

Transcript

  1. $330 milhões em 5 rodadas de investimento +4 milhões de

    clientes +1000 funcionários Foi eleito o cartão favorito dos brasileiros
  2. Nuconta ENVIO - Pedido de Envio - Envio RECEBIMENTOS -

    Recebimento SALDO - Depósito - Liquidação
  3. ENVIO RECEBIMENTOS SALDO Envio solicitado Pedido de envio Envio Liquidação

    efetuada Dinheiro enviado Depósito Liquidação
  4. ENVIO RECEBIMENTOS SALDO Envio solicitado Liquidação efetuada Dinheiro enviado Recebimento

    Dinheiro recebido Depósito Liquidação Pedido de envio Envio
  5. ENVIO RECEBIMENTOS SALDO Envio solicitado Depósito Liquidação Liquidação efetuada Dinheiro

    enviado Recebimento Dinheiro recebido Transferência Concluída Pedido de envio Envio
  6. • + detalhes... ◦ Validações ◦ Falhas ◦ Integrações com

    terceiros ▪ Transferência para outros bancos ▪ Recebimento de outros bancos ◦ ... Nuconta
  7. Construindo a Nuconta: do zero a milhões de clientes Gustavo

    Bicalho e Maurício Verardo Nuconta https://medium.com/building-nubank
  8. ENVIO - Pedido de Envio - Envio RECEBIMENTOS - Recebimento

    SALDO - Depósito - Liquidação Nuconta
  9. Problemas Custo • Tempo / Energia / Banda Complexidade •

    Modelo do backend !== visão do cliente Segurança • Exposição das regras de negócio Responsabilidades • Apresentar dados / DIferentes interfaces Atualizações • Publicação na loja / Usuário não atualiza Acoplamento • Dificuldade em evoluir o backend
  10. • Linguagem de consulta de dados para sua API •

    Criada e mantida pelo Facebook em 2012 ( Ops… ) GraphQL
  11. • Linguagem de consulta de dados para sua API •

    Criada e mantida pelo Facebook em 2012 ( Ops… ) • Padrão aberto em 2015 GraphQL
  12. • Linguagem de consulta de dados para sua API •

    Criada e mantida pelo Facebook em 2012 ( Ops… ) • Padrão aberto em 2015 • Definição do schema (tipagem) GraphQL
  13. • Linguagem de consulta de dados para sua API •

    Criada e mantida pelo Facebook em 2012 ( Ops… ) • Padrão aberto em 2015 • Definição do schema (tipagem) • Retorno dos dados previsíveis GraphQL
  14. schema { query: Query } type Query { saldo(accountId: id!):

    Float feed(accountId: id!): [Envio | Recebimento] } type Recebimento { data: Date valor: Float } GraphQL schema enum StatusEnvio { PENDENTE, FALHA, SUCESSO } type Envio { data: Date valor: Float status: StatusEnvio }
  15. query feedScreen($accountId: ID!) { feed(accountId: $accountId) { ...on Envio {

    data valor status } ... on Recebimento { data valor } } schema { query: Query } type Query { saldo(accountId: id!): Float feed(accountId: id!): [Envio | Recebimento] } type Recebimento { data: Date valor: Float } enum StatusEnvio { PENDENTE, FALHA, SUCESSO } type Envio { data: Date valor: Float status: StatusEnvio } HTTP /api/query GraphQL client
  16. http://api/customer/accountId { "Saldo": "500.00", "Feed": { "Envio": { "data": "2018-08-11",

    "valor": "100.00", "status": "SUCESSO", }, "Recebimento": { "data": "2018-08-11", "valor": "600.00", } } } GraphQL client
  17. http://api/customer/accountId { "Saldo": "500.00", "Feed": { "Envio": { "data": "2018-08-11",

    "valor": "100.00", "status": "SUCESSO", }, "Recebimento": { "data": "2018-08-11", "valor": "600.00", } } } query feedScreen($accountId: ID!) { feed(accountId: $accountId) { ...on Envio { data valor status } ... on Recebimento { data valor } } GraphQL client
  18. query feedScreen($accountId: ID!) { feed(accountId: $accountId) {...} saldo(accountId: $accountId) {...}

    } type Query { saldo(accountId: id!): Float feed(accountId: id!): [Envio | Recebimento] saldoDetalhado(accountId: id!): SaldoDetalhado } query feedScreen($accountId: ID!) { feed(accountId: $accountId) {...} saldoDetalhado(accountId: $accountId) {...} } Cliente V1 Cliente V2 GraphQL client
  19. schema { query: Query mutation: Mutation } type Query {

    saldo(accountId: id!): Float feed(accountId: id!): [Envio | Recebimento] } type Mutation { transferir(accountId: id!, toAccountId: id!, value: value!): Envio } GraphQL schema
  20. mutation fazerTranferencia($accountId: id!, $toAccountId: id!, $value: value!) { transferir(accountId: $accountId,

    toAccountId: $toAccountId, value: $value) { data valor status } } // Variavéis { "accountId": "10-ab-cs", "toAccountId": "22-ab-c4", "value": "100.00", } // Retorno { "data": { "data": "2018-08-11", "valor": "100", "status": "SUCESSO", } } Mutations client
  21. FERRAMENTAS BACKEND - lacinia (Clojure) - graphql (nodejs) - apollo-server

    (nodejs) - graphql-java (Java) FRONTEND - re-graph (ClojureScript) - apollo (JS/Android/Swifit) - relay (React)
  22. Conclusão Vantagens - API representando a UI - Menor custo

    - menos requisições - consumo de dados - bateria - Menor complexidade - Evolução do backend Desvantagens - Um item a mais na arquitetura - Curva de aprendizado - Tecnologia recente
  23. Obrigada! Perguntas? @ketemr UI Engineer @ Nubank Vem para o

    nosso time! WE BUILD STRONG AND D I V E R S E TEAMS