Program your next server in Go

Sameer Ajmani
Manager, Go team
Google
@Sajma
sameer@golang.org

* Video

This talk was presented at the [[http://applicative.acm.org/][ACM Applicative]] conference in New York City on June 1, 2016.

.link https://www.youtube.com/watch?v=5bYO60-qYOI Watch the talk on YouTube

* Outline

1. What is Go, and who uses it?
2. Comparing Go and other languages
3. Code examples
4. Concurrency
5. Getting started

* What is Go?

"Go is an open source programming language that makes it easy to build simple, reliable, and efficient software."

.link http://golang.org

* History

Design began in late 2007.

- Robert Griesemer, Rob Pike, and Ken Thompson.
- Ian Lance Taylor and Russ Cox.

Open source since 2009 with a very active community.

Language stable as of Go 1, early 2012.

Go 1.7 is coming this August.

* Why Go?

Go is an answer to problems of scale at Google.

.image ../2012/splash/datacenter.jpg 500 _

* System Scale

- designed to scale to 10⁶⁺ machines
- everyday jobs run on 1000s of machines
- jobs coordinate, interact with others in the system
- lots going on at once

Solution: great support for concurrency

.image ../2012/waza/gophercomplex6.jpg

* A Second Problem: Engineering Scale

In 2011:

- 5000+ developers across 40+ offices
- 20+ changes per minute
- 50% of code base changes every month
- 50 million test cases executed per day
- single code tree

Solution: design the language for large code bases

* Who uses Go at Google?

Hundreds of projects. Thousands of Go programmers. Millions of lines of Go code.

Public examples:

- Flywheel: SPDY proxy for Chrome on mobile devices

.image applicative/spdy.png 400 _

* Who uses Go at Google?

Hundreds of projects. Thousands of Go programmers. Millions of lines of Go code.

Public examples:

- Flywheel: SPDY proxy for Chrome on mobile devices
- dl.google.com: Download server for Chrome, ChromeOS, Android SDK, Earth, etc.
- Vitess: YouTube MySQL balancer
- Seesaw: Linux Virtual Server (LVS) based load balancer
- Lingo: Logs analysis in Go, migrated from Sawzall

The target is networked servers, but Go is a great general-purpose language.

* Who uses Go besides Google?

.link http://golang.org/wiki/GoUsers

Aerospike, BBC Worldwide, Bitbucket, Booking.com, Core OS, Datadog, Digital Ocean, Docker, Dropbox, Facebook, Getty Images, GitHub, GOV.UK, Heroku, IBM, Intel, InfluxDB, Iron.io, Kubernetes, Medium, MongoDB, Mozilla services, Netflix, New York Times, pool.ntp.org, Rackspace, Shutterfly, SmugMug, SoundCloud, SpaceX, Square, Stack Exchange, Thomson Reuters Eikon, Tumblr, Twitch, Twitter, Uber, VMWare ...

.image ../2014/state-of-go/bus.jpg 300 _

* Comparing Go and other languages

* "Go: 90% Perfect, 100% of the time" -bradfitz, 2014

.image ../2014/gocon-tokyo/funfast.svg

# Brad Fitzpatrick, GoCon Tokyo, May 2014

* Go has much in common with Java

- C family (imperative, braces)
- Statically typed
- Garbage collected
- Memory safe (nil references, runtime bounds checks)
- Variables are always initialized (zero/nil/false)
- Methods
- Interfaces
- Type assertions (`instanceof`)
- Reflection

* Go differs from Java in several ways

Fast, efficient for computers:

- Programs compile to machine code.  There's no VM.
- Control over memory layout, fewer indirections

Fun, fast for humans:

- Simple, concise syntax
- Statically linked binaries
- Function values and lexical closures
- Built-in strings (UTF-8)
- Built-in generic maps and arrays/slices
- Built-in concurrency

* Go intentionally leaves out many features

- No classes
- No inheritance
- No constructors
- No `final`
- No exceptions
- No annotations
- No user-defined generics

* Why does Go leave out those features?

Clarity is critical.

When reading code, it should be clear what the program will do.

When writing code, it should be clear how to make the program do what you want.

Sometimes this means writing out a loop instead of invoking an obscure function.

(Don't DRY out.)

For more background on design:

- [[http://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html][Less is exponentially more (Pike, 2012)]]
- [[http://talks.golang.org/2012/splash.article][Go at Google: Language Design in the Service of Software Engineering (Pike, 2012)]]

* Code examples

* Go looks familiar

Hello, world!

.play applicative/hello/hello.go

* Hello, web server

.play applicative/hello/server.go

Types follow names in declarations.
Exported names are Capitalized.  Unexported names are not.

* Example: Google Search frontend

.play applicative/frontend.go /func main/,/func handleSearch/

.link http://localhost:8080/search
.link http://localhost:8080/search?q=golang
.link http://localhost:8080/search?q=golang&output=json
.link http://localhost:8080/search?q=golang&output=prettyjson

* Validate the query

.code applicative/frontend.go /func handleSearch/,/ENDQUERY/

`FormValue` is a method on the type `*http.Request`:

  package http
  type Request struct {...}
  func (r *Request) FormValue(key string) string {...}

`query`:=`req.FormValue("q")` initializes a new variable `query` with
the type of the expression on the right hand side, `string`.

* Fetch the search results

  import "golang.org/x/talks/content/2016/applicative/google"

.code applicative/frontend.go /Run the Google search/,/ENDSEARCH/

`Search` returns two values, a slice of results and an error.
The results are valid only if the error is nil.

  type error interface {
      Error() string // a useful human-readable error message
  }

Errors may contain additional information, accessed via type assertions.

* Structure the search results

.code applicative/frontend.go /Create the structured/,/ENDRESPONSE/

The `response` type is defined locally within `handleSearch`.

The `google.Result` type is exported from package `google`:

  package google

  type Result struct { Title, URL string }

The `resp` variable is initialized to a `response` value using a composite struct literal.


* Render the search results

.code applicative/frontend.go /Render the response/,/ENDRENDER/

Each case writes bytes to an `io.Writer`:

  type Writer interface {
          Write(p []byte) (n int, err error)
  }

`http.ResponseWriter` implements the `io.Writer` interface.

* HTML templates operate on Go values

.play applicative/frontend.go /var responseTemplate/,/\)\)/

.image applicative/frontend-screenshot.png _ 900

* That's it for the search handler

All the packages are from the standard library:

  import (
      "encoding/json"
      "fmt"
      "html/template"
      "log"
      "net/http"
      "time"
  )

Go servers scale well: each request runs in its own _goroutine_.

Let's talk about concurrency.

* Communicating Sequential Processes (Hoare, 1978)

Concurrent programs are structured as independent processes that
execute sequentially and communicate by passing messages.

Sequential execution is easy to understand.  Async callbacks are not.

*Go*primitives:* goroutines, channels, and the `select` statement.

* Goroutines

Goroutines are like lightweight threads.

They start with tiny stacks and resize as needed.

Go programs can have hundreds of thousands of them.

Start a goroutine using the `go` statement:

  go f(args)

The Go runtime schedules goroutines onto OS threads.

Blocked goroutines don't use a thread.

* Channels

Channels provide communication between goroutines.

  c := make(chan string)

  // goroutine 1
  c <- "hello!"

  // goroutine 2
  s := <-c
  fmt.Println(s) // "hello!"

* Select

A `select` statement blocks until communication can proceed.

  select {
  case x := <-in:
    fmt.Println("received", x)
  case out <- v:
    fmt.Println("sent", v)
  }

Only the selected case runs.

* Example: Google Search (backend)

Q: What does Google search do?

A: Given a query, return a page of search results (and some ads).

Q: How do we get the search results?

A: Send the query to Web search, Image search, YouTube, Maps, News, etc., then mix the results.

How do we implement this?

* Google Search: A fake framework

We can simulate a back end search with a random timeout up to 100ms.

.code applicative/google/fake.go /START2/,/STOP2/

* Google Search: Test the framework

.play applicative/google-serial.go /func.main/,/}/ HLsearch

* Google Search (serial)

The `Search` function takes a query and returns a slice of `Results`.

Search invokes the Web, Image, and Video searches serially, then constructs the `results` slice.

.code applicative/google/serial.go /func Search/,/^}/
.play applicative/google-serial.go /google.Search/

* Google Search (parallel)

Run the Web, Image, and Video searches concurrently, and wait for all results.

The `func` literals are closures over `query` and `c`.

.code applicative/google/parallel.go /func Search/,/^}/
.play applicative/google-parallel.go /google.Search/

* Google Search (timeout)

Don't wait for slow servers.

.code applicative/google/timeout.go /func Search/,/STOP/
.play applicative/google-timeout.go /google.Search/ HLsearch

* Avoid timeout

Q: How do we avoid discarding results from slow servers?

A: Replicate the servers.  Send requests to multiple replicas, and use the first response.

.code applicative/google/first.go /func First/,/^}/

* Using the First function

.play applicative/first.go /func main/,/^}/

* Google Search (replicated)

Reduce tail latency using replicated back ends.

.code applicative/google/first.go /START/,/STOP/
.play applicative/google-replicated.go /google.Search/

Go functions have simple, synchronous signatures.
The use of concurrency is encapsulated.

* What just happened?

In just a few simple transformations we used Go's concurrency primitives to convert a

- slow
- sequential
- failure-sensitive

program into one that is

- fast
- concurrent
- replicated
- robust.

No locks. No condition variables. No futures. No callbacks.

* Getting started

* You're interested in Go.  What next?

Take the Go Tour online.

.link http://tour.golang.org

Then go deeper ...

.link http://golang.org/wiki/Learn

Still interested?

Run a pilot project.

* Run a pilot project

Reduces the cost & risks of switching to a new technology,
while helping your organization discover the benefits.

1. Choose something small to write in Go (e.g., a microservice)
2. Build a prototype with a friend

- Find the libraries you need
- Integrate with editors & IDEs
- Integrate with build & test & deploy
- Learn how to debug & profile your program

3. Compare Go to what you use today

- Isolate the language change; try not to change anything else.

4. *Present*results*to*the*team*

* Go is designed for tooling

Go tools meet you where you are.  There's no one "Go IDE".

- IDE & editor integration: Eclipse, IntelliJ, VisualStudio, SublimeText, emacs, vim, ...
- [[http://play.golang.org][play.golang.org]]: online playground
- `gofmt`: automatic formatting
- `goimports`: automatic updates of package imports
- `gocode`: automatic completion
- the `go` tool: automatic fetch & build
- `guru`: static analysis, bug finding, code navigation
- [[http://godoc.org][godoc.org]]: open source package index and docs

* Where to Go next

Take the Go Tour online.

.link http://tour.golang.org

Lots more material.

.link http://golang.org/wiki/Learn

Great community.

.link http://golang.org/project
