@cdavisafc
CLOUD-NATIVE
DESIGNING CHANGE-TOLERANT SOFTWARE
Cornelia Davis, Sr. Director of Technology, Pivotal
@cdavisafc
FROM THE 2017 STATE OF DEVOPS REPORT
@cdavisafc
https://www.forbes.com/sites/louiscolumbus/2017/02/18/rightscale-2017-state-of-the-cloud-report-azure-gaining-in-enterprises
FROM THE 2017 STATE OF CLOUD REPORT
@cdavisafc
CLOUD-NATIVE = LOOSELY COUPLED RUNNING IN THE CLOUD
Cloud is where you compute
Cloud-native is how.
@cdavisafc
TEXT
ME?
Developer (wasn’t Ops)
Web architectures for >10 years
Cloud-native for 5 years
Cloud Foundry for 5 years
More recently
@cdavisafc
TEXT
A Seattle technology company
hosts applications for thousands
of major corporations
@cdavisafc
TEXT
Major Outage on 20 September 2015
Airbnb, Nest, IMDB and many more experienced downtime
… Including Netflix
Outage lasted 5+ hours
“brief availability blip”
experienced a
@cdavisafc
CLOUD-NATIVE SERVICE
LET’S TALK ABOUT AUTONOMY
A major benefit of cloud-native architectures is independent:
▸ Application Scaling
▸ Team Scaling
▸ Development Cycles
▸ Experimentation
▸ Resilience
@cdavisafc
CLOUD-NATIVE ARCHITECTURES
▸ Cloud-native Apps
▸ Scale out
▸ Statelessness
▸ Externalize configuration
▸ Implications from changes in the application
lifecycle
▸ Versioned services
▸ Service Discovery
▸ Distributed tracing
▸ Retries
▸ Cloud-native Data
▸ Breaking the Data monolith
▸ Data APIs
▸ Caching
▸ Polyglot Persistence
▸ Event sourcing
CLOUD-NATIVE APP
@cdavisafc
CLOUD-NATIVE APP
SCALE HORIZONTALLY
APP APP
APP
APP
APP
@cdavisafc
CLOUD-NATIVE APP
APP APP
APP
APP
APP
APP APP
APP
APP
APP
APP APP
APP
APP
APP
SCALE HORIZONTALLY
APP APP
APP
APP
APP
@cdavisafc
CLOUD-NATIVE APP
APPAPP
APPAPPAPPAPPAPP
APPAPPAPPAPPAPP
APP APP
APP
APP
APP APP
APP
APP
APP APP
APP
APP
APP
SCALE HORIZONTALLY
APP APP
APP
APP
APP
@cdavisafc
CLOUD-NATIVE APP
APPAPP
APPAPPAPPAPPAPP
APPAPPAPPAPPAPP
APP APP
APP
APP
APP APP
APP
APP
APP APP
APP
APP
APP
SCALE HORIZONTALLY
▸ Need an abstraction to treat set of
instances as one logical unit
▸ Load Balancing - DNS? Something
else?
▸ Dynamic!!!
▸ IP Addresses of instances always
changing
APP APP
APP
APP
APP
ROUTER
ROUTER
@cdavisafc
CLOUD-NATIVE APP
STATELESSNESS
ROUTER
APP
(INSTANCE 1)
ValidTokens:
[UserToken]
/login
token=UserToken
token=UserToken
@cdavisafc
CLOUD-NATIVE APP
STATELESSNESS
ROUTER
APP
(INSTANCE 1)
ValidTokens:
[UserToken]
/login
token=UserToken
token=UserToken
APP
(INSTANCE 2)
ValidTokens: []
@cdavisafc
CLOUD-NATIVE APP
STATELESSNESS
ROUTER
APP
(INSTANCE 1)
ValidTokens:
[UserToken]
/login
token=UserToken
token=UserToken
APP
(INSTANCE 2)
Unauthorized ValidTokens: []
token=UserToken
@cdavisafc
CLOUD-NATIVE APP
STATELESSNESS
▸ Do NOT use sticky sessions!
▸ Eventually (and sooner than you
think!) the instance you are sticky to
will disappear
▸ Do make your instances
completely stateless
ROUTER
APP
(INSTANCE 1)
ValidTokens:
[UserToken]
/login
token=UserToken
token=UserToken
APP
(INSTANCE 2)
Unauthorized ValidTokens: []
token=UserToken
@cdavisafc
CLOUD-NATIVE APP
STATELESSNESS
▸ Do NOT use sticky sessions!
▸ Eventually (and sooner than you
think!) the instance you are sticky to
will disappear
▸ Do make your instances
completely stateless
▸ Externalize state
ROUTER
APP
(INSTANCE 1)
ValidTokens:
[UserToken]
token=UserToken
token=UserToken
APP
(INSTANCE 2)
token=UserToken
STATE
STORE
@cdavisafc
CLOUD-NATIVE APP
APP CONFIGURATION
▸ Property Files are the abstraction
used to externalize configuration
▸ They do not hold actual values!
▸ Values coming from the environment
are supplied via environment
variables
▸ Other configuration is controlled just
like source code and injected
RUNTIME CONTEXT
WHERE CONFIGURATION PARAMETERS ARE DEFINED IN ENVIRONMENT VARIABLES
PROPERTY FILE(S)
DEFINE THE CONFIGURATION
PARAMETERS AND DEFAULT VALUES
hostIp=
${CF_INSTANCE_IP}
specialization=
${SPECIALIZATION:
Science}
APP
CODE THAT REFERENCES THE CONFIGURATION PARAMETERS
DEFINED IN THE PROPERTY FILE
public class HelloController {



@Value("${hostIp}")

private String hostIp;
@Value("${specialization}")

private String specialization;
...
}
SYSTEM PROPERTIES
PROVIDED BY THE RUNTIME ENVIRONMENT, VIA
ENVIRONMENT VARIABLES
CF_INSTANCE_IP=10.10.148.29
@cdavisafc
CLOUD-NATIVE APP
APP CONFIGURATION
▸ Other configuration is controlled just
like source code and injected
RUNTIME CONTEXT
WHERE CONFIGURATION PARAMETERS ARE DEFINED IN ENVIRONMENT VARIABLES
PROPERTY FILE(S)
DEFINE THE CONFIGURATION
PARAMETERS AND DEFAULT VALUES
hostIp=
${CF_INSTANCE_IP}
specialization=
${SPECIALIZATION:
Science}
APP
CODE THAT REFERENCES THE CONFIGURATION PARAMETERS
DEFINED IN THE PROPERTY FILE
public class HelloController {



@Value("${hostIp}")

private String hostIp;
@Value("${specialization}")

private String specialization;
...
}
SYSTEM PROPERTIES
PROVIDED BY THE RUNTIME ENVIRONMENT, VIA
ENVIRONMENT VARIABLES
CF_INSTANCE_IP=10.10.148.29
APP PROPERTIES
STORED AND VERSIONED IN A
REPOSITORY SUCH AS GIT
specialization
=Sports
CONFIG SERVER
ROLE IS TO INJECT MANAGED APP
PROPERTIES INTO THE APP
@cdavisafc
CLOUD-NATIVE APP
APPLICATION LIFECYCLE
▸ Application lifecycle events have
rippling effects through the collective
INVOICE APP
ordersvcIP
=10.24.1.35
ORDER SERVICE APP
10.24.1.3510.24.63.116
@cdavisafc
CLOUD-NATIVE APP
APPLICATION LIFECYCLE
▸ Application lifecycle events have
rippling effects through the collective
▸ The application must broadcast
lifecycle change events
▸ (Note: I strongly recommend you
use a framework to help you with
this!)
▸ And an app must be able to absorb
that configuration at the right time
(run time?)
INVOICE APP
ordersvcIP
=10.24.1.35
ORDER SERVICE APP
Some “magic” happens
10.24.63.116
Here I am!
IP Address: 10.24.63.116
Version: 3.4.239
…
I’ll adapt to these changes!
Orders Service new IP:
10.24.63.116
@cdavisafc
CLOUD-NATIVE SERVICE
VERSIONED SERVICES
▸ Use Semantic Versioning
▸ major.minor.patch
▸ Use Blue/Green deploys
▸ Deployments needn’t be replacements
▸ Powerful lever in making
deployments a non-event
SERVICE
APP
SERVICE
APP
APP
SERVICE
APP
APP
… AND PARALLEL DEPLOYS
@cdavisafc
CLOUD-NATIVE SERVICE
VERSIONED SERVICES
▸ Use Semantic Versioning
▸ major.minor.patch
▸ Use Blue/Green deploys
▸ Deployments needn’t be replacements
▸ Powerful lever in making
deployments a non-event
SERVICE
APP
SERVICE
APP
APP
SERVICE
APP
APP
… AND PARALLEL DEPLOYS
SERVICE
APP
1.0.0 2.0.0
@cdavisafc
CLOUD-NATIVE SERVICE
SERVICE DISCOVERY
▸ Let’s dig into the “magic”
(it’s not really magic)
INVOICE APP
orderSvcCoords...
ORDER SERVICE APP
10.24.63.116
Here I am!
IP Address: 10.24.63.116
Version: 3.4.239
…
I’ll adapt to these changes!
Orders Service new IP:
10.24.63.116
Some “magic” happens
@cdavisafc
CLOUD-NATIVE SERVICE
SERVICE DISCOVERY
▸ Dynamic Router maintains routing
table
▸ Messaging pattern to decouple
service from router
▸ Must handle lost broadcast
messages
▸ Request pass through router INVOICE APP
orderSvcCoords
=orderSvc.example.com
ORDER SERVICE APP
10.24.63.116
Here I am!
IP Address: 10.24.63.116
Version: 3.4.239
…
ROUTER
OrderService: 10.24.63.116, …
CustomerService: 10.24.3.1, …
@cdavisafc
CLOUD-NATIVE SERVICE
SERVICE DISCOVERY
▸ Dynamic Router maintains routing
table
▸ Messaging pattern to decouple
service from router
▸ Must handle lost broadcast
messages
▸ Request pass through router INVOICE APP
orderSvcCoords
=10.24.1.13
ORDER SERVICE APP
10.24.63.116
Here I am!
IP Address: 10.24.63.116
Version: 3.4.239
…
SERVICE DISCOVERY SERVER
OrderService: 10.24.63.116, …
CustomerService: 10.24.3.1, …
ORDER SERVICE APP
10.24.1.13
I’ll adapt to these changes!
Orders Service new IP:
10.24.63.116
@cdavisafc
CLOUD-NATIVE SERVICE
SERVICE DISCOVERY
▸ Dynamic Router maintains routing
table
▸ Messaging pattern to decouple
service from router
▸ Must handle lost broadcast
messages
▸ Request pass through router INVOICE APP
orderSvcCoords
=10.24.63.116
ORDER SERVICE APP
10.24.63.116
Here I am!
IP Address: 10.24.63.116
Version: 3.4.239
…
SERVICE DISCOVERY SERVER
OrderService: 10.24.63.116, …
CustomerService: 10.24.3.1, …
ORDER SERVICE APP
10.24.1.13
I’ll adapt to these changes!
Orders Service new IP:
10.24.63.116
@cdavisafc
CLOUD-NATIVE SERVICE
CIRCUIT BREAKERS
▸ You’ve probably seen this picture…
https://martinfowler.com/bliki/CircuitBreaker.html
@cdavisafc
CLOUD-NATIVE SERVICE
CIRCUIT BREAKERS
▸ You’ve probably seen this picture…
▸ … but why do we need circuit breakers
in the first place
https://martinfowler.com/bliki/CircuitBreaker.html
@cdavisafc
CLOUD-NATIVE SERVICE
RETRIES
▸ #1 Fallacy of Distributed Computing:
https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
@cdavisafc
CLOUD-NATIVE SERVICE
RETRIES
▸ #1 Fallacy of Distributed Computing:
The Network is Reliable
https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
@cdavisafc
CLOUD-NATIVE SERVICE
RETRIES
▸ #1 Fallacy of Distributed Computing:
The Network is Reliable
It's not.
https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing
@cdavisafc
CLOUD-NATIVE SERVICE
RETRIES
CLIENT
SERVICE
▸ Client must consider failure
▸ Decide on fall-back behavior
▸ Likely including retries
▸ But then we need to handle
downstream consequences of these
(retry) behaviors
Timeouts?
If we don’t hear back,
try again
@cdavisafc
CLOUD-NATIVE SERVICE
CIRCUIT BREAKERS
▸ This is your protection against
DDOSing yourself
https://martinfowler.com/bliki/CircuitBreaker.html
@cdavisafc
CLOUD-NATIVE SERVICE
DISTRIBUTED TRACING
@cdavisafc
CLOUD-NATIVE SERVICE
@cdavisafc
CLOUD-NATIVE SERVICE
DISTRIBUTED TRACING
▸ App must look for and leave tracers
▸ Use a framework to help you do
this!!!
▸ Tools can then read and correlate logs
SERVICE
APP
SERVICE
APP
APP
SERVICE
APP
SERVICE
APP
SERVICE
APP
CLOUD-NATIVE DATA
@cdavisafc
CLOUD-NATIVE DATA
WE ARE LOOSELY COUPLED!
@cdavisafc
CLOUD-NATIVE DATA
OR ARE WE?
@cdavisafc
CLOUD-NATIVE DATA
THIS IS NOT CLOUD-NATIVE DATA
@cdavisafc
CLOUD-NATIVE DATA
DATA APIS (SERVICES)
▸ Microservices do not access data layer directly
▸ Except for those that implement the data API
▸ A surface area to:
▸ Implement access control
▸ Implement throttling
▸ Perform logging
▸ Other policies…
@cdavisafc
CLOUD-NATIVE DATA
ANTI-PATTERN: DATA APIS THAT JUST PROXY
@cdavisafc
CLOUD-NATIVE DATA
EVERY MICROSERVICE NEEDS A CACHE
@cdavisafc
CLOUD-NATIVE DATA
“Caching at Netflix: The Hidden Microservice” https://www.youtube.com/watch?v=Rzdxgx3RC0Q
@cdavisafc
CLOUD-NATIVE DATA
VERSIONED DATA APIS (SERVICES)
▸ We are already familiar with versioned
microservices…
V1 V2
@cdavisafc
CLOUD-NATIVE DATA
VERSIONED DATA APIS (SERVICES)
▸ We are already familiar with versioned
microservices…
… and
V1 V2
PARALLEL DEPLOYS
@cdavisafc
TEXT
We used to:
AUTONOMY!
V2
V1
All clients moved in lockstep
Or another:
V1.0
V1.1 V2.0
Now, one option:
V1.0
V1.1
V2.0
V2.1
Or even:
V1.0 V2.0
(!) Think Unified Log
@cdavisafc
CLOUD-NATIVE DATA
DATABASE PER MICROSERVICES
@cdavisafc
CLOUD-NATIVE DATA
DATABASE PER MICROSERVICES
▸ Supports Polyglot persistence
▸ Independent availability, backup/restore, access
patterns, etc.
My
Connections
API
Posts
API
New from
Network
API
CLOUD-NATIVE DATA
@cdavisafc
CLOUD-NATIVE DATA
CLIENT SIDE JOIN My
Connections
API
Posts
API
New from
Network
API
@cdavisafc
EVENT-DRIVEN SYSTEMS
My
Connections
API
Posts
API
New from
Network
API
CLOUD-NATIVE DATA
@cdavisafc
CLOUD-NATIVE DATA
INDEPENDENT DATABASES - SHARED ENTITIES
▸ We’ve started to break up the data monolith
▸ BUT our data integration “strategy” is rather
brittle and bespoke
▸ How are changes to data in one bounded
context reflected in the other?
Sales
Support
?
My
Connections
API
Posts
API
New from
Network
API
My
Connections
API
Posts
API
New from
Network
API
My
Connections
API
Posts
API
New from
Network
API
Unified Log
@cdavisafc
CLOUD-NATIVE DATA
SOURCE OF TRUTH
My
Connections
API
Posts
API
New from
Network
API
Unified Log
@cdavisafc
CLOUD-NATIVE ARCHITECTURES
▸ Cloud-native Apps
▸ Scale out
▸ Statelessness
▸ Externalize configuration
▸ Implications from changes in the application
lifecycle
▸ Versioned services
▸ Service Discovery
▸ Distributed tracing
▸ Retries
▸ Cloud-native Data
▸ Breaking the Data monolith
▸ Data APIs
▸ Caching
▸ Polyglot Persistence
▸ Event sourcing
@cdavisafc
REFERENCES
▸ Scott Mansfield of the Netflix Caching team:
▸ Public video: https://www.youtube.com/watch?
v=Rzdxgx3RC0Q&t=205s
▸ Safari books online video (slightly expanded): https://
www.safaribooksonline.com/library/view/oreilly-
software-architecture/9781491976142/
video289789.html
▸ Slideshare: https://www.slideshare.net/ScottMansfield3/
application-caching-the-hidden-microservice
▸ Netflix on the “brief availability blip”: https://medium.com/
netflix-techblog/chaos-engineering-
upgraded-878d341f15fa
THANK YOU
https://content.pivotal.io/blog/cloud-native-and-the-apparating-app

Cloud Native Architectures for Devops