Top Banner
Failure Self Defense 1 Defend your App against failures in a (micro) services world
78

Failure Self Defense: Defend your App against failures in a (micro) services world

Feb 12, 2017

Download

Internet

Tony Fabeen
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Failure Self Defense: Defend your App against failures in a (micro) services world

Failure Self Defense

1

Defend your App against failures in a (micro) services world

Page 2: Failure Self Defense: Defend your App against failures in a (micro) services world

Tony Fabeen

Page 3: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

Page 4: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

CRM

Page 5: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

CRM

Email

Page 6: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

CRM

Email

BillingPayments

Page 7: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

CRM

Email

BillingPayments

Database

Search

Queue

Page 8: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

CRM

Email

BillingPayments

Database

Search

Queue

Page 9: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 10: Failure Self Defense: Defend your App against failures in a (micro) services world

WELCOME TO THE

DEV PARTY

Page 11: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 12: Failure Self Defense: Defend your App against failures in a (micro) services world

Database

Page 13: Failure Self Defense: Defend your App against failures in a (micro) services world

Database

APPAPPAPPAPP

Page 14: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 15: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 16: Failure Self Defense: Defend your App against failures in a (micro) services world

APPAPPAPPAPP

Page 17: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 18: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 19: Failure Self Defense: Defend your App against failures in a (micro) services world

APP

Products

Orders

Payments

Page 20: Failure Self Defense: Defend your App against failures in a (micro) services world

module Api

class Products

def initialize(host = nil)

@client =

HTTPClient.new(host)

end

def all

@client.get('/products')

end

end

end

Page 21: Failure Self Defense: Defend your App against failures in a (micro) services world

def send_checkout

params = { email: @email, token: @token,

ssl_version: :SSLv3 }

RestClient.post(checkout_url, checkout_xml,

params: params,

content_type: "application/xml"){|resp, request, result|

resp }

end

Page 22: Failure Self Defense: Defend your App against failures in a (micro) services world

APP Orders

Payments

Page 23: Failure Self Defense: Defend your App against failures in a (micro) services world

Orders

Payments

CASCADING FAILURE

Page 24: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 25: Failure Self Defense: Defend your App against failures in a (micro) services world

MAP DEPENDENCIES

THAT IMPACTS YOUR SYSTEM

Page 26: Failure Self Defense: Defend your App against failures in a (micro) services world

Products

Orders

Payments

Catalog

Checkout

Pack

Route

Authorize

Charge

Feature Service

Page 27: Failure Self Defense: Defend your App against failures in a (micro) services world

Products

Orders

Payments

Catalog

Checkout

Pack

Route

Authorize

Charge

Degraded

Down

Up

Feature Service

Page 28: Failure Self Defense: Defend your App against failures in a (micro) services world

Products

Orders

Payments

Catalog

Checkout

Pack

Route

Authorize

Charge

Degraded

Down

Up

Feature Service

Page 29: Failure Self Defense: Defend your App against failures in a (micro) services world

Products

Orders

Payments

Catalog

Checkout

Pack

Route

Authorize

Charge

Degraded

Down

Up

Feature Service

Page 30: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 31: Failure Self Defense: Defend your App against failures in a (micro) services world

https://github.com/Shopify/toxiproxy

Page 32: Failure Self Defense: Defend your App against failures in a (micro) services world

Toxiproxy.populate([{ name: 'redis', listen: '127.0.0.1:22222', upstream: '127.0.0.1:6379' }])

Page 33: Failure Self Defense: Defend your App against failures in a (micro) services world

context 'when service UP' do

before { Cache.put('key', 'value') }

it 'saves value' do

expect(Cache.get('key')).to eq('value')

end

end

context 'when service DOWN' do

it 'will raises error' do

Toxiproxy[:redis].down do

expect { Cache.put('key', 'value') }.to

raise_error(Redis::CannotConnectError)

end

end

end

Page 34: Failure Self Defense: Defend your App against failures in a (micro) services world

context 'when service UP' do

before { Cache.put('key', 'value') }

it 'saves value' do

expect(Cache.get('key')).to eq('value')

end

end

context 'when service DOWN' do

it 'will raises error' do

Toxiproxy[:redis].down do

expect { Cache.put('key', 'value') }.to

raise_error(Redis::CannotConnectError)

end

end

end

Page 35: Failure Self Defense: Defend your App against failures in a (micro) services world

Fault Tolerance

Page 36: Failure Self Defense: Defend your App against failures in a (micro) services world

An application with an average Response Time of 60ms can process 1.000 Requests Per Minute (RPM) per Thread.

Page 37: Failure Self Defense: Defend your App against failures in a (micro) services world

An application with an average Response Time of 60ms can process 1.000 Requests Per Minute (RPM) per Thread.

How many Threads we need to handle 100.000 RPM of Throughput ?

