83
12 Factor App Best Practices for Scala Deployment

12 Factor Scala

Embed Size (px)

Citation preview

Page 1: 12 Factor Scala

12 Factor AppBest Practices for Scala Deployment

Page 2: 12 Factor Scala

2005 2015

WAR files JAR files

App Servers Microservices

Java Scala

Hot-Deploy Continuous Deploy

Page 3: 12 Factor Scala

Joe Kutner@codefinger

JVM Platform Owner@Heroku

Joe Kutner

Page 4: 12 Factor Scala

12 Factor Appa methodology

ScalabilityMaintainability

Portability

Page 5: 12 Factor Scala

• Immutable• Ephemeral• Declarative• Automated

Page 6: 12 Factor Scala

https://github.com/sbt/sbt-native-packager

Page 7: 12 Factor Scala

addSbtPlugin( "com.typesafe.sbt" % "sbt-native-packager" % "0.7.6")

project/plugins.sbt

Page 8: 12 Factor Scala

$ sbt stage

Page 9: 12 Factor Scala

without further ado…

Page 10: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 11: 12 Factor Scala

Thank You!Goodbye!

(just kidding)

Page 12: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 13: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 14: 12 Factor Scala

Use Version Control

Page 15: 12 Factor Scala
Page 16: 12 Factor Scala
Page 17: 12 Factor Scala

BAD

Page 18: 12 Factor Scala

BAD

App #1 App #2

Page 19: 12 Factor Scala

my-project ! build.sbt ! app ! conf ! public ! my-library ! build.sbt ! src ! main ! scala

Page 20: 12 Factor Scala

my-project ! build.sbt ! app ! conf ! public ! my-library ! my-sub-project ! build.sbt ! src ! main ! scala

BAD

Page 21: 12 Factor Scala

Submodules

Page 22: 12 Factor Scala

$ git submodule add https://github.com/jkutner/play-sub-project

Page 23: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 24: 12 Factor Scala

Don’t check JAR files into Git

Page 25: 12 Factor Scala
Page 26: 12 Factor Scala

Never rely on implicit existence of system-wide

packages

Explicitly declare and isolate

dependencies

Page 27: 12 Factor Scala

global local

BAD GOOD

Dependencies

~/.m2

~/.ivy2

(ok in dev)

target/

Page 28: 12 Factor Scala

Vendoring

GOOD

Page 29: 12 Factor Scala

$ sbt stage...

$ tree target/universal/stage/lib/target/universal/stage/lib/"## ch.qos.logback.logback-classic-1.1.1.jar"## ch.qos.logback.logback-core-1.1.1.jar"## com.fasterxml.jackson.core.jackson-annotations-2.3..."## com.fasterxml.jackson.core.jackson-core-2.3.2.jar"## com.fasterxml.jackson.core.jackson-databind-2.3.2.jar"## com.google.guava.guava-16.0.1.jar...

Page 30: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 31: 12 Factor Scala

Don’t check passwords into Git

Page 32: 12 Factor Scala

Or was it “DUH”?😳

Page 33: 12 Factor Scala

Can you make your app open source at any moment, without compromising

any credentials?

Litmus Test

Page 34: 12 Factor Scala

• Resource handles to the database, Memcached, and other backing services

• Credentials to external services such as Amazon S3 or Twitter

• Per-deploy values such as the canonical hostname for the deploy

Anything that changes between deployment environments:

(does not include things like conf/routes)

Configuration is…

Page 35: 12 Factor Scala

Configuration belongs in the environment,

not in the application

Configuration should be strictly separated

from code

Page 36: 12 Factor Scala

db.default.url=${DATABASE_URL}

conf/application.conf

Page 37: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 38: 12 Factor Scala

db.default.url=${DATABASE_URL}

conf/application.conf

Page 39: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 40: 12 Factor Scala

build, release, run

Page 41: 12 Factor Scala

$ sbt stage...

$ sbt deployHeroku...

# in the cloud!$ target/universal/stage/bin/my-app

build

release

run

