juju - google go in a scalable environment

Post on 14-May-2015

1.818 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

Talk about Ubuntu Juju, a tool for the deployment and configuration of services in clouds and how Go helps to develop it.

TRANSCRIPT

Juju ‑ Google Go in a scalable Environment

Frank Müller / Oldenburg / Germany

Introduction

Frank Müller

Born 1965 in Oldenburg

SoftwareDevelopment

since 1984

Author since 1999

Book about Go in 2011

Well known scenario

Wordpress

MySQL

Different in clouds

Wordpress Wordpress

MySQL

Scaling means effort

Juju for provisioning

Amazon Web Services

OpenStack

LocalMAAS

Microsoft Azure

Create your environment

juju init -wjuju bootstrap

State

Add and relate services

State

juju deploy cs:precise/wordpressjuju deploy cs:precise/mysqljuju add-relation wordpress mysql

Wordpress

MySQL

Add another unit

State

Wordpress

MySQL

Wordpress

juju add-unit wordpress

Scale!

State

memcached

MySQL

Wordpress

juju add-unit -n2 wordpressjuju deploy memcachedjuju add-relation wordpress memcached

Also web UI available

Why Google Go?

Architectural insights

State - Watcher - Worker

State

Provisioner

Firewaller

Machiner

Deployer

Uniter

CollectionsIndividual ObjectsLifecycles

Client

Agent

Lots of concurrent work

State

Worker

Goroutine

Goroutine

Worker

Goroutine

Goroutine

Firewaller

State Main LoopEnvironment Configuration

Machines

machind Loop

Machine Units

unitd Loop

serviced Loop

Ports

Exposes

Goroutine control

Monitoring and stopping

• not part of the language spec• launchpad.net/tomb• signals to leave loops• wait until goroutine stopped• leave in case of an error• remember and retrieve that error

Loops with tomb

// loop processes ...func (t *T) loop() {

defer t.tomb.Done()for {

select {case <-t.tomb.Dying:

// Cleanup ...return

case f := <-t.fooChan:if err := t.foo(f); err != nil {

t.tomb.Kill(err)}

case b := <-t.barChan:// ...

}}

}

Stop and error handling

// Stop ends the main loop.func (t *T) Stop() error {

t.tomb.Kill(nil)return t.tomb.Wait()

}

// Err retrieves the error in case the backend loop died.func (t *T) Err() error {

return t.tomb.Err()}

Interfaces

Define behaviors

type StorageReader interface {Get(name string) (io.ReadCloser, error)List(prefix string) ([]string, error)URL(name) (string, error)

}

type StorageWriter interface {Put(name string, r io.Reader, length int64) errorRemove(name string) error

}

type Storage interface {StorageReaderStorageWriter

}

Like a toolbox

Storage

EC2

OpenStack

MAAS

Azure

DummyEnviron

Also help in tests

type Foo interface {DoThis(with That) error

}

type MyFoo struct { ... }

func (m *MyFoo) DoThis(with That) error { ... }

type MockFoo struct { ... }

func (m *MockFoo) DoThis(with That) error { ... }

func Bar(f Foo, t That) error {return f.DoThis(t)

}

What else?

• extreme fast builds• cross-compilation• binaries are simple to deploy• table-driven tests• benchmarks and race detection• go get always takes tip!

Questions?

top related