Home Navigation

Thursday 16 December 2021

12 Factor App Principles

 

The Twelve-Factor App methodology is a methodology for building software-as-a-service applications. These best practices are designed to enable applications to be built with portability and resilience when deployed to the web.

1.      Code base

use version control, one repo per application, git submodule, maven submodule

2.      Dependencies:

don't check jar in git, use maven, artifactory, gcp artifact

3.      Config:

configuration should be strictly separated from code. As per "config", what varies for the environment to the environment must be moved to configurations and managed via environment variables.         

-        Database connections and credentials, system integration endpoints

-        Credentials to external services such as Amazon S3 or Twitter or any other external apps

-        Application-specific information like IP Addresses, ports, and hostnames, etc.

Principle: can you make your app opensource at anytime without compromising credentials

4.      Backing service:

Database, Message Brokers, any other external systems that the app communicates is treated as Backing service. Treat backing services as attached resources. like messaging service, postgre sql with signle url that can be replaced without making your code change

5.      Build, release, run:

Build stage: transform the code into an executable bundle/ build package.

Release stage: get the build package from the build stage and combines with the configurations of the deployment environment and make your application ready to run.

Run stage: It is like running your app in the execution environment.

Strictly separate the process with single command. You can use CI/CD tools to automate the builds and deployment process. Docker images make it easy to separate the build, release, and run stages more efficiently.

6.      Processes:

Execute the app as one or more stateless processes

As per 12-factor principles, the application should not store the data in in-memory and it must be saved to a store and use from there. As far as the state concern, your application should store the state in the database instead of in memory of the process.

Avoid using sticky sessions, using sticky sessions are a violation of 12-factor app principles. If you would store the session information, you can choose redis or memcached or any other cache provider based on your requirements.

7.      Port binding :

Export services via port binding. The web app exports HTTP as a service by binding to a port and listening to requests coming in on that port. Spring boot is one example of this one. Spring boot by default comes with embedded tomcat, jetty, or undertow.

8.      Concurrency:

By adopting the containerization, applications can be scaled horizontally as per the demands.

9.      Disposability

Maximize robustness with fast Startup and graceful shutdown. Docker containers can be started or stopped instantly. Storing request, state, or session data in queues or other backing services ensures that a request is handled seamlessly in the event of a container crash.

10.  Dev/prod parity

Keep development, staging, and production as similar as possible. This reduces the risks of showing up bugs in a specific environment.

11.  Logs

Treat logs as event streams

observability is the first-class citizen. Observability can be achieved through using APM tools (ELK, Newrelic, and other tools) or log aggregations tools like Splunk, logs, etc.

12.  Admin processes

Run admin/management tasks as one-off processes. Any needed admin tasks should be kept in source control and packaged with the application.

Twelve-factor principles advocates for keeping such administrative tasks as part of the application codebase in the repository. By doing so, one-off scripts follow the same process defined for your codebase.

Ensure one-off scripts are automated so that you don't need to worry about executing them manually before releasing the build. Twelve-factor principles also suggest using the built-in tool of the execution environment to run those scripts on production servers. 

Ref: https://12factor.net/