SlideShare uma empresa Scribd logo
1 de 41
Baixar para ler offline
GraphQL do Node
para o Go
Allan Aragão
Especialista de TI
10 anos no front das marcas Americanas, Submarino e Shoptime
6 anos trabalhando com NodeJs + ReactJs
allan-c-aragao
Backend For Frontend (BFF)
Onde tudo começou
- remover regras de negócio do front
- entregar somente o necessário para o front
- facilidade de alterar algum comportamento em produção
sem alterar o front
- performance
BFF
BFF
Surgiram muitos BFFs
E não é tudo...
Product
CATÁLOGO
Mystique
Blackbox
Como
começamos
Decidimos iniciar com uma POC para algumas vitrines de
produto que tem poucas informações
GraphQL
Apollo Server + Express
Principais ganhos:
- Apollo Studio
- Playground
- Persisted Query
- Cache
Cache
@apollo/client
GraphQL
Apollo Server foi uma experiência bem rápida e completa
para iniciar no GraphQL
Mas nem tudo são flores…
Chegamos a precisar de 180 cpus para atender produção em um dia
normal.
E nem era toda a carga que a gente precisava.
Benchmark
https://github.com/benawad/node-graphql-benchmarks
Mercurius + Fastify
https://github.com/mercurius-js/mercurius
Perdemos:
- Apollo Studio
Apollo Server
com express
Mercurius
com fastify
-70% de CPU
+213% de req/s
A nossa estimativa de carga no GraphQL era de receber 4.5MM RPM
E mesmo com a otimização precisamos de pelo menos 1200 CPU’s disponíveis para segurar
essa carga.
Preparação
BlackFriday 2020
Ainda precisamos melhorar...
Fiber
Fiber é um framework web inspirado no express.
Ele é feito em cima do FastHTTP que é a engine HTTP mais rápida do Go
https://github.com/gofiber/fiber
GraphQL
graph-gophers/graphql-go - https://github.com/graph-gophers/graphql-go
Gophers + Fiber
https://github.com/graph-gophers/graphql-go
https://github.com/gofiber/fiber
Perdemos:
- Apollo Studio
- Persisted Query
- Cache
- Playground
Cenário de teste
PRODUCT-API
OFFER-API
● Colocar carga até descobrir o ponto de saturação da app
● Testes curtos
10x
1x
10x
1 CPU
Resultado
Mercurius + Fastify (1 cpu) Gophers + Fiber (1 cpu)
RPM 3.13k 8.40k (+168%)
Response Time 90ms 24ms (-73%)
Memória 700mb 10mb
Desafios para a migração
18
Queries e
Mutations
21
Microsserviços
+500
Campos
disponíveis nas
queries
Desafios para a migração
Cache
Persisted
Query
Apollo Server
com express
Resultado
Mercurius
com fastify
-70% de CPU
Graphql-Go
com fiber
-60% de CPU
+213% de req +168% de req
Resultado da migração
34
cpus para
atender o
catálogo inteiro
180
cpus na
poc
Apollo Server
+ Express
Gopher +
Fiber
X
Perguntas?
Obrigado!
BFF
offer-bff product-bff reviews-bff blackbox
Surgiram muitos BFFs
E não é tudo...
Apollo Server
com express
Resultado
Mercurius
com fastify
-70% de CPU
+213% de req/s
Node Go
RPM
Node Go
Tempo de resposta
Migração
● Cache
● Persisted Query
Migração query a query
Apollo Client
Links - Middlewares que são executadas antes e depois de cada query.
Basicamente criamos uma whitelist de queries e fomos migrando uma a uma.
GO Node
Resultado
Versão Requests por
minuto (k)
CPUs ~ Request por cpu Meta BF
ExpressJS + Apollo Server 1 1420
Mercurius + Fastify 1 3130
Fiber 1 8400
Resultado
Versão Requests por minuto
(k)
CPUs ~ Request por cpu Meta BF
ExpressJS + Apollo
Server
500 180 2.800
MercuriusJS + Fastify 500 72 6.950
Fiber ? ? ?

Mais conteúdo relacionado

Mais procurados

Mais procurados (8)

Ideais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriverIdeais Cowabunga - Headless Testing com GhostDriver
Ideais Cowabunga - Headless Testing com GhostDriver
 
Novidades do TypeScript para desenvolvedores Angular
Novidades do TypeScript para desenvolvedores AngularNovidades do TypeScript para desenvolvedores Angular
Novidades do TypeScript para desenvolvedores Angular
 
