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://go.dev/talks/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
