faststore icon indicating copy to clipboard operation
faststore copied to clipboard

GraphQL Framework

Open tlgimenes opened this issue 3 years ago • 3 comments

We need to decide which framework/server we will use in our starter. The frameworks I found we could use:

  1. Apollo Server
  2. Envelop
  3. ?

tlgimenes avatar Sep 13 '21 12:09 tlgimenes

Pegar o base.store, e migrar a function do graphql.ts para usar apollo/envelop e fazer varios request e medir as seguintes metricas.

  1. ops/s - quantas queries eles aceitam por segundo
  2. min time de resposta para uma query
  3. max time de resposta para uma query

tlgimenes avatar Sep 16 '21 18:09 tlgimenes

Report

Envelop

  • Spike em: https://github.com/vtex-sites/base.store/pull/76/files
  • Status: Ainda precisa de polimento antes de seguir para master

O que precisa ser feito:

Escolher os plugins que serão utilizados

Todos os plugins podem ser vistos aqui: https://www.envelop.dev/plugins

  • Recomendação de, incialmente, colocar todos de perfomance e segurança
  • Podemos refazer o teste de perfomance após isso.

Resultado do teste de perfomance

O teste de perfomance foi executado utilizando siege na minha máquina local.

Os testes foram realizados com:

  • base.vtex sem framework
  • Utilizando envelop sem jit
  • Utilizando envelop com jit

Para cada um desses casos, foram realizados testes com 25, 100 e 250 usuários concorrentes.

Os resultados podem ser encontrados aqui.

Não houve alteração significativa de perfomance, e ainda há a possibilidade de utilizar plugins para melhoria da mesma. Como muitas funcionalidades são adicionadas com a utilização do framework, sem perda visível de perfomance, penso que vale a utilização.

Apollo Server

  • Status: Spike não concluído.
  • Motivo: Ao tentar realizar a execução utilizando o graphQL, é recebida a seguinte mensagem:
Duplicate "graphql" modules cannot be used at the same time since different versions may have different capabilities and behavior

Investigação

A partir dos resultados de yarn why graphql e npm ls graphql, identifiquei duas dependências que poderiam causar o problema:

  • rollup-graphql-plugin em store-api;
  • graphql-codegen-plugin em base.store.

As duas foram removidas e os PRs ~se encontram abertos e prontos para revisão~ mergeados:

  • https://github.com/vtex-sites/base.store/pull/94
  • https://github.com/vtex/faststore/pull/1009

Mesmo com essas duas remoções, ainda não foi possível utilizar o apollo-server, que retornou a mesma mensagem de erro de antes

Outra tentativa realizada foi utilizando resolutions do yarn, mas também sem resultado.

Referências

  • https://github.com/apollographql/apollo-tooling/issues/1384
  • https://github.com/apollographql/apollo-server/issues/3773
  • https://stackoverflow.com/questions/63957674/cannot-use-graphqlobjecttype-query-from-another-module-or-realm

Conclusão

Devido a dificuldade para implementar o Apollo Server e os resultados positivos com o framework Envelop, penso que é válido iniciarmos a implementação com Envelop e criarmos uma task separada para tentar um outro spike com Apollo Server no futuro para avaliarmos novamente, se necessário.

danzanzini avatar Oct 29 '21 13:10 danzanzini

Can we close this issue, @tlgimenes @danzanzini ?

igorbrasileiro avatar Mar 23 '22 15:03 igorbrasileiro