what's missing? microservices meetup at cisco

60
Microservices: What’s Missing… Adrian Cockcroft @adrianco Technology Fellow - Battery Ventures March 2016

Upload: adrian-cockcroft

Post on 06-Jan-2017

3.872 views

Category:

Software


1 download

TRANSCRIPT

Page 1: What's Missing? Microservices Meetup at Cisco

Microservices: What’s Missing…Adrian Cockcroft @adrianco

Technology Fellow - Battery Ventures March 2016

Page 2: What's Missing? Microservices Meetup at Cisco

What does @adrianco do?

@adrianco

Technology Due Diligence on Deals

Presentations at Conferences

Presentations at Companies

Technical Advice for Portfolio

Companies

Program Committee for Conferences

Networking with Interesting PeopleTinkering with

Technologies

Maintain Relationship with Cloud Vendors

http://www.slideshare.net/adriancockcroft

Page 3: What's Missing? Microservices Meetup at Cisco

What’s Missing? Trying out new content today

Discussion/feedback O’Reilly Software Architecture Conference New York April 13th - for the real thing…

Page 4: What's Missing? Microservices Meetup at Cisco

@adrianco

Discussion Points

Failure injection testingVersioning, Routing, Protocols

Timeouts and retriesDenormalized data models

Monitoring, TracingSimplicity through symmetry

See www.battery.com for a list of portfolio investments

Page 5: What's Missing? Microservices Meetup at Cisco

@adrianco

Failure Injection Testing Netflix Chaos Monkey and Simian Army

http://techblog.netflix.com/2011/07/netflix-simian-army.htmlhttp://techblog.netflix.com/2014/10/fit-failure-injection-testing.htmlhttp://techblog.netflix.com/2016/01/automated-failure-testing.html

See www.battery.com for a list of portfolio investments

Page 6: What's Missing? Microservices Meetup at Cisco

! Chaos Monkey - enforcing stateless business logic

! Chaos Gorilla - enforcing zone isolation/replication

! Chaos Kong - enforcing region isolation/replication

! Security Monkey - watching for insecure configuration settings

! Latency Monkey & FIT - inject errors to enforce robust dependencies

! See over 100 NetflixOSS projects at netflix.github.com

! Get “Technical Indigestion” reading techblog.netflix.com

Trust with Verification

Page 7: What's Missing? Microservices Meetup at Cisco

@adrianco

Benefits of version aware routing

Immediately and safely introduce a new versionCanary test in production

Pin clients to a version so they can’t get disruptedChange client or dependencies but not both at once

Eventually remove old versionsIncremental or infrequent “break the build” garbage collection

See www.battery.com for a list of portfolio investments

Page 8: What's Missing? Microservices Meetup at Cisco

@adrianco

Versioning, RoutingVersion numbering: Interface.Feature.Bugfix

V1.2.3 to V1.2.4 - Canary test then remove old version

V1.2.x to V1.3.x - Canary test then remove or keep bothRoute V1.3.x clients to new version to get new feature

Remove V1.2.x only after V1.3.x is found to work for V1.2.x clients

V1.x.x to V2.x.x - Route clients to specific versionsRemove old server version when all old clients are gone

See www.battery.com for a list of portfolio investments

Page 9: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeouts and Retries

Connection timeout vs. request timeout confusion

Usually setup incorrectly, global defaults

Systems collapse with “retry storms”

Timeouts too long, too many retries

Services doing work that can never be used

See www.battery.com for a list of portfolio investments

Page 10: What's Missing? Microservices Meetup at Cisco

@adrianco

Connections and Requests

TCP makes a connection, HTTP makes a requestHTTP hopefully reuses connections for several requests

Both have different timeout and retry needs!

TCP timeout is purely a property of one network latency hopHTTP timeout depends on the service and its dependencies

See www.battery.com for a list of portfolio investments

Page 11: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeouts and Retries

Edge Service

Good Service

Good Service

Bad config: Every service defaults to 5 second timeout, two retries

Edge Service not responding

Overloaded service not responding

Failed Service

If anything breaks, everything upstream stops responding

Retries add unproductive work

Page 12: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeouts and RetriesBad config: Every service defaults to 5 second timeout, two retries

Edge service

responds slowly

Overloaded service

Partiallyfailed

service

First request from Edge timed out so it ignores the successful response and keeps retrying. Middle service load increases as

it’s doing work that isn’t being consumed

Page 13: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeout and Retry Fixes

Cascading timeout budgetStatic settings that decrease from the edge

or dynamic budget passed with request

How often do retries actually succeed?Don’t ask the same instance the same thing

Only retry on a different connection

See www.battery.com for a list of portfolio investments

Page 14: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeouts and Retries

Edge Service

Good Service

Budgeted timeout, one retry

Failed Service

5s1s1s

Fast failresponseafter 2s

Upstream timeout must always be longer than total downstream timeout * retries delay

No unproductive work while fast failing

Page 15: What's Missing? Microservices Meetup at Cisco

@adrianco

Timeouts and Retries

Edge Service

Good Service

Budgeted timeout, failover retry

Failed Service5s

1s1s

For replicated services with multiple instances never retry against a failed instance

No extra retries or unproductive work

Good Service

Successresponsedelayed 1s

Page 16: What's Missing? Microservices Meetup at Cisco

@adrianco

Denormalized Data Models

“The Network is Reliable” http://dl.acm.org/citation.cfm?id=2655736Distributed systems are inconsistent by nature

Clients are inconsistent with serversMost caches are inconsistent

Versions are inconsistentGet over it and

Deal with it

See www.battery.com for a list of portfolio investments

Page 17: What's Missing? Microservices Meetup at Cisco

@adrianco

Denormalized Data Models

Any non-trivial organization has many databasesCross references exist, inconsistencies exist

Microservices work best with individual simple storesScale, operate, mutate, fail them independently

NoSQL allows flexible schema/object versions

See www.battery.com for a list of portfolio investments

Page 18: What's Missing? Microservices Meetup at Cisco

@adrianco

Denormalized Data Models

Build custom cross-datasource check/repair processes

Ensure all cross references are up to date

Immutability Changes Everythinghttp://highscalability.com/blog/2015/1/26/paper-immutability-changes-everything-by-pat-helland.html

Memories, Guesses and Apologieshttps://blogs.msdn.microsoft.com/pathelland/2007/05/15/memories-guesses-and-apologies/

See www.battery.com for a list of portfolio investments

Page 19: What's Missing? Microservices Meetup at Cisco

Monitoring Microservices

Page 20: What's Missing? Microservices Meetup at Cisco

A Possible Hierarchy Continents

Regions Zones

Services Versions

Containers Instances

How Many? 3 to 5

2-4 per Continent 1-5 per Region 100’s per Zone

Many per Service 1000’s per Version

10,000’s

It’s much more challenging than just a large number of

machines

Page 21: What's Missing? Microservices Meetup at Cisco

Flow

Page 22: What's Missing? Microservices Meetup at Cisco

Some tools can show the request flow

across a few services

Page 23: What's Missing? Microservices Meetup at Cisco

Interesting architectures have a lot of microservices! Flow visualization is

a big challenge.

See http://www.slideshare.net/LappleApple/gilt-from-monolith-ruby-app-to-micro-service-scala-service-architecture

Page 24: What's Missing? Microservices Meetup at Cisco

Simulated Microservices

Model and visualize microservices Simulate interesting architectures Generate large scale configurations Eventually stress test real tools

See github.com/adrianco/spigo Simulate Protocol Interactions in Go Visualize with D3

ELB Load Balancer

Zuul API Proxy

KaryonBusinessLogic

StaashDataAccessLayerPriam CassandraDatastore

ThreeAvailabilityZones

Page 25: What's Missing? Microservices Meetup at Cisco

Spigo Nanoservice Structurefunc Start(listener chan gotocol.Message) { ... for { select { case msg := <-listener:

flow.Instrument(msg, name, hist) switch msg.Imposition { case gotocol.Hello: // get named by parent ... case gotocol.NameDrop: // someone new to talk to ... case gotocol.Put: // upstream request handler ... outmsg := gotocol.Message{gotocol.Replicate, listener, time.Now(), msg.Ctx.NewParent(), msg.Intention} flow.AnnotateSend(outmsg, name) outmsg.GoSend(replicas) } case <-eurekaTicker.C: // poll the service registry ... } } }

Skeleton code for replicating a Put message

Instrument incoming requests

Instrument outgoing requests

update trace context

Page 26: What's Missing? Microservices Meetup at Cisco

Flow Trace Recording

riak2us-east-1

zoneC

riak9us-west-2

zoneA

Put s896

Replicate

riak3us-east-1

zoneA

riak8us-west-2

zoneC

riak4us-east-1

zoneB

riak10us-west-2

zoneB

us-east-1.zoneC.riak2 t98p895s896 Put us-east-1.zoneA.riak3 t98p896s908 Replicate us-east-1.zoneB.riak4 t98p896s909 Replicate us-west-2.zoneA.riak9 t98p896s910 Replicate us-west-2.zoneB.riak10 t98p910s912 Replicate us-west-2.zoneC.riak8 t98p910s913 Replicate

staashus-east-1

zoneC

s910 s908s913s909s912

Replicate Put

Page 27: What's Missing? Microservices Meetup at Cisco

Open Zipkin

A common format for trace annotations A Java tool for visualizing traces Standardization effort to fold in other formats Driven by Adrian Cole (currently at Pivotal) Extended to load Spigo generated trace files

Page 28: What's Missing? Microservices Meetup at Cisco

Zipkin Trace Dependencies

Page 29: What's Missing? Microservices Meetup at Cisco

Zipkin Trace Dependencies

Page 30: What's Missing? Microservices Meetup at Cisco

Trace for one Spigo Flow

Page 31: What's Missing? Microservices Meetup at Cisco

Definition of an architecture

{ "arch": "lamp", "description":"Simple LAMP stack", "version": "arch-0.0", "victim": "webserver", "services": [ { "name": "rds-mysql", "package": "store", "count": 2, "regions": 1, "dependencies": [] }, { "name": "memcache", "package": "store", "count": 1, "regions": 1, "dependencies": [] }, { "name": "webserver", "package": "monolith", "count": 18, "regions": 1, "dependencies": ["memcache", "rds-mysql"] }, { "name": "webserver-elb", "package": "elb", "count": 0, "regions": 1, "dependencies": ["webserver"] }, { "name": "www", "package": "denominator", "count": 0, "regions": 0, "dependencies": ["webserver-elb"] } ] }

Header includeschaos monkey victim

New tier name

Tier package

0 = non Regional

Node count

List of tier dependencies

Page 32: What's Missing? Microservices Meetup at Cisco

Running Spigo$ ./spigo -a lamp -j -d 2 2016/01/26 23:04:05 Loading architecture from json_arch/lamp_arch.json 2016/01/26 23:04:05 lamp.edda: starting 2016/01/26 23:04:05 Architecture: lamp Simple LAMP stack 2016/01/26 23:04:05 architecture: scaling to 100% 2016/01/26 23:04:05 lamp.us-east-1.zoneB.eureka01....eureka.eureka: starting 2016/01/26 23:04:05 lamp.us-east-1.zoneA.eureka00....eureka.eureka: starting 2016/01/26 23:04:05 lamp.us-east-1.zoneC.eureka02....eureka.eureka: starting 2016/01/26 23:04:05 Starting: {rds-mysql store 1 2 []} 2016/01/26 23:04:05 Starting: {memcache store 1 1 []} 2016/01/26 23:04:05 Starting: {webserver monolith 1 18 [memcache rds-mysql]} 2016/01/26 23:04:05 Starting: {webserver-elb elb 1 0 [webserver]} 2016/01/26 23:04:05 Starting: {www denominator 0 0 [webserver-elb]} 2016/01/26 23:04:05 lamp.*.*.www00....www.denominator activity rate 10ms 2016/01/26 23:04:06 chaosmonkey delete: lamp.us-east-1.zoneC.webserver02....webserver.monolith 2016/01/26 23:04:07 asgard: Shutdown 2016/01/26 23:04:07 lamp.us-east-1.zoneB.eureka01....eureka.eureka: closing 2016/01/26 23:04:07 lamp.us-east-1.zoneA.eureka00....eureka.eureka: closing 2016/01/26 23:04:07 lamp.us-east-1.zoneC.eureka02....eureka.eureka: closing 2016/01/26 23:04:07 spigo: complete 2016/01/26 23:04:07 lamp.edda: closing

-a architecture lamp-j graph json/lamp.json-d run for 2 seconds

Page 33: What's Missing? Microservices Meetup at Cisco

Riak IoT Architecture{ "arch": "riak", "description":"Riak IoT ingestion example for the RICON 2015 presentation", "version": "arch-0.0", "victim": "", "services": [ { "name": "riakTS", "package": "riak", "count": 6, "regions": 1, "dependencies": ["riakTS", "eureka"]}, { "name": "ingester", "package": "staash", "count": 6, "regions": 1, "dependencies": ["riakTS"]}, { "name": "ingestMQ", "package": "karyon", "count": 3, "regions": 1, "dependencies": ["ingester"]}, { "name": "riakKV", "package": "riak", "count": 3, "regions": 1, "dependencies": ["riakKV"]}, { "name": "enricher", "package": "staash", "count": 6, "regions": 1, "dependencies": ["riakKV", "ingestMQ"]}, { "name": "enrichMQ", "package": "karyon", "count": 3, "regions": 1, "dependencies": ["enricher"]}, { "name": "analytics", "package": "karyon", "count": 6, "regions": 1, "dependencies": ["ingester"]}, { "name": "analytics-elb", "package": "elb", "count": 0, "regions": 1, "dependencies": ["analytics"]}, { "name": "analytics-api", "package": "denominator", "count": 0, "regions": 0, "dependencies": ["analytics-elb"]}, { "name": "normalization", "package": "karyon", "count": 6, "regions": 1, "dependencies": ["enrichMQ"]}, { "name": "iot-elb", "package": "elb", "count": 0, "regions": 1, "dependencies": ["normalization"]}, { "name": "iot-api", "package": "denominator", "count": 0, "regions": 0, "dependencies": ["iot-elb"]}, { "name": "stream", "package": "karyon", "count": 6, "regions": 1, "dependencies": ["ingestMQ"]}, { "name": "stream-elb", "package": "elb", "count": 0, "regions": 1, "dependencies": ["stream"]}, { "name": "stream-api", "package": "denominator", "count": 0, "regions": 0, "dependencies": ["stream-elb"]} ] }

New tier name

Tier package

Node count

List of tier dependencies

0 = non Regional

Page 34: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

Page 35: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Page 36: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Load Balancer

Load Balancer

Load Balancer

Page 37: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Load Balancer

Normalization Services

Load Balancer

Load Balancer

Stream Service

Analytics Service

Page 38: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Load Balancer

Normalization Services

Enrich Message Queue Riak KV

Enricher Services

Load Balancer

Load Balancer

Stream Service

Analytics Service

Page 39: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Load Balancer

Normalization Services

Enrich Message Queue Riak KV

Enricher Services

Ingest Message Queue

Load Balancer

Load Balancer

Stream Service

Analytics Service

Page 40: What's Missing? Microservices Meetup at Cisco

Single Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

Load Balancer

Normalization Services

Enrich Message Queue Riak KV

Enricher Services

Ingest Message Queue

Load Balancer

Load Balancer

Stream Service Riak TS

Analytics Service

Ingester Service

Page 41: What's Missing? Microservices Meetup at Cisco

Two Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

East Region Ingestion

West Region Ingestion

Multi Region TS Analytics

Page 42: What's Missing? Microservices Meetup at Cisco

Two Region Riak IoT

IoT Ingestion Endpoint

Stream Endpoint

Analytics Endpoint

East Region Ingestion

West Region Ingestion

Multi Region TS Analytics

What’s the response time of the stream

endpoint?

Page 43: What's Missing? Microservices Meetup at Cisco

Response Times

Page 44: What's Missing? Microservices Meetup at Cisco

What’s the response time of a simple service?

memcached

rds-msql

rds-msqlwebservers

elb

www

Page 45: What's Missing? Microservices Meetup at Cisco

What’s the response time of an even simpler storage backed web service?

memcached

mysql

disk volumeweb service

load generator

Page 46: What's Missing? Microservices Meetup at Cisco

Measuring Response Time With

Histograms

Page 47: What's Missing? Microservices Meetup at Cisco

Changes made to codahale/hdrhistogram

Changes made to go-kit/kit/metrics

Implementation in adrianco/spigo/collect

Page 48: What's Missing? Microservices Meetup at Cisco

What to measure?

Client ServerGetRequest

GetResponse

Client Time

Client Send CS

Server Receive SR

Server Send SS

Client Receive CR

Server Time

Page 49: What's Missing? Microservices Meetup at Cisco

What to measure?

Client ServerGetRequest

GetResponse

Client Time

Client Send CS

Server Receive SR

Server Send SS

Client Receive CR

Response CR-CS

Service SS-SR

Network SR-CS

Network CR-SS

Net Round Trip (SR-CS) + (CR-SS) (CR-CS) - (SS-SR)

Server Time

Page 50: What's Missing? Microservices Meetup at Cisco

Go-Kit Histogram Collectionconst ( maxHistObservable = 1000000 sampleCount = 500 )

func NewHist(name string) metrics.Histogram { var h metrics.Histogram if name != "" && archaius.Conf.Collect { h = expvar.NewHistogram(name, 1000, maxHistObservable, 1, []int{50, 99}...) if sampleMap == nil { sampleMap = make(map[metrics.Histogram][]int64) } sampleMap[h] = make([]int64, 0, sampleCount) return h } return nil }

func Measure(h metrics.Histogram, d time.Duration) { if h != nil && archaius.Conf.Collect { if d > maxHistObservable { h.Observe(int64(maxHistObservable)) } else { h.Observe(int64(d)) } s := sampleMap[h] if s != nil && len(s) < sampleCount { sampleMap[h] = append(s, int64(d)) } } }

Nanoseconds!

Median and 99%ile

Slice for first 500 values as samples for export to Guesstimate

Page 51: What's Missing? Microservices Meetup at Cisco

Spigo Histogram Resultsname: storage.*.*.load00....load.denominator_resp count: 1978 gauges: map[50:126975 99:278527] From, To, Count, Prob, Bar 28672, 29695, 1, 0.0005, : 31744, 32767, 1, 0.0005, : 34816, 36863, 2, 0.0010, :# 36864, 38911, 8, 0.0040, |###### 38912, 40959, 13, 0.0066, |########## 40960, 43007, 18, 0.0091, |############## 43008, 45055, 12, 0.0061, |######### 45056, 47103, 26, 0.0131, |#################### 47104, 49151, 24, 0.0121, |################## 49152, 51199, 33, 0.0167, |######################### 51200, 53247, 29, 0.0147, |###################### 53248, 55295, 35, 0.0177, |########################### 55296, 57343, 39, 0.0197, |############################## 57344, 59391, 35, 0.0177, |########################### 59392, 61439, 43, 0.0217, |################################# 61440, 63487, 31, 0.0157, |######################## 63488, 65535, 39, 0.0197, |############################## 65536, 69631, 74, 0.0374, |######################################################### 69632, 73727, 65, 0.0329, |################################################## 73728, 77823, 57, 0.0288, |############################################ 77824, 81919, 37, 0.0187, |############################ 81920, 86015, 37, 0.0187, |############################ 86016, 90111, 30, 0.0152, |####################### 90112, 94207, 39, 0.0197, |############################## 94208, 98303, 28, 0.0142, |##################### 98304, 102399, 30, 0.0152, |####################### 102400, 106495, 31, 0.0157, |######################## 106496, 110591, 20, 0.0101, |############### 110592, 114687, 26, 0.0131, |#################### 114688, 118783, 44, 0.0222, |################################## 118784, 122879, 41, 0.0207, |############################### 122880, 126975, 54, 0.0273, |########################################## 126976, 131071, 51, 0.0258, |####################################### 131072, 139263, 114, 0.0576, |######################################################################################## 139264, 147455, 123, 0.0622, |############################################################################################### 147456, 155647, 127, 0.0642, |################################################################################################### 155648, 163839, 102, 0.0516, |############################################################################### 163840, 172031, 90, 0.0455, |###################################################################### 172032, 180223, 65, 0.0329, |################################################## 180224, 188415, 43, 0.0217, |################################# 188416, 196607, 60, 0.0303, |############################################## 196608, 204799, 54, 0.0273, |########################################## 204800, 212991, 29, 0.0147, |###################### 212992, 221183, 21, 0.0106, |################ 221184, 229375, 25, 0.0126, |################### 229376, 237567, 18, 0.0091, |############## 237568, 245759, 15, 0.0076, |########### 245760, 253951, 9, 0.0046, |####### 253952, 262143, 8, 0.0040, |###### 262144, 278527, 10, 0.0051, |####### 278528, 294911, 6, 0.0030, |#### 294912, 311295, 2, 0.0010, |# 327680, 344063, 2, 0.0010, :# 344064, 360447, 1, 0.0005, | 376832, 393215, 1, 0.0005, :

name: storage.*.*.load00....load.denominator_resp count: 1978 gauges: map[50:126975 99:278527] From, To, Count, Prob, Bar 28672, 29695, 1, 0.0005, : 31744, 32767, 1, 0.0005, : 34816, 36863, 2, 0.0010, :# 36864, 38911, 8, 0.0040, |###### 38912, 40959, 13, 0.0066, |##########

Normalized probability

Response time distribution measured in nanoseconds using High Dynamic Range Histogram

:# Zero counts skipped|# Contiguous buckets

Total count, median and 99th percentile values

Page 52: What's Missing? Microservices Meetup at Cisco

See http://www.getguesstimate.com/models/1307

Page 53: What's Missing? Microservices Meetup at Cisco

memcached hit %

memcached response mysql response

service cpu time

memcached hit mode

mysql cache hit mode

mysql disk access mode

Hit rates: memcached 40% mysql 70%

Page 54: What's Missing? Microservices Meetup at Cisco

Hit rates: memcached 60% mysql 70%

Page 55: What's Missing? Microservices Meetup at Cisco

Hit rates: memcached 20% mysql 90%

Page 56: What's Missing? Microservices Meetup at Cisco

Golang Guesstimate Interfacehttps://github.com/adrianco/goguesstimate

{ "space": { "name": "gotest", "description": "Testing", "is_private": "true", "graph": { "metrics": [ {"id": "AB", "readableId": "AB", "name": "memcached", "location": {"row": 2, "column":4}}, {"id": "AC", "readableId": "AC", "name": "memcached percent", "location": {"row": 2, "column":3}}, {"id": "AD", "readableId": "AD", "name": "staash cpu", "location": {"row": 3, "column":3}}, {"id": "AE", "readableId": "AE", "name": "staash", "location": {"row": 3, "column":2}} ], "guesstimates": [ {"metric": "AB", "input": null, "guesstimateType": "DATA", "data": [119958,6066,13914,9595,6773,5867,2347,1333,9900,9404,13518,9021,7915,3733,10244,5461,12243,7931,9044,11706,5706,22861,9022,48661,15158,28995,16885,9564,17915,6610,7080,7065,12992,35431,11910,11465,14455,25790,8339,9991]}, {"metric": "AC", "input": "40", "guesstimateType": "POINT"}, {"metric": "AD", "input": "[1000,4000]", "guesstimateType": "LOGNORMAL"}, {"metric": "AE", "input": "=100+((randomInt(0,100)>AC)?AB:AD)", "guesstimateType": "FUNCTION"} ] } } }

Page 57: What's Missing? Microservices Meetup at Cisco

See http://www.getguesstimate.com

Page 58: What's Missing? Microservices Meetup at Cisco

@adrianco

Simplicity through symmetry

SymmetryInvariants

Stable assertionsNo special cases

See www.battery.com for a list of portfolio investments

Page 59: What's Missing? Microservices Meetup at Cisco

@adrianco

“We see the world as increasingly more complex and chaotic because we use inadequate concepts to explain it. When we understand something, we no longer see it as chaotic or complex.”

Jamshid Gharajedaghi - 2011Systems Thinking: Managing Chaos and Complexity: A Platform for Designing Business Architecture

Page 60: What's Missing? Microservices Meetup at Cisco

Q&AAdrian Cockcroft @adrianco

http://slideshare.com/adriancockcroftTechnology Fellow - Battery Ventures

See www.battery.com for a list of portfolio investments