Dwc2020 performace-with-dapper
Dwc2020  performace-with-dapperDwc2020  performace-with-dapper
Dwc2020 performace-with-dapper
 
Escalando uma plataforma poliglota - QConSP 17
Escalando uma plataforma poliglota - QConSP 17Escalando uma plataforma poliglota - QConSP 17
Escalando uma plataforma poliglota - QConSP 17
 
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - JunhoKaratê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
Karatê DSL - Automatizando testes de API de forma simples - GUTS RS - Junho
 
GDG POA - Karate DSL - Automatizando testes de api de forma simples
GDG POA - Karate DSL - Automatizando testes de api de forma simplesGDG POA - Karate DSL - Automatizando testes de api de forma simples
GDG POA - Karate DSL - Automatizando testes de api de forma simples
 
Flame Graphs, uma (boa) alternativa para profiling de apps Java
Flame Graphs, uma (boa) alternativa para profiling de apps JavaFlame Graphs, uma (boa) alternativa para profiling de apps Java
Flame Graphs, uma (boa) alternativa para profiling de apps Java
 
Drupal + Rex
Drupal + RexDrupal + Rex
Drupal + Rex
 

Semelhante a Tdc graphql do node para go

Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
Thiago Rondon
 

Semelhante a Tdc graphql do node para go (20)

TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
TDC2017 | São Paulo - Trilha Containers How we figured out we had a SRE team ...
 
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de segurosGoogle AppEngine: Desafios da adoção de cloud no mercado de seguros
Google AppEngine: Desafios da adoção de cloud no mercado de seguros
 
GraphQL na GetNinjas (2017-09-20)
GraphQL na GetNinjas (2017-09-20)GraphQL na GetNinjas (2017-09-20)
GraphQL na GetNinjas (2017-09-20)
 
Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014Semana Acadêmica ICET - Feevale - 12/04/2014
Semana Acadêmica ICET - Feevale - 12/04/2014
 
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
TDC2018SP | Trilha Ruby - Uma Aplicação Ruby On Rails Integrada com GraphQL, ...
 
Rails API com GraphQL
Rails API com GraphQLRails API com GraphQL
Rails API com GraphQL
 
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior...CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior...
CI&T DevDay BH 2013 - Google AppEngine: 3 anos de estrada no case com a maior...
 
PHP de alta performance com RoadRunner
PHP de alta performance com RoadRunnerPHP de alta performance com RoadRunner
PHP de alta performance com RoadRunner
 
Processamento em Big Data
Processamento em Big DataProcessamento em Big Data
Processamento em Big Data
 
Python para programadores Ruby
Python para programadores RubyPython para programadores Ruby
Python para programadores Ruby
 
Escalabilidade em Aplicações - Fisl13
Escalabilidade em Aplicações - Fisl13Escalabilidade em Aplicações - Fisl13
Escalabilidade em Aplicações - Fisl13
 
React nos Trilhos
React nos TrilhosReact nos Trilhos
React nos Trilhos
 
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
TDC2018SP | Trilha PHP Essencial - O que nao fazer ao atualizar para o PHP 7
 
GraphQL - A Linguagem do Facebook para APIs
GraphQL - A Linguagem do Facebook para APIsGraphQL - A Linguagem do Facebook para APIs
GraphQL - A Linguagem do Facebook para APIs
 
Menos reunião e mais post-it: Kanban na prática
Menos reunião e mais post-it: Kanban na práticaMenos reunião e mais post-it: Kanban na prática
Menos reunião e mais post-it: Kanban na prática
 
Cross testing mobile com ruby, cucumber e appium
Cross testing mobile com ruby, cucumber e appiumCross testing mobile com ruby, cucumber e appium
Cross testing mobile com ruby, cucumber e appium
 
Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.Cache, Concorrência e Sincronização.
Cache, Concorrência e Sincronização.
 
Azure Functions e Java: Do Desenvolvimento a Produção
Azure Functions e Java: Do Desenvolvimento a ProduçãoAzure Functions e Java: Do Desenvolvimento a Produção
Azure Functions e Java: Do Desenvolvimento a Produção
 
Como definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicaçãoComo definir a quantidade de workers para sua aplicação
Como definir a quantidade de workers para sua aplicação
 
Cacheamento Lado Servidor
Cacheamento Lado ServidorCacheamento Lado Servidor
Cacheamento Lado Servidor
 

Tdc graphql do node para go