com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL...

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

Transcript of com GraphQL e Elasticsearch Busca de alta performance€¦ · Busca de alta performance com GraphQL...

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