12 Factor

12 Factor

2021, Nov 08    

Nguồn: 12factor.net

I. Codebase

  • Một codebase được quản lý bởi một source control như Git, Subversion,… và có thể deploy nhiều nơi

II. Dependencies

  • Các dependencies như library, framework,… phải khai báo rõ ràng, tách biệt với ứng dụng

III. Config

  • Tách biệt cấu hình ra khỏi source code. Các cấu hình có thể thay đổi qua các môi trường deploy, nhưng source code thì không.

  • Các config này được lưu trữ trong các biến môi trường (environment variable)

IV. Backing services

  • Xem các backing service đi kèm như database, messaging… là resouce của ứng dụng, không có sự khác biệt khi sử dụng resouce local, cloud hay bên thứ 3.

V. Build, release, run

  • Tách biệt quá trình build, release và run.
    • Build: chuyển source code thành mã có thể chạy được như file .jar, .war,… gọi là một bản build
    • Release: kết hợp bản build với config thành một bản release có thể chạy được trên môi trường tương ứng. Mỗi bản release có một unique release ID, bất kỳ thay đổi sẽ tạo ra một bản release mới.
    • Run: chạy bản release trên môi trường tương ứng.

VI. Processes

  • Chỉ sử dụng stateless process

  • Stateless process là:
    • Process không lưu trữ trạng thái của ứng dụng, kết quả xử lý request, transaction
    • Sau khi xử lý xong request/transaction, các dữ liệu lưu trữ trong memory sẽ được xóa đi
  • Trong trường hợp muốn lưu trữ những dữ liệu liên quan đến trạng thái của ứng dụng, bạn sẽ phải sử dụng thông qua các backing service như database, cache,…

VII. Port binding

  • Ứng dụng có thể tự đóng gói, mà cần tích hợp webserver. Ứng dụng web sẽ public, nhận request thông qua một port và xử lý nó.

VIII. Concurrency

  • Fast start-up: Thời gian khởi động nhanh Graceful shutdown

IX. Disposability (Tính sẵn sàng)

  • Ứng dụng có thể được start/stop tại một thời điểm nào đó và nên có
    • Fast start-up: thời gian khởi động nhanh
    • Graceful shutdown

X. Dev/prod parity

  • Giữ các môi trường deploy (dev, stagging, production) giống nhau nhất có thể.

XI. Logs

  • Ứng dụng không quan tâm đến đầu ra của log là file, database hay bất kỳ cái gì, mà ứng dụng chỉ viết log ra stdout.

XII. Admin processes

  • Các task admin/management (tạo database, thêm config) nên chạy cùng môi trường với ứng dụng