Top Banner
12 Factor App Best Practices for Scala Deployment
83

12 Factor Scala

Jul 28, 2015

Download

Internet

Joe Kutner
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: 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