Slide 1

Slide 1 text

@rdegges @rdegges 12 Factors of PAIN and SUFFERING Sad Programming Stories

Slide 2

Slide 2 text

@rdegges HEY, I'm Randall. Head of DevRel @ OKTA Python/JS/Go Hacker Open Source * Author Builder

Slide 3

Slide 3 text

@rdegges The 12 Factor App "A methodology for building simple, scalable, and dependable web applications."

Slide 4

Slide 4 text

@rdegges I fucked up.

Slide 5

Slide 5 text

@rdegges I. Codebase One codebase tracked in revision control, many deploys. Code Prod Stag Dev1 Dev2

Slide 6

Slide 6 text

@rdegges 818-217-9229 - Randall Degges - Granada Hills, CA 94519 - He is *not* a spam bot - Etc... $$$ I hate your website. CODEBASE newsketchdomain.com CODEBASE1 CODEBASE2 domain1.com domain2.com CTRL-C + CTRL-V

Slide 7

Slide 7 text

@rdegges

Slide 8

Slide 8 text

@rdegges II. Dependencies Explicitly declare and isolate dependencies.

Slide 9

Slide 9 text

@rdegges How It Works { "dependencies": { "axios": "^0.18.0", "dotenv": "^6.1.0", "express": "^4.16.4", "vue": "^2.5.17" } } Declare Dependencies $ npm install + dotenv@6.1.0 + axios@0.18.0 + express@4.16.4 + vue@2.5.17 added 57 packages from 41 contributors and audited 128 packages in 2.064s found 0 vulnerabilities Isolate Dependencies

Slide 10

Slide 10 text

@rdegges Image Optimization API Shrink this image! OK! Let me optimize that for you. VPS - optipng - jpegoptim - gifsicle - ... code optipng gifsicle

Slide 11

Slide 11 text

@rdegges III. Config Store config in the environment DATABASE_URL MAX_THREADS API_KEY PRICE

Slide 12

Slide 12 text

@rdegges Asterisk Fuuuuuuuuuuuuuck. Phone calls SMS Etc. Rackspace API Key Code GitHub! - $25,000

Slide 13

Slide 13 text

@rdegges IV. Backing Services Treat backing services as attached resources. Production Deploy Postgres S3 SMTP smtp://auth@host https://auth@s3.amazonaws.com postgres://auth@host/db

Slide 14

Slide 14 text

@rdegges Blog MySQL I should make a blog. I should give out pirated movies to everyone. ERROR: No disk space MySQL

Slide 15

Slide 15 text

@rdegges V. Build, Release, Run Strictly separate build and run stages. Code Build Config Release

Slide 16

Slide 16 text

@rdegges WEbsite Code $ scp -r my_project root@104.102.96.72: Web Server $ ssh root@104.102.96.72 (root) $ vim my_project/admin.php

Slide 17

Slide 17 text

@rdegges

Slide 18

Slide 18 text

@rdegges VI. Processes Execute the app as one or more stateless processes.

Slide 19

Slide 19 text

@rdegges Conference Call App Datacenter Conference Call App Conference Call App 818-217-9229 555-444-3333 925-431-1337

Slide 20

Slide 20 text

@rdegges VII. Port Binding Expose services via port binding. 0.0.0.0:80 localhost:443 Routing App $PORT App $PORT App $PORT

Slide 21

Slide 21 text

@rdegges VIII. Concurrency Scale out via the process model. web.1 web.2 worker.1 worker.2 worker.3 worker.4 clock.1 Process Types Scale

Slide 22

Slide 22 text

@rdegges IRC Web App daemon(); process process process process IRC Room IRC Room IRC Room

Slide 23

Slide 23 text

@rdegges IX. Disposability Maximize robustness with fast startup and graceful shutdown. Shut down gracefully when SIGTTERM is received Shut down within a few seconds Be robust against sudden death

Slide 24

Slide 24 text

@rdegges Process 1 Load Balancer Requests Process 2 Process 3 Process 4 Process 5 def startup(): download_audio() listen(env["PORT"])

Slide 25

Slide 25 text

@rdegges X. Dev/Prod Parity Keep development, staging, and production as similar as possible. Code Postgres SQLite VARCHARRRRR

Slide 26

Slide 26 text

@rdegges XI. Logs Treat logs as event streams. App ... Order by timestamp Write to STDOUT Consist of *all* process and backing services logs

Slide 27

Slide 27 text

@rdegges Conference Call Web App Conference Call API Asterisk Asterisk Asterisk ... calls.csv $ scp root@...:calls.csv . Log Router

Slide 28

Slide 28 text

@rdegges XII. Admin Processes Run admin/management tasks as one-off processes. Code Admin Task Run a database migration $ python manage.py migrate Prod Infrastructure

Slide 29

Slide 29 text

@rdegges Run a database migration New Feature Alter Table DB Migration Code "I only need to do this onceā€¦ So..." $ python manage.py migrate Deploy Feature!

Slide 30

Slide 30 text

@rdegges @rdegges Thank You rdegges.com developer.okta.com @oktadev