151
Busca de alta performance Busca de alta performance com GraphQL e Elasticsearch com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019. 1

com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

  • Upload
    others

  • View
    4

  • Download
    0

Embed Size (px)

Citation preview

Page 1: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Busca de alta performanceBusca de alta performancecom GraphQL e Elasticsearchcom GraphQL e Elasticsearch

Guilherme Baptista

TDC Florianópolis - Trilha Go, Abril de 2019.

1

Page 2: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

AgendaAgendaO que é performance?

Qual problema queremos resolver?

Como escolhemos Go?

Como trabalhamos com Elasticsearch?

Onde entra GraphQL na história?

Resultados

Re�exões

2

Page 3: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O que é performance?O que é performance?

3

Page 4: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O que é performance?O que é performance?Estrangeirismo predileto na área de T.I.

Não satisfeitos, ainda usamos:

"Tá performando legal!"

"Será que vai performar esse código?"

"Essa API nova deu uma performada boa..."

4

Page 5: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

PerformancePerformance

em português:

DesempenhoDesempenho

5

Page 6: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

DesempenhoDesempenho

associado com:

VelocidadeVelocidade

6

Page 7: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Velocidade?Velocidade?7

Page 8: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tempo de resposta:

1 milissegundo1 milissegundo

Servidores: 150 mil dólares por mês;

Taxa de erros: 97% das requisições.

8

Page 9: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Serviço de altaServiço de altaperformance:performance:

Alta velocidade;

Baixa taxa de erros;

Mínimo custo �nanceiro;

Etc.

9

Page 10: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Simplificando,Simplificando,

vamos associar

performanceperformancecom:

10

Page 11: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tempo de respostaTempo de resposta"Essa página demora quantos segundos para abrir?"

Throughput suportado (rpm)Throughput suportado (rpm)"Quantos acessos por minuto esse site aguenta?

11

Page 12: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tempo de respostaTempo de respostaPor que isso importa?

12

Page 13: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O óbvio:O óbvio:Ninguém gosta de site lento.

13

Page 14: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Sites que demoram mais que

3 segundos3 segundosv

80% nunca voltam;57% desistem do acesso;50% falam mal para outras pessoas.

14

Page 15: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Para cada

100 milissegundos100 milissegundosa mais no tempo de resposta

a Amazon perde

-1% de suas vendas.-1% de suas vendas.15

Page 16: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Para cada

1 segundo1 segundoa menos no tempo de resposta

o Walmart ganha

+2% de aumento em suas+2% de aumento em suasvendas.vendas.

16

Page 17: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Com uma melhoria de

40%40%no tempo de carregamento de suas páginas

o Pinterest conseguiu um aumento de

+15% no cadastro de usuários.+15% no cadastro de usuários.

17

Page 18: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Para cada

1 segundo1 segundoa mais no tempo de resposta

a BBC perde

-10% de seus usuários.-10% de seus usuários.

18

Page 19: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Throughput suportadoThroughput suportadoPor que isso importa?

19

Page 20: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Um estudo identi�cou que quando sites �cam

fora do arfora do arv

Queda de 100% nos acessos;Queda de 100% nas vendas;Aumento de 300% nos batimentos cardíacos dequem cuida do site.

20

Page 21: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Por onde começar então?Por onde começar então?

19681968George A. Miller

21

Page 22: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Ciência cognitivaCiência cognitivaGeorge A. Miller

Mnemônica;Lei de Miller: 7 coisas de cada vez;Palácio da memória (Sherlock Holmes);Programação neurolinguística (PNL);Psicologia e informação.

22

Page 23: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

19681968A interação entre seres humanos e sistemas de

informação.

Quais os limites para manter a atenção de sereshumanos ao interagirem com sistemas de

informações?

23

Page 24: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

24

Page 25: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Até 100 milissegundosAté 100 milissegundosTer a sensação de instantâneo.

Até 1 segundoAté 1 segundoTer a sensação de continuidade.

25

Page 26: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Entre 1 e 10 segundosEntre 1 e 10 segundosManter a atenção enquanto aguarda.

Acima de 10 segundosAcima de 10 segundosAtenção perdida.

26

Page 27: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

19681968

2019?2019?

27

Page 28: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

FPS (FPS (quadros por segundoquadros por segundo))

Olho humano:

12 FPS12 FPSTela de um celular moderno:

60 FPS60 FPS28

Page 29: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Olho humano (12 FPS):

83 milissegundos83 milissegundos

Tela de um celular moderno (60 FPS):

16 milissegundos16 milissegundos

29

Page 30: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Até 16 milissegundosAté 16 milissegundosNão existe diferença real para renderização.

Mais que

100 milissegundos100 milissegundosSeres humanos perdem a percepção de

instantâneo.30

Page 31: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Renderização progressivaRenderização progressiva

https://developers.google.com

31

Page 32: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Diretrizes para tempoDiretrizes para tempode respostade resposta

32

Page 33: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

API's:

Idealmente, mantenha tudo abaixo de

100 milissegundos100 milissegundos

Nunca ultrapasse os

200 milissegundos200 milissegundos33

Page 34: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Interfaces:

Idealmente, renderize tudo em até

100 milissegundos100 milissegundos

Utilize técnicas de renderização progressiva enunca ultrapasse

1 segundo1 segundo34

Page 35: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Qual problemaQual problemaqueremos resolver?queremos resolver?

35

Page 36: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

enjoei.com.brenjoei.com.br

Marketplace de moda com milhões de produtos

que precisa:

Fazer buscas em todos esses milhões deprodutos;Aguentar picos de acessos por conta deprogramas na TV.

36

Page 37: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O cenárioO cenário

Altos custos com infraestrutura;Tempo de resposta acima dos 200milissegundos;Grande di�culdade em aguentar picos deacessos instantâneos.

37

Page 38: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

CaracterísticasCaracterísticas

API's em Ruby on Rails;Muito código legado;Elasticsearch com problemas de performance.

38

Page 39: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como escolhemos Go?Como escolhemos Go?

39

Page 40: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

"Não dá mais.""Não dá mais."

40

Page 41: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O custo de reescrever tudoO custo de reescrever tudo"Se for pra mudar, tem que valer a pena."

"Será que precisa mesmo?"https://roda.jeremyevans.net/

41

Page 42: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

42

Page 43: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

https://www.techempower.com/benchmarks/

43

Page 44: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

E o roda?

44

Page 45: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

E o roda? ...

45

Page 46: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

E o roda?

46

Page 47: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

"Se for pra mudar, tem que valer a pena.""Se for pra mudar, tem que valer a pena."

47

Page 48: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Ruby,

até mais, e obrigado pelos peixes!

48

Page 49: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Should I Rust, or Should I Go? https://codeburst.io

49

Page 50: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Muitos testes, estudos e benchmarks depois:

Let's Go!Let's Go!

Sempre no top 3 de qualquer benchmark;Mais opções de bibliotecas;Curva de aprendizado menor;Maior produtividade no dia a dia.

50

Page 51: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

package main import "fmt" func main() { fmt.Println("hello world") }

51

Page 52: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

E agora?E agora?

52

Page 53: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como servir dados via HTTP?Como servir dados via HTTP?Sem reinventar a roda ou fazer tudo na mão.

Equilíbrio entre alta performance e usabilidade.

Nossa escolha:

https://github.com/go-chi/chi

53

Page 54: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

router := chi.NewRouter() router.Use( middleware.Logger, render.SetContentType(render.ContentTypeJSON), ) router.Get("/status", statusHandler) func statusHandler(w http.ResponseWriter, r *http.Request) { w.Write([]byte("ok")) } http.ListenAndServe(":8484", router)

54

Page 55: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Primeira surpresaPrimeira surpresa

55

Page 56: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

9,991µs9,991µs

µsµs56

Page 57: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

µsµssigni�ca

microssegundosmicrossegundos

57

Page 58: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

1 segundo1 segundoé igual a

1 mil milissegundos1 mil milissegundosque é igual a

1 milhão de microssegundos1 milhão de microssegundos

58

Page 59: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

9,991µs9,991µsé igual a

0,000009991 segundos0,000009991 segundos

59

Page 60: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como trabalhamosComo trabalhamoscom Elasticsearch?com Elasticsearch?

60

Page 61: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Do jeito errado.Do jeito errado.

61

Page 62: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O que aprendemos:O que aprendemos:

É a melhor opção para buscas complexas em umvolume enorme de dados.

É tão simples e prático que mesmo fazendo tudoerrado ele funciona.

A modelagem dos seus documentos é tudo.

62

Page 63: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O que aprendemos:O que aprendemos:

Não tentar usar o mesmo índice para responderperguntas diferentes.

"keyword" ao invés de "text" faz toda diferença.

Scripts são malignos.

Arredondar datas economiza muito dinheiro.

63

Page 64: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como ler dados doComo ler dados doElasticsearch com Go?Elasticsearch com Go?

Nossa escolha:

https://github.com/olivere/elastic

64

Page 65: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

client, _ := elastic.NewClient( elastic.SetURL("http://127.0.0.1:9201")) searchResult, _ := client.Search(). Index("products"). Query(elastic.NewTermQuery("title", "sandália preta")). Do(context.Background()) var product Product for _, p := range searchResult.Each(reflect.TypeOf(product)) { product := p.(Product) fmt.Printf("%s", product.Title) }

65

Page 66: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O primeiro problema...O primeiro problema...

"Já ví esse �lme antes..."

66

Page 67: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Elasticsearch Query DSLElasticsearch Query DSL

Uma lição que aprendemos:

Toda biblioteca que tenta criar uma abstração paraElasticsearch resulta em código que ninguém

entende.

67

Page 68: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Funciona bem para SQLFunciona bem para SQL

68

Page 69: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

User.where(name: 'David', occupation: 'Code Artist') .order(created_at: :desc) User.where(email: '[email protected]').first User.where('update_at > ?', 1989).each do |user| puts user.name end

69

Page 70: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

user := &User{} db.Model(user) .Where("name", "David").Where("occupation", "Code Artist") .Order("created_at DESC").Select() db.Model(user).Where("email", "[email protected]").Select() var users []User db.Model(&users).Where('update_at > ?', 1989).Select() for _, user := range users { fmt.Printf("%s", user.Name) }

70

Page 71: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Não funciona bem paraNão funciona bem paraElasticsearchElasticsearch

71

Page 72: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

query do script_fields distance: { script: "doc['location'].distance(lat, lon)", params: {lat: latitude, lon:longitude} } fields ['_source'] query do filtered do query do multi_match do query str fields %w[title name] end

72

Page 73: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

query := elastic.NewMatchAllQuery() aggs := elastic.NewDateHistogramAggregation(). Field("time"). Interval("hour"). Format("yyyy-MM-dd HH") aggs.SubAggregation( "count", elastic.NewSumAggregation().Field("no_of_hits")) searchResult, _ := client.Search(). Index("my_index"). Type("_doc"). Query(query). Aggregation("date", aggs). Do(ctx) hour_agg, found := searchResult.Aggregations.Terms("date")

73

Page 74: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Qual a solução então?Qual a solução então?

74

Page 75: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Templates JSONTemplates JSON

75

Page 76: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

{ "size": 10, "query": { "bool": { "must": { "match": { "title": "vestido" } }, "filter": { { "term": { "color": "vermelho" } } } } } }

76

Page 77: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Qual engine de templates?Qual engine de templates?Equilíbrio entre alta performance e usabilidade.

Nossa escolha:

https://github.com/shiyanhui/hero

77

Page 78: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

78

Page 79: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

79

Page 80: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

<%: func SearchProducts(term string, color string) %> { "size": 10, "query": { "bool": { "must": { "match": { "title": "<%==s term %>" } }, "filter": { { "term": { "color": "<%==s color %>" } } } } } }

80

Page 81: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

func Search() { jsonBody := new(bytes.Buffer) templates.SearchProducts("vestido", "vermelho", jsonBody) products := elastic.RequestFromJson( "GET", "/products/_search", jsonBody) }

81

Page 82: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Precisa da biblioteca para Elasticsearch então?Precisa da biblioteca para Elasticsearch então?

SimSimControle de conexões com o Elasticsearch;Autenticação do cliente;Parser de resultados;Bulk API para inserção de dados.

https://github.com/olivere/elastic

82

Page 83: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Onde entra GraphQLOnde entra GraphQLna história?na história?

83

Page 84: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como funciona conceitualmenteComo funciona conceitualmente

84

Page 85: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Teoria dos grafosTeoria dos grafos

85

Page 86: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Representação de recursosRepresentação de recursos

86

Page 87: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Um produto e o seu vendedorUm produto e o seu vendedor

87

Page 88: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

product(id: 8945) { title seller { name } }

88

Page 89: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

query productQuery($id: ID!) { product(id: $id) { title seller { name } } } }