Page 42: 12 Factor Scala

$ sbt run

BAD(in production)

Page 43: 12 Factor Scala

simple build tool

Page 44: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 45: 12 Factor Scala

DEMO!

Page 46: 12 Factor Scala

$ sbt stage...

$ sbt deployHeroku...

# in the cloud!$ target/universal/stage/bin/scaladays

build

release

run

Page 47: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 48: 12 Factor Scala

Processes should be stateless

Page 49: 12 Factor Scala

sticky sessions 😞

Page 50: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 51: 12 Factor Scala

The twelve-factor app is completely self-contained

The web app exports HTTP as a service by binding to a port

Page 52: 12 Factor Scala

.war

Traditional Deployment

Page 53: 12 Factor Scala

.jar

Modern Deployment

Page 54: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 55: 12 Factor Scala

ActorsFutures

Agents

RELAX BRO, I GOT THIS…

Page 56: 12 Factor Scala

Scale Up

Scale Out

Page 57: 12 Factor Scala

web.1

web.2

worker.1 clock.1

Workload Diversity

Num

ber o

f Pro

cess

es

worker.2

worker.3

Page 58: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 59: 12 Factor Scala

Graceful shutdown

Quick startup

Resilience to failure

Page 60: 12 Factor Scala

Servers are not pets

Servers are cattle

Page 61: 12 Factor Scala

Application Servers are not disposable

Page 62: 12 Factor Scala

Microservices are disposable

Page 63: 12 Factor Scala

Easy to replace

Decoupled from external infrastructure

Easy to modify

Page 64: 12 Factor Scala

Microservices

Page 65: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 66: 12 Factor Scala

dev

sqlite

postgres

stage

mysql

postgres

prod

postgres

postgres

=

=

=

=

Page 67: 12 Factor Scala

dev

jetty

jetty

stage

tomcat

jetty

prod

jboss

jetty

=

=

=

=

Page 68: 12 Factor Scala

dev

jetty

{}

stage

tomcat

{}

prod

jboss

{}

=

=

=

=

Page 69: 12 Factor Scala

Dropwizard

Page 70: 12 Factor Scala

disposable

⇒reproducible

parity⇒

Page 71: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 72: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 73: 12 Factor Scala

Admin tasks should be run in isolated processes

Page 74: 12 Factor Scala

$ heroku run consoleRunning `console` attached to terminal... up, run.2581Picked up JAVA_TOOL_OPTIONS: -Djava.rmi.server.useCode...Failed to created JLineReader: java.lang.NoClassDefFou...Falling back to SimpleReader.Welcome to Scala version 2.11.1 (OpenJDK 64-Bit Server...Type in expressions to have them evaluated.Type :help for more information.

scala>

Page 75: 12 Factor Scala

web1

web2

web3

admin

Page 76: 12 Factor Scala

$ heroku run sbt console

?

Page 77: 12 Factor Scala

simple build tool

Page 78: 12 Factor Scala

addSbtPlugin( "com.typesafe.sbt" % "sbt-native-packager" % "0.7.6")

project/plugins.sbt

Page 79: 12 Factor Scala

console: target/universal/stage/bin/my-app \ -main scala.tools.nsc.MainGenericRunner \ -usejavacp

Procfile

worker: target/universal/stage/bin/my-app \ -main com.example.MyWorker

Page 80: 12 Factor Scala

The 12 Factors• Codebase

• Dependencies

• Config

• Backing services

• Build, release, run

• Processes

• Port binding

• Concurrency

• Disposability

• Dev/prod parity

• Logs

• Admin processes

Page 81: 12 Factor Scala

http://12factor.net

http://jkutner.github.io

Page 82: 12 Factor Scala

Add sbt-native-packager1.

Run `sbt stage`2.

Deploy to Heroku?3.

Go to the sbt-native-packager talk4.

What next?

Page 83: 12 Factor Scala

Joe Kutner@codefinger

JVM Platform Owner@Heroku

http://www.slideshare.net/jkutner/12-factor-scala