You are on page 1of 49

12 Factor App

Wednesday, February 22, 12


Craig Kerstiens
@craigkerstiens

Wednesday, February 22, 12


Safe Harbor
Safe harbor statement under the Private Securities Litigation Reform Act of 1995.
This presentation may contain forward-looking statements that involve risks, uncertainties, and assumptions. If any such
uncertainties materialize or if any of the assumptions proves incorrect, the results of salesforce.com, inc. could differ materially
from the results expressed or implied by the forward looking-statements we make. All statements other than statements of
historical fact could be deemed forward-looking, including any projections of product or service availability, subscriber growth,
earnings, revenues, or other financial items and any statements regarding strategies or plans of management for future
operations, statements of belief, any statements concerning new, planned, or upgraded services or technology developments and
customer contracts or use of our services.
The risks and uncertainties referred to above include - but are not limited to - risks associated with developing and delivering
new functionality for our service, new products and services, our new business model, our past operating losses, possible
fluctuations in our operating results and rate of growth, interruptions or delays in our Web hosting, breach of our security
measures, the outcome of intellectual property and other litigation, risks associated with possible mergers and acquisitions, the
immature market in which we operate, our relatively limited operating history, our ability to expand, retain, and motivate our
employees and manage our growth, new releases of our service and successful customer deployment, our limited history
reselling non-salesforce.com products, and utilization and selling to larger enterprise customers. Further information on potential
factors that could affect the financial results of salesforce.com, inc. is included in our annual report on Form 10-Q for the most
recent fiscal quarter ended. This documents and others containing important disclosures are available on the SEC Filings section
of the Investor Information section of ou Web site.
Any unreleased services or features referenced in this or other presentations, press releases or public statements are not
currently available and may not be delivered on time or at all. Customers who purchase our services should make the purchase
decisions based upon features that are currently available. Salesforce.com, inc. assumes no obligation and does not intend to
update these forward-looking statements.

Wednesday, February 22, 12


12 Factor App

Wednesday, February 22, 12


First some history

Wednesday, February 22, 12


Where we’ve been

Wednesday, February 22, 12


Where we’ve been
Version Control

Wednesday, February 22, 12


Where we’ve been
Version Control
Dependency Management

Wednesday, February 22, 12


Where we’ve been
Version Control
Dependency Management
Build/Release

Wednesday, February 22, 12


Where we’ve been

Version Control
Wednesday, February 22, 12
Where we’ve been

Version Control
Folders

Wednesday, February 22, 12


Where we’ve been

Version Control
Folders
SVN

Wednesday, February 22, 12


Where we’ve been

Version Control
Folders
SVN
Git/Mercurial

Wednesday, February 22, 12


Where we’re going

Version Control
Wednesday, February 22, 12
Where we’re going

Version Control
1 Code base
Many deploys

Wednesday, February 22, 12


Where we’ve been

Dependency Management
Wednesday, February 22, 12
Where we’ve been

Dependency Management
$ python setup.py install

Wednesday, February 22, 12


Where we’ve been

Dependency Management
$ python setup.py install

$ easy_install somepackage

Wednesday, February 22, 12


Where we’re going

Dependency Management
Wednesday, February 22, 12
Where we’re going

Dependency Management
$ pip install somepackage

Wednesday, February 22, 12


Where we’re going

Dependency Management
$ pip install somepackage

$ pip freeze > requirements.txt

Wednesday, February 22, 12


Where we’ve been

Build/Release
$ rsync myproject tomyserver

Wednesday, February 22, 12


Where we’re going

Build/Release
Wednesday, February 22, 12
Where we’re going

Build/Release
Wednesday, February 22, 12
Future Trends

Wednesday, February 22, 12


12 Factor

Wednesday, February 22, 12


12 Factor

Declarative Setup - Minimize setup time

Wednesday, February 22, 12


12 Factor

Declarative Setup - Minimize setup time


Clean Contracts - Portability

Wednesday, February 22, 12


12 Factor

Declarative Setup - Minimize setup time


Clean Contracts - Portability
Deploy Practices - Cloud and horizontal scaling

Wednesday, February 22, 12


12 Factor

Declarative Setup - Minimize setup time


Clean Contracts - Portability
Deploy Practices - Cloud and horizontal scaling
Minimize Divergence - Continuous Deployment
Wednesday, February 22, 12
Dev/Prod Parity

Wednesday, February 22, 12


Dev/Prod Parity

Dev

Wednesday, February 22, 12


Dev/Prod Parity

Dev = Staging

Wednesday, February 22, 12


Dev/Prod Parity

Dev = Staging = Prod

Wednesday, February 22, 12


Dev/Prod Parity

Dev = Staging = Prod


sqlite ≠ postgres = postgres

Wednesday, February 22, 12


Dev/Prod Parity

Dev = Staging = Prod


sqlite ≠ postgres = postgres

Wednesday, February 22, 12


Dev/Prod Parity

Dev = Staging = Prod


sqlite ≠ postgres = postgres
postgres = postgres = postgres
Wednesday, February 22, 12
Config
$ ls
settings.py
prod-settings.py
dev-settings.py
local-settings.py

Wednesday, February 22, 12


Config
$ ls
settings.py
prod-settings.py
dev-settings.py
local-settings.py

dev ≠ staging ≠ prod


Wednesday, February 22, 12
Config
(External to your code)
$ cat .env
DATABASE_URL=postgres://user:pass@host/db
SENTRY_URL=https://user:pass@host/key
S3_BUCKET=mybucket
S3_KEY=mykey
S3_TOKEN=mytoken

Wednesday, February 22, 12


Config
$ cat settings.py
import os

MY_SETTING = os.environ.get(‘SETTING’)

Wednesday, February 22, 12


Config
$ cat settings.py
import os

MY_SETTING = os.environ.get(‘SETTING’)

dev = staging = prod


Wednesday, February 22, 12
Concurrency
Worker.4
(Running Processes)

Worker.3
Scale

Web.2 Worker.2

Web.1 Worker.1 Celery.1

Workload Diversity
(Process Types)
Wednesday, February 22, 12
Disposability

Wednesday, February 22, 12


Logs
How we use logs
$ tail -f access_log

How we perceive logs


$ ls
access_log
error_log
Wednesday, February 22, 12
Logs
Web Worker
DB
Process Process

Event Stream
2012-02-22T19:56:40+00:00 [postgres]: ....
2012-02-22T19:56:40+00:00 [router]: GET mysite.com/ ...
2012-02-22T19:56:40+00:00[nginx]: ....
2012-02-22T19:56:40+00:00[worker]: ....
Wednesday, February 22, 12
12 Factor
Version Control
Dependency Management
Build/Release (CI)
Dev/Staging/Prod Parity
Concurrency
External Config
Disposability
Logs as Streams
Wednesday, February 22, 12
12 Factor

Declarative Setup - Minimize setup time


Clean Contracts - Portability
Deploy Practices - Cloud and horizontal scaling
Minimize Divergence - Continuous Deployment
Wednesday, February 22, 12
Fin.
Resources
http://www.12factor.net
http://www.heroku.com
http://bit.ly/socalpiggies

Wednesday, February 22, 12

You might also like