{ "id": 8945 }

89

Page 90: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

{ "data": { "product": { "title": "vestido vermelho", "seller": { "name": "beatriz" } } } }

90

Page 91: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

PaginaçãoPaginação

91

Page 92: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Paginação baseada em OffsetPaginação baseada em Offset

92

Page 93: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Esqueça paginaçãoEsqueça paginaçãobaseada em Offsetbaseada em Offset

93

Page 94: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Paginação baseada em Cursores:Paginação baseada em Cursores:

94

Page 95: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Metadados nas conexões e arestasMetadados nas conexões e arestas

95

Page 96: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como esses dados sãoComo esses dados sãorepresentados?representados?

96

Page 97: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Representação simplifcada:{ "product": { "title": "vestido vermelho", "seller": { "name": "lojinha da bia" } } }

97

Page 98: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Representação com conexões e arestas:{ "user": { "productConnection": { "totalCount": 37, "productEdges": [ { "node": { "title": "vestido vermelho" }, "cursor": "726" } ] } } }

98

Page 99: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como paginar os dados:query userProducts($user_id: ID!, $first: Int, $after: ID) { user(id: $user_id) { products(first: $first, after: $after) { totalCount edges { node { title } cursor } } } }

{ "user_id": 1873, "first": 10, "after": "726" }

99

Page 100: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

A estrutura de uma buscaA estrutura de uma busca

100

Page 101: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como uma busca é feita:query Search($search: Search, $first: Int, $after: ID) { search(search: $search) { term products(first: $first, after: $after) { totalCount edges { node { title seller { name } } cursor } } } }

{ "search": { "term": "vestido vermelho" }, "first": 10, "after": "236" }

101

Page 102: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

O resultado:"search": { "term": "vestido vermelho", "products": { "totalCount": 152836, "edges": [ { "node": { "title": "vestido vermelho", "seller": { "name": "beatriz" } }, "cursor": "245" } ] } }

102

Page 103: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

FragmentosFragmentos

103

Page 104: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

fragment productWithSeller on Product { title seller { name } }

104

Page 105: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

search(search: $search) { products(first: $first, after: $after) { edges { node { ...productWithSeller } } } }

product(id: $id) { ...productWithSeller }

105

Page 106: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Mas por que tudo issoMas por que tudo issoimporta?importa?

106

Page 107: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Em uma interfaceEm uma interface

107

Page 108: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Diversas requisições diferentesDiversas requisições diferentesGET /current_userGET /product/7GET /product/7/sellerGET /product/7/comment/4

108

Page 109: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

440 milissegundos440 milissegundosem 1 requisição

109

Page 110: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Agora imagine fazer isso...Agora imagine fazer isso...

4 vezes;4 vezes;Servidor nos EUA;Servidor nos EUA;Celular com 3G.Celular com 3G.

110

Page 111: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

100 milissegundos100 milissegundosSensação de instantâneo.Sensação de instantâneo.

111

Page 112: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

1 requisição para resolver tudo:currentUser { name gender } product { title price seller { name } comments { author { name } message replies { author { name } message } } }

112

Page 113: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

GraphQL + GoGraphQL + Go

113

Page 114: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

GoroutinesGoroutines

114

Page 115: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

var waitGroup sync.WaitGroup user := &User{} product := &Product{} waitGroup.Add(1) go loadUser(&waitGroup, user) waitGroup.Add(1) go loadProduct(&waitGroup, product) waitGroup.Wait()

115

Page 116: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Como servir dados viaComo servir dados viaGraphQL?GraphQL?

Equilíbrio entre alta performance e usabilidade.

Nossa primeira tentativa:

https://github.com/graphql-go/graphql

116

Page 117: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

graphql.NewObject( graphql.ObjectConfig{ Name: "GraphQL", Fields: fields}) graphql.ObjectConfig{ Name: "Query", Fields: graphql.Fields{ "source": &graphql.Field{Type: graphql.String}}}) graphql.NewSchema(graphql.SchemaConfig{Query: queryType}) var query_args = graphql.FieldConfigArgument{ "term": &graphql.ArgumentConfig{Type: graphql.String}, var Query = &graphql.Field{ Type: gq.Query, Args: query_args, Resolve: resolvers.Query,}

117

Page 118: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Verboso;Verboso;Complexo;Complexo;Confuso;Confuso;

Nada produtivo.Nada produtivo.

118

Page 119: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Schema basedSchema based

119

Page 120: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

type Query { user(id: ID!): User product(id: ID!): Product } type User { id: ID name: String } type Product { id: ID title: String seller: User }

120

Page 121: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Nossa segunda tentativa:

https://github.com/99designs/gqlgen

121

Page 122: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Geração de código;Geração de código;Funcionamento obscuro;Funcionamento obscuro;

Muita mágica.Muita mágica.

122

Page 123: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Nossa escolha �nal:

https://github.com/graph-gophers/graphql-go

123

Page 124: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

type Query { user(id: ID!): User product(id: ID!): Product } type User { id: ID name: String } type Product { id: ID title: String seller: User }

124

Page 125: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

type UserResolver struct { Field fields.Field `graphql:"user"` Model models.User } func (resolver *Resolver) User(id params.Id) *UserResolver { return &UserResolver{Model: userModel.Find(id)} } func (userResolver *UserResolver) Name() *string { return &userResolver.Model.Name }

125

Page 126: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Simples;Simples;Direto ao ponto;Direto ao ponto;

Paralelismo por padrão.Paralelismo por padrão.

126

Page 127: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Paralelismo por padrão:user { name } product { title comments { message author { name } } }

127

Page 128: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

128

Page 129: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tem como melhorar?Tem como melhorar?

SimSim129

Page 130: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

requested-fieldsrequested-fieldshttps://github.com/gbaptista/requested-�elds

130

Page 131: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

hasComments := fields.RequestedForAt(ctx, productResolver, "comments") hasCommentAuthor := fields.RequestedForAt(ctx, productResolver, "comments.author") if hasComments { waitGroup.Add(1) go loadCommentsFor(productResolver.Model) } if hasCommentAuthor { waitGroup.Add(1) go loadCommentAuthorsFor(productResolver.Model) }

131

Page 132: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

132

Page 133: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tem como melhorar?Tem como melhorar?

SimSim133

Page 134: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

134

Page 135: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

ResultadosResultados

135

Page 136: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Throughput suportado (rpm)Throughput suportado (rpm)

136

Page 137: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Tempo de respostaTempo de resposta

137

Page 138: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

ServidoresServidores

138

Page 139: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

ElasticserachElasticserach

139

Page 140: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

ReflexõesReflexões

140

Page 141: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Não se apegue aNão se apegue atecnologias.tecnologias.

141

Page 142: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Ruby é incrível, mas nãoRuby é incrível, mas nãoprecisa resolver tudo.precisa resolver tudo.

Go é só uma dasGo é só uma dasopções.opções.

142

Page 143: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Os problemas deOs problemas deamanhã serão maioresamanhã serão maiores

que os de hoje.que os de hoje.Rust está vindo com tudo.Rust está vindo com tudo.

143

Page 144: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Sempre tem comoSempre tem comomelhorar.melhorar.

144

Page 145: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Ainda podemos:Ainda podemos:Usar HTTP2 ao invés de HTTP1;Usar HTTP2 ao invés de HTTP1;

Usar gRPC como protocolo de comunicação;Usar gRPC como protocolo de comunicação;

Criar estratégias agressivas de cache;Criar estratégias agressivas de cache;

Trabalhar com WebAssembly no navegador.Trabalhar com WebAssembly no navegador.

145

Page 146: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Não vai ficar perfeito.Não vai ficar perfeito.E tudo bem.

146

Page 147: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

query( $products: ProductSearch, $first: Int, $after: ID ) { search(search: $products) { term products(first: $first, after: $after) { edges { node { title } cursor } } } }

147

Page 148: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

query( $products: ProductSearch, $users: UserSearch, $first: Int, $after: ID ) { search(products: $products, users: $users) { term products(first: $first, after: $after) { edges { node { title } cursor } } users(first: $first, after: $after) { edges { node { name } cursor } } } }

148

Page 149: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Estudar novas linguagens abreEstudar novas linguagens abrea sua mente e acaba sendoa sua mente e acaba sendo

divertido.divertido.Não tenha medo.

149

Page 150: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

150

Page 151: com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL e Elasticsearch Guilherme Baptista TDC Florianópolis - Trilha Go, Abril de 2019

Obrigado!Obrigado!

https://github.com/gbaptista

https://www.linkedin.com/in/guilhermebaptista

151