The Twelve-Factor

The Twelve-Factor 是由 Heroku Founder 同時也是 CTO 的 Adam Wiggins 所提出。他在參與了數以百計的軟體開發部署,加上他在 Heroku 間接見證數十萬應用軟體發展後,所構築出的理論。綜合了關於 SaaS 所有的經驗與智慧,提出理想中最佳實踐 (Best practices) 的準則。其中特別關注應用軟體如何保持良性成長,開發者之間如何進行有效的程式碼協作。

摘要

在現在的時代,軟體一般會以服務的形式來交付,稱為 軟體及服務SaaS (Software-as-a-service),Twelve-Factor 為建構 SaaS 應用服務關注以下這些面向:

  • 使用自動化的標準流程,從而使新的開發者以最少的學習成本加入這個專案
  • 和作業系統之間儘可能的劃清界限,在各個系統中提供最大的可移植性
  • 適合部署在現代的雲端運算平台,從而在伺服器與系統管理方面節省資源
  • 將開發環境和生產環境的差異降至最低,並使用持續交付實施敏捷開發
  • 可以在工具、架構和開發流程不發生明顯變化的前提下達成擴充

這套理論適用於任意語言和後端服務(資料庫、訊息佇列、記憶體快取等)開發的應用服務。

準則

  1. 基準程式碼:一份版本管理的基準程式碼,多份部署
    Codebase - One codebase tracked in revision control, many deploys

  2. 相依性:外顯示地宣告相依關係
    Dependencies - Explicitly declare and isolate dependencies

  3. 設定檔:在環境中儲存設定檔
    Config - Store config in the environment

  4. 後端服務:把後端服務當作附加資源
    Backing services - Treat backing services as attached resources

  5. 建置,發佈,執行:嚴格分離建置和執行
    Build, release, run - Strictly separate build and run stages

  6. 程序:以一個或多個無狀態的程序執行應用程式
    Processes - Execute the app as one or more stateless processes

  7. 通訊埠綁定:使用通訊埠綁定方式提供服務
    Port binding - Export services via port binding

  8. 併發:透過程序模型進行擴充
    Concurrency - Scale out via the process model

  9. 可拋棄性:快速啟動和優雅終止可最大化穩健性
    Disposability - Maximize robustness with fast startup and graceful shutdown

  10. 開發環境與線上環境等價:儘可能的保持開發,預發佈,線上環境相同
    Dev/prod parity - Keep development, staging, and production as similar as possible

  11. 日誌:把日誌當作事件流
    Logs - Treat logs as event streams

  12. 管理程序:後台管理任務當作一次性程序執行
    Admin processes - Run admin/management tasks as one-off processes