1. 程式人生 > >雲計算時代應用設計十二要素

雲計算時代應用設計十二要素

uil 推薦 ras 相似性 back size ont imp staging

雲計算時代應用設計十二要素

在雲計算時代。應用的整個生命周期將在數據中心裏度過。這跟傳統軟件模式極大不同。

雲應用實際上意味著:代碼 + 配置 + 執行時環境。

  • 什麽樣的軟件才是可用性和可維護性好的軟件?
  • 什麽樣的代碼才幹避免興許開發的上手障礙?
  • 什麽樣的實施才幹可靠的執行在分布式的環境中?

Heroku (一家 PaaS 服務提供者。2010 年被 Salesforce 收購)平臺創始人 Adam Winggins 提出了推薦的應用十二風格,對我們設計和實現雲時代(特別是 PaaS 和 SaaS 上)高效的應用都有非常好的參考意義。

以下結合實踐經驗進行解讀。

Codebase - 代碼倉庫

One codebase tracked in revision control, many deploys

每一個子系統都用獨立代碼庫管理,使用版本號管理,實現獨立的部署。

即拆分系統為多個分布式應用,每一個應用使用自己的代碼庫進行管理。多個應用之間共享的代碼用依賴庫的形式提供。

Dependencies - 依賴

Explicitly declare and isolate dependencies

顯式聲明依賴。通過環境來嚴格隔離不同依賴。所依賴的跟所聲明的要保持一致。而且聲明要包含依賴庫的版本號信息。

Config - 配置

Store config in the environment

在環境變量中保存配置信息,而避免放在源代碼或配置文件裏。

Backing Services - 後端服務

Treat backing services as attached resources

後端服務(數據庫、消息隊列、緩存等)作為可掛載資源來使用,這樣系統跟外部依賴盡量松耦合。

Build, release, run - 生命周期管理

Strictly separate build and run stages

區分不同生命周期的執行環境。包含創建(代碼編譯為執行包)、公布(多個執行包和配置放一起打包,打包是一次性的,每次改動都是新的 release)、執行。各個步驟的任務都非常明白。要相互隔離。比如,絕對不同意在執行時去改代碼和配置信息(見過太多project師直接 SSH 到生產環境修 bug 了)。

Processes - 進程

Execute the app as one or more stateless processes

以一個或多個無狀態的進程來執行應用。即盡量實現無狀態。不要在進程中保存數據。盡量通過數據庫來共享數據。

Port binding - port

Export services via port binding

通過port綁定來對外提供服務。

能夠是 HTTP、XMPP、Redis 等協議。多個應用之間通過 URL 來使用彼此的服務。

Concurrency - 並發模型

Scale out via the process model

通過進程控制來擴展,即盡量以多進程模型進行擴展。

Disposability - 隨意存活

Maximize robustness with fast startup and graceful shutdown

高速啟動(秒級響應)。優雅關閉(收到 SIGTERM 信號後結束正在處理請求,然後退出),並盡量魯棒(隨時 kill。隨時 crash 都不應該導致問題)。

Dev/prod parity - 降低開發與生產環境的差異性

Keep development, staging, and production as similar as possible

盡量保持從開發、演練到生產部署環境的相似性。

這點非常不easy,真正要求project師懂研發,還得懂運維。

Logs - 日誌

Treat logs as event streams

將日誌當作事件流來進行統一的管理和維護(使用 Logstash 等工具)。

應用僅僅須要將事件寫出來,比如到標準輸出 stdout,剩下的由採集系統處理。

Admin processes - 管理

Run admin/management tasks as one-off processes

將管理(遷移數據庫、查看狀態等)作為一次性的系統服務來使用。

管理代碼跟業務代碼要放在一起進行代碼管理。

轉載請註明:http://blog.csdn.net/yeasy/article/details/40457885。

技術分享


雲計算時代應用設計十二要素