Page 38: Failure Self Defense: Defend your App against failures in a (micro) services world

100

Page 39: Failure Self Defense: Defend your App against failures in a (micro) services world

Imagine that 1% of the traffic timeout on a Service after 30 seconds, the Response Time will raise to 360 ms.

Page 40: Failure Self Defense: Defend your App against failures in a (micro) services world

Imagine that 1% of the traffic timeout on a Service after 30 seconds, the Response Time will raise to 360 ms.

How many Threads we need to handle 100.000 RPM of Throughput ?

Page 41: Failure Self Defense: Defend your App against failures in a (micro) services world

600

Page 42: Failure Self Defense: Defend your App against failures in a (micro) services world

Service

600 RPM0.01 s

0.01 s

0.01 s

0.01 s

0.01 s

0.01 s

Page 43: Failure Self Defense: Defend your App against failures in a (micro) services world

Service

60 RPM0.01 s

0.01 s

0.10 s

0.10 s

0.10 s

0.10 s

Page 44: Failure Self Defense: Defend your App against failures in a (micro) services world

Service

60 RPM0.01 s

0.01 s

0.10 s

0.10 s

0.10 s

0.10 s

High Response Time

Less Throughput

Page 45: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Fast

Page 46: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Fast

Low timeouts

Page 47: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Fast

Low timeouts

Connection timeout

Page 48: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Fast

Low timeouts

Connection timeout Socket Read timeout

Page 49: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Fast

Low timeouts

Connection timeout Socket Read timeout Resource aquisition

Page 50: Failure Self Defense: Defend your App against failures in a (micro) services world

Fail Gracefully

Page 51: Failure Self Defense: Defend your App against failures in a (micro) services world

class Cache

def self.put(key, value)

service.set(key, value)

end

def self.get(key)

service.get(key)

end

end

end

Page 52: Failure Self Defense: Defend your App against failures in a (micro) services world

class Cache

def self.put(key, value)

service.set(key, value)

end

def self.get(key)

service.get(key)

end

end

end

Cache.put('key', 'value')

Cache.get('key

')

Page 53: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 54: Failure Self Defense: Defend your App against failures in a (micro) services world

def put(key, value)

service.set(key, value)

true

rescue Redis::CannotConnectError => error

AwesomeLogger.log(error)

false

end

Page 55: Failure Self Defense: Defend your App against failures in a (micro) services world

def get(key, fallback_value = nil)

service.get(key)

rescue Redis::CannotConnectError => error

AwesomeLogger.log(error)

fallback_value

end

end

Page 56: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 57: Failure Self Defense: Defend your App against failures in a (micro) services world

Don't try if you can't succeed

Page 58: Failure Self Defense: Defend your App against failures in a (micro) services world

Circuit Breakers

Page 59: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker Service

Closed

Page 60: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker

Closed

Page 61: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker

Open

Error

Page 62: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker

Open

Page 63: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker

Open

Error

Page 64: Failure Self Defense: Defend your App against failures in a (micro) services world

Client Circuit Breaker Service

Closed

Page 65: Failure Self Defense: Defend your App against failures in a (micro) services world

Slow services

High timeouts

Page 66: Failure Self Defense: Defend your App against failures in a (micro) services world

Bulkheads

Page 67: Failure Self Defense: Defend your App against failures in a (micro) services world

FeatureA

Bulkhead

2 available

FeatureC

FeatureB

Page 68: Failure Self Defense: Defend your App against failures in a (micro) services world

Bulkhead

FeatureC

1 available

FeatureA

FeatureB

Page 69: Failure Self Defense: Defend your App against failures in a (micro) services world

FeatureC

no requests available

FeatureA

FeatureB

Bulkhead

Page 70: Failure Self Defense: Defend your App against failures in a (micro) services world

Bulkhead

FeatureC

no requests available

FeatureA

FeatureB

Error

Page 71: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 72: Failure Self Defense: Defend your App against failures in a (micro) services world

Monitor Service Calls

Page 73: Failure Self Defense: Defend your App against failures in a (micro) services world

Monitor Service Calls

Timeout rate Rejected call rate

Short circuit rate Failure/Success rate

Response Times

Page 74: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 75: Failure Self Defense: Defend your App against failures in a (micro) services world
Page 76: Failure Self Defense: Defend your App against failures in a (micro) services world

SummaryKnow your dependenciesImprove your test suite

Fail FastTimeouts

Fail GracefullyFallbacks

Don't try if you can't succeedCircuit Breakers and Bulkheads are friends

Monitor Service Calls

Notice problems

Page 77: Failure Self Defense: Defend your App against failures in a (micro) services world

?

Page 78: Failure Self Defense: Defend your App against failures in a (micro) services world

https://github.com/tonyfabeen

https://twitter.com/tonyfabeen

https://linkedin.com/tonyfabeen