Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

InterCon 2016 - Software as a service usando Go como principal linguagem: os cases globo.com

283 views

Published on

Andrews Medina, Software Engineer da Globo.com fala sobre Software as a service usando Go como principal linguagem: os cases globo.com no InterCon 2016.
Saiba mais em http://intercon2016.imasters.com.br/

Published in: Technology
  • Be the first to comment

  • Be the first to like this

InterCon 2016 - Software as a service usando Go como principal linguagem: os cases globo.com

  1. 1. Software as a service usando Go Andrews Medina
  2. 2. Who Am I ● Desenvolvedor na Globo.com desde 2008 ● Criado de projetos open source como Splinter e tsuru
  3. 3. tsuru.io
  4. 4. tsuru.io ● Torna deploys rápidos e simples ● Suporta Go, Ruby, Python, PHP, Java… ● Open source
  5. 5. tsuru.io $ tsuru app-deploy -a myapp -i dockerimage
  6. 6. tsuru.io $ tsuru app-deploy -a myapp -i grafana/grafana
  7. 7. Go ● Começou em 2007 por Robert Griesemer, Ken Thompson, and Rob Pike ● Aberta em 2009
  8. 8. Quem usa Go?
  9. 9. Quem usa Go?
  10. 10. Hello World! package main import "fmt" func main() { fmt.Println("Hello, 世界!") }
  11. 11. motivação
  12. 12. Escalar maquinas
  13. 13. Rápida e eficiente para computadores
  14. 14. Tipagem estática var users []User
  15. 15. Compilada $ go build ./main
  16. 16. Suporte a concorrência
  17. 17. Goroutines go sort(s[:i]) go sort(s[i:])
  18. 18. Goroutines go sort(s[:i]) go sort(s[i:])
  19. 19. Canais func compute(ch chan int) { ch <- someComputation() } func main() { ch := make(chan int) go compute(ch) result := <-ch }
  20. 20. Canais func compute(ch chan int) { ch <- someComputation() } func main() { ch := make(chan int) go compute(ch) result := <-ch }
  21. 21. Divertida e rápida para os seres humanos
  22. 22. Linguagem enxuta e simples
  23. 23. Inferência de tipos numbers := int{1, 2, 3}
  24. 24. Interfaces e duck typing type Closes interface { Close() }
  25. 25. Biblioteca padrão rica ● Encoding (json, xml) ● http ● html (template) ● image ● crypto
  26. 26. http func main() { http.HandleFunc("/hello", handleHello) http.ListenAndServe("localhost:7777", nil) } func handleHello(w http.ResponseWriter, req *http.Request) { fmt.Fprintln(w, "Hello, 世界!") }
  27. 27. http + encoding type user struct { Name string } func userHandler (w http.ResponseWriter, r *http.Request) { u := user{Name: “andrews”} b, err := json.Marshal(u) if err != nil { panic(err) } w.Write(b) }
  28. 28. Compilação rápida $ go build ./main
  29. 29. Cross compilation $ GOOS=linux GOARCH=amd64 go build ./main
  30. 30. gofmt $ gofmt
  31. 31. gofmt func main() { http.HandleFunc("/hello", handleHello) http.ListenAndServe("localhost:7777", nil) }
  32. 32. gofmt func main() { http.HandleFunc("/hello", handleHello) http.ListenAndServe("localhost:7777", nil) }
  33. 33. race detector $ go (run|test) -race
  34. 34. race detector func main() { start := time.Now() var t *time.Timer t = time.AfterFunc(randomDuration(), func() { t.Reset(randomDuration()) }) time.Sleep(5 * time.Second) } func randomDuration() time.Duration { return time.Duration(rand.Int63n(1e9)) }
  35. 35. race detector panic: runtime error: invalid memory address or nil pointer dereference [signal 0xb code=0x1 addr=0x8 pc=0x41e38a] goroutine 4 [running]: time.stopTimer(0x8, 0x12fe6b35d9472d96) src/pkg/runtime/ztime_linux_amd64.c:35 +0x25 time.(*Timer).Reset(0x0, 0x4e5904f, 0x1) src/pkg/time/sleep.go:81 +0x42 main.func·001() race.go:14 +0xe3 created by time.goFunc src/pkg/time/sleep.go:122 +0x48
  36. 36. race detector ================== WARNING: DATA RACE Read by goroutine 5: main.func·001() race.go:14 +0x169 Previous write by goroutine 1: main.main() race.go:15 +0x174 Goroutine 5 (running) created at: time.goFunc() src/pkg/time/sleep.go:122 +0x56 timerproc() src/pkg/runtime/ztime_linux_amd64.c:181 +0x189 ==================
  37. 37. profiling ● Profiler de memória e cpu ● Benchmarks automatizados
  38. 38. Go na Globo.com
  39. 39. tsuru.io
  40. 40. tsuru ● ~300 deploys por dia ● ~800 aplicações ● ~1400 units
  41. 41. tsuru ● Api REST ● Command line interface ● agents
  42. 42. tsuru (vantagens) ● Baixo overhead ● Cross compile (windows, linux, mac) ● Performance, no-blocking I/O, concorrência e paralelismo
  43. 43. tsuru (vantagens) ● Debug tools ● Padrão (gofmt, govet) ● Race detector (go test -race)
  44. 44. ID ● Api REST
  45. 45. ID (vantagens) ● Performance ● Simplicidade
  46. 46. Cartola ● Api REST ● Command line interface ● agents
  47. 47. Cartola ● 7 milhões de jogadores ● 500 mil simultâneos
  48. 48. Cartola ● Api REST ● Processamento em background
  49. 49. Cartola ● Performance sem precisar “escovar bits” ● Antes 24 máquinas com 24 cores ● Agora 24 máquinas com 4 cores
  50. 50. Simples e consistente
  51. 51. Fácil de aprender
  52. 52. Boa para máquina, boa para humanos
  53. 53. Dúvidas? ● github.com/andrewsmedina ● twitter.com/andrewsmedina

×