Slide 1

Slide 1 text

SCALING MICRO- SERVICES WITH GO HIGH LOAD STRATEGY 2015 @mattheath

Slide 2

Slide 2 text

S TA R L I N G

Slide 3

Slide 3 text

monoliths traditional dev

Slide 4

Slide 4 text

Database Application

Slide 5

Slide 5 text

Database App App App Database App Load Balancer App App

Slide 6

Slide 6 text

SLOW
 DEVELOPMENT

Slide 7

Slide 7 text

SLOW
 RELEASE CYCLES

Slide 8

Slide 8 text

COMPLEX
 SOFTWARE

Slide 9

Slide 9 text

HARD
 TO SCALE

Slide 10

Slide 10 text

SCALE
 BREAKS
 HARDWARE

Slide 11

Slide 11 text

SPEED
 BREAKS
 SOFTWARE

Slide 12

Slide 12 text

Communication paths with two programmers Communication paths with three programmers Communication paths with four programmers Communication paths with five programmers Communication paths with ten programmers

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

“construct a highly agile and highly available service from ephemeral and assumed broken components”- Adrian Cockcroſt

Slide 15

Slide 15 text

A CLOUDY
 FUTURE

Slide 16

Slide 16 text

MICROSERVICES

Slide 17

Slide 17 text

transport layers COMMUNICATION

Slide 18

Slide 18 text

Database Service Service Service Load Balancer API / Routing Layer datacentre 1 Service Service Service Load Balancer API / Routing Layer RabbitMQ Message Bus RabbitMQ Message Bus Database datacentre n

Slide 19

Slide 19 text

No content

Slide 20

Slide 20 text

package handler import ( "..." ) func Foo(req *server.Request) (protobuf.Message, error) { }

Slide 21

Slide 21 text

service.Register( &service.Endpoint{ Name: "foo", Handler: handler.Foo, } )

Slide 22

Slide 22 text

deliveries, err := server.Listen() for delivery := range deliveries { go handleDelivery(delivery) }

Slide 23

Slide 23 text

func handleDelivery(delivery amqp.Delivery) { // Do something for this request response, err := executeRequest(delivery) // Send Response server.Respond(response) }

Slide 24

Slide 24 text

var tokens = make(chan bool, 1000) 
 func handleDelivery(delivery amqp.Delivery) { // Throttle requests // error handling omitted... select { case <-tokens: response, err := executeRequest(delivery) tokens <- true // replace token case <-time.After(500 * time.Millisecond): response, err := timeoutResponse() } // Send Response server.Respond(response) }

Slide 25

Slide 25 text

Logic Handler Storage Service

Slide 26

Slide 26 text

platform-library Library for building services that talk Protobuf via RMQ Logic Handler Storage Service

Slide 27

Slide 27 text

service-library Library for building services that talk Protobuf via RMQ Self-configuring external service adapters platform-library Logic Handler Storage Service

Slide 28

Slide 28 text

Services get for free: • Provisioning • Service discovery • Configuration • Monitoring • Authentication/authorisation • AB testing • Self configuring connectivity 
 to third-party services Service Library for building services that talk Protobuf via RMQ service-library platform-library Logic Handler Storage Self-configuring external service adapters

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

Provisioning Daemon Provisioning Daemon Provisioning Daemon CI Pipeline (Janky/Jenkins) Amazon S3 Provisioning Scheduler - eg. Marathon on Mesos

Slide 31

Slide 31 text

DEALING WITH COMPLEXITY

Slide 32

Slide 32 text

LOOSE
 COUPLING

Slide 33

Slide 33 text

ASYNC EVENT
 DRIVEN

Slide 34

Slide 34 text

TESTING

Slide 35

Slide 35 text

LOAD FAILURE DEGRADATION

Slide 36

Slide 36 text

MONITORING

Slide 37

Slide 37 text

DISTRIBUTED
 TRACING

Slide 38

Slide 38 text

api api.customer service.customer api api.customer service.customer

Slide 39

Slide 39 text

api api.customer service.customer api api.customer service.customer REQ REP REQ REP IN OUT IN OUT

Slide 40

Slide 40 text

{ "timestamp": 1410262798427145176, "traceId": "d30479b8-1491-4390-7cf5-4cd14bc4b765", "type": "OUT", "messageId": "a661f9ef-774c-49b2-6e74-cfed65f7d120", "parentMessageId": "", "from": “uk.co.starlingbank.webui”, "to": “uk.co.starlingbank.api.customer", "hostname": "ip-10-13-2-251", "az": "eu-west-1a", "handlerInstanceId": “server-18bd089e-8ef1-4ca1-75cb-8...c”, "duration": 11222094 } { "timestamp": 1410262798416053450, "traceId": "d30479b8-1491-4390-7cf5-4cd14bc4b765", "type": "REQ", "messageId": "6404dd1e-c995-48a9-73dc-9edb1380f0bf", "parentMessageId": "a661f9ef-774c-49b2-6e74-cfed65f7d120", "from": "uk.co.starlingbank.api.customer", "to": "uk.co.starlingbank.service.customer", "hostname": "ip-10-13-2-251", "az": "eu-west-1a" }

Slide 41

Slide 41 text

Tracing: 33eda743-f124-435c-71fc-3c872bbc98e6 2014-09-07 02:20:19.867 [/] [START] → - 2014-09-07 02:20:19.867 [eu-west-1a/ip-10-11-3-51] [REQ] uk.co.starlingbank.api → uk.co.starlingbank.api.customer.neardrivers - 2014-09-07 02:20:19.867 [eu-west-1a/ip-10-11-2-203] [IN] uk.co.starlingbank.api → uk.co.starlingbank.api.customer.neardrivers - 2014-09-07 02:20:19.868 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.feature-flags.features - 2014-09-07 02:20:19.869 [eu-west-1a/ip-10-11-3-111] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.feature-flags.features - 2014-09-07 02:20:19.876 [eu-west-1a/ip-10-11-3-111] [REQ] uk.co.starlingbank.service.feature-flags → uk.co.starlingbank.service.hob.list - 2014-09-07 02:20:19.877 [eu-west-1a/ip-10-11-3-168] [IN] uk.co.starlingbank.service.hob → uk.co.starlingbank.service.config.compile - 2014-09-07 02:20:19.877 [eu-west-1a/ip-10-11-3-111] [IN] uk.co.starlingbank.service.feature-flags → uk.co.starlingbank.service.hob.list - 2014-09-07 02:20:19.877 [eu-west-1a/ip-10-11-3-111] [REQ] uk.co.starlingbank.service.hob → uk.co.starlingbank.service.config.compile - 2014-09-07 02:20:19.883 [eu-west-1a/ip-10-11-3-168] [OUT] uk.co.starlingbank.service.hob → uk.co.starlingbank.service.config.compile - 5.59 ms 2014-09-07 02:20:19.886 [eu-west-1a/ip-10-11-3-111] [REP] uk.co.starlingbank.service.hob → uk.co.starlingbank.service.config.compile - 8.40 ms 2014-09-07 02:20:19.887 [eu-west-1a/ip-10-11-3-111] [OUT] uk.co.starlingbank.service.feature-flags → uk.co.starlingbank.service.hob.list - 9.72 ms 2014-09-07 02:20:19.889 [eu-west-1a/ip-10-11-3-111] [REP] uk.co.starlingbank.service.feature-flags → uk.co.starlingbank.service.hob.list - 13.23 ms 2014-09-07 02:20:19.889 [eu-west-1a/ip-10-11-3-111] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.feature-flags.features - 20.58 ms 2014-09-07 02:20:19.890 [eu-west-1a/ip-10-11-2-203] [REP] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.feature-flags.features - 22.59 ms 2014-09-07 02:20:19.902 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.903 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.903 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.904 [eu-west-1a/ip-10-11-3-111] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.904 [eu-west-1a/ip-10-11-3-111] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 0.36 ms 2014-09-07 02:20:19.905 [eu-west-1a/ip-10-11-2-203] [REP] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 1.97 ms 2014-09-07 02:20:19.905 [eu-west-1a/ip-10-11-2-214] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.905 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.nearest-driver.search - 2014-09-07 02:20:19.905 [eu-west-1a/ip-10-11-2-214] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 0.10 ms
 ERR - uk.co.starlingbank.service.fare.basefare: Missing config at xxx 2014-09-07 02:20:19.906 [eu-west-1a/ip-10-11-2-214] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 2014-09-07 02:20:19.906 [eu-west-1a/ip-10-11-2-214] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.fare.basefare - 0.06 ms 
 ERR - uk.co.starlingbank.service.fare.basefare: Missing config at xxx 2014-09-07 02:20:19.907 [eu-west-1a/ip-10-11-3-58] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.nearest-driver.search - 2014-09-07 02:20:19.907 [eu-west-1a/ip-10-11-3-58] [REQ] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.zoning.search - 2014-09-07 02:20:19.908 [eu-west-1a/ip-10-11-3-58] [IN] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.zoning.search - 2014-09-07 02:20:19.908 [eu-west-1a/ip-10-11-3-58] [OUT] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.zoning.search - 0.20 ms 2014-09-07 02:20:19.909 [eu-west-1a/ip-10-11-3-58] [REP] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.zoning.search - 2.25 ms 2014-09-07 02:20:19.909 [eu-west-1a/ip-10-11-3-58] [REQ] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.raziel.multisearch - 2014-09-07 02:20:19.912 [eu-west-1a/ip-10-11-3-227] [IN] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.raziel.multisearch - 2014-09-07 02:20:19.919 [eu-west-1a/ip-10-11-3-58] [REP] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.raziel.multisearch - 9.46 ms 2014-09-07 02:20:19.919 [eu-west-1a/ip-10-11-3-58] [REQ] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.eta.multitraveltime - 2014-09-07 02:20:19.919 [eu-west-1a/ip-10-11-3-227] [OUT] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.raziel.multisearch - 7.58 ms 2014-09-07 02:20:19.920 [eu-west-1a/ip-10-11-3-58] [IN] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.eta.multitraveltime - 2014-09-07 02:20:19.920 [eu-west-1a/ip-10-11-3-58] [OUT] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.eta.multitraveltime - 0.06 ms 2014-09-07 02:20:19.921 [eu-west-1a/ip-10-11-3-58] [REP] uk.co.starlingbank.service.nearest-driver → uk.co.starlingbank.service.eta.multitraveltime - 1.77 ms 2014-09-07 02:20:19.921 [eu-west-1a/ip-10-11-3-58] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.nearest-driver.search - 14.02 ms 2014-09-07 02:20:19.921 [eu-west-1a/ip-10-11-2-203] [REP] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.nearest-driver.search - 15.48 ms 2014-09-07 02:20:19.941 [eu-west-1a/ip-10-11-2-203] [REQ] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.experiment.readlastupdated - 2014-09-07 02:20:19.945 [eu-west-1a/ip-10-11-2-214] [IN] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.experiment.readlastupdated - 2014-09-07 02:20:19.947 [eu-west-1a/ip-10-11-2-214] [OUT] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.experiment.readlastupdated - 1.82 ms 2014-09-07 02:20:19.947 [eu-west-1a/ip-10-11-2-203] [REP] uk.co.starlingbank.api.customer → uk.co.starlingbank.service.experiment.readlastupdated - 6.01 ms 2014-09-07 02:20:19.948 [eu-west-1a/ip-10-11-2-203] [OUT] uk.co.starlingbank.api → uk.co.starlingbank.api.customer.neardrivers - 80.46 ms 2014-09-07 02:20:19.950 [eu-west-1a/ip-10-11-3-51] [REP] uk.co.starlingbank.api → uk.co.starlingbank.api.customer.neardrivers - 82.71 ms

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

WHY BUILD MICROSERVICES?

Slide 48

Slide 48 text

SIMPLE
 INDEPENDENT UNITS

Slide 49

Slide 49 text

SIMPLE
 SCALABILITY

Slide 50

Slide 50 text

EXPECT
 FAILURE

Slide 51

Slide 51 text

AUTOMATE
 EVERYTHING

Slide 52

Slide 52 text

CLOUD NATIVE
 ANTIFRAGILITY

Slide 53

Slide 53 text

GO?

Slide 54

Slide 54 text

SMALL SIMPLE EASY TO READ EASY TO LEARN

Slide 55

Slide 55 text

CONCURRENCY PRIMITIVES INTERFACE SUPPORT

Slide 56

Slide 56 text

EASY DEPLOYMENT & MANAGEMENT IN PRODUCTION AND AT SCALE

Slide 57

Slide 57 text

THANKS! Image Credits
 IBM System/360: IBM Orbital Ion Cannon: www.rom.ac Go Gophers: Renee French Duopia: Jonny Hughes Control Room: NASA Microchips: Santi Antennas: Alex Weimer