| # Go at Heroku |
| 21 Apr 2011 |
| Tags: guest |
| Summary: _This week’s blog post is written by_ [_Keith Rarick_](http://xph.us/) _and_ [_Blake Mizerany_](http://itsbonus.heroku.com/), _systems engineers at_ [Heroku](http://www.heroku.com/). _In their own words, they "eat, drink, and sleep distributed systems." Here they discuss their experiences using Go._ |
| OldURL: /go-at-heroku |
| |
| Keith Rarick |
| |
| Blake Mizerany |
| |
| ## |
| |
| _This week’s blog post is written by_ [_Keith Rarick_](http://xph.us/) |
| _and_ [_Blake Mizerany_](http://itsbonus.heroku.com/), |
| _systems engineers at_ [Heroku](http://www.heroku.com/). |
| _In their own words, they "eat, drink, and sleep distributed systems." Here they discuss their experiences using Go._ |
| |
| A big problem that comes with building distributed systems is the coordination |
| of physical servers. |
| Each server needs to know various facts about the system as a whole. |
| This critical data includes locks, configuration data, |
| and so on, and it must be consistent and available even during data store failures, |
| so we need a data store with solid consistency guarantees. |
| Our solution to this problem is [Doozer](http://xph.us/2011/04/13/introducing-doozer.html), |
| a new, consistent, highly-available data store written in Go. |
| |
| At Doozer's core is [Paxos](http://en.wikipedia.org/wiki/Paxos_(computer_science)), |
| a family of protocols for solving consensus in an unreliable network of unreliable nodes. |
| While Paxos is essential to running a fault-tolerant system, |
| it is notorious for being difficult to implement. |
| Even example implementations that can be found online are complex and hard to follow, |
| despite being simplified for educational purposes. |
| Existing production systems have a reputation for being worse. |
| |
| Fortunately, Go's concurrency primitives made the task much easier. |
| Paxos is defined in terms of independent, |
| concurrent processes that communicate via passing messages. |
| In Doozer, these processes are implemented as goroutines, |
| and their communications as channel operations. |
| In the same way that garbage collectors improve upon malloc and free, |
| we found that [goroutines and channels](https://blog.golang.org/2010/07/share-memory-by-communicating.html) |
| improve upon the lock-based approach to concurrency. |
| These tools let us avoid complex bookkeeping and stay focused on the problem at hand. |
| We are still amazed at how few lines of code it took to achieve something |
| renowned for being difficult. |
| |
| The standard packages in Go were another big win for Doozer. |
| The Go team is very pragmatic about what goes into them. |
| For instance, a package we quickly found useful was [websocket](https://golang.org/pkg/websocket/). |
| Once we had a working data store, we needed an easy way to introspect it |
| and visualize activity. |
| Using the websocket package, Keith was able to add the web viewer on his |
| train ride home and without requiring external dependencies. |
| This is a real testament to how well Go mixes systems and application programming. |
| |
| One of our favorite productivity gains was provided by Go's source formatter: |
| [gofmt](https://golang.org/cmd/gofmt/). |
| We never argued over where to put a curly-brace, |
| tabs vs. spaces, or if we should align assignments. |
| We simply agreed that the buck stopped at the default output from gofmt. |
| |
| Deploying Doozer was satisfyingly simple. |
| Go builds statically linked binaries which means Doozer has no external dependencies; |
| it's a single file that can be copied to any machine and immediately launched |
| to join a cluster of running Doozers. |
| |
| Finally, Go's maniacal focus on simplicity and orthogonality aligns with |
| our view of software engineering. |
| Like the Go team, we are pragmatic about what features go into Doozer. |
| We sweat the details, preferring to change an existing feature instead of |
| introducing a new one. |
| In this sense, Go is a perfect match for Doozer. |
| |
| We already have future projects in mind for Go. Doozer is just the start of much bigger system. |