XII. 管理進(jìn)程
后臺(tái)管理任務(wù)當(dāng)作一次性進(jìn)程運(yùn)行
進(jìn)程構(gòu)成(process formation)是指用來(lái)處理應(yīng)用的常規(guī)業(yè)務(wù)(比如處理 web 請(qǐng)求)的一組進(jìn)程。與此不同,開(kāi)發(fā)人員經(jīng)常希望執(zhí)行一些管理或維護(hù)應(yīng)用的一次性任務(wù),例如:
- 運(yùn)行數(shù)據(jù)移植(Django 中的
manage.py migrate, Rails 中的rake db:migrate)。 - 運(yùn)行一個(gè)控制臺(tái)(也被稱(chēng)為 REPL shell),來(lái)執(zhí)行一些代碼或是針對(duì)線(xiàn)上數(shù)據(jù)庫(kù)做一些檢查。大多數(shù)語(yǔ)言都通過(guò)解釋器提供了一個(gè) REPL 工具(
python或perl) ,或是其他命令(Ruby 使用irb, Rails 使用rails console)。 - 運(yùn)行一些提交到代碼倉(cāng)庫(kù)的一次性腳本。
一次性管理進(jìn)程應(yīng)該和正常的 常駐進(jìn)程 使用同樣的環(huán)境。這些管理進(jìn)程和任何其他的進(jìn)程一樣使用相同的 代碼 和 配置 ,基于某個(gè) 發(fā)布版本 運(yùn)行。后臺(tái)管理代碼應(yīng)該隨其他應(yīng)用程序代碼一起發(fā)布,從而避免同步問(wèn)題。
所有進(jìn)程類(lèi)型應(yīng)該使用同樣的 依賴(lài)隔離 技術(shù)。例如,如果Ruby的web進(jìn)程使用了命令 bundle exec thin start ,那么數(shù)據(jù)庫(kù)移植應(yīng)使用 bundle exec rake db:migrate 。同樣的,如果一個(gè) Python 程序使用了 Virtualenv,則需要在運(yùn)行 Tornado Web 服務(wù)器和任何 manage.py 管理進(jìn)程時(shí)引入 bin/python 。
12-factor 尤其青睞那些提供了 REPL shell 的語(yǔ)言,因?yàn)槟菚?huì)讓運(yùn)行一次性腳本變得簡(jiǎn)單。在本地部署中,開(kāi)發(fā)人員直接在命令行使用 shell 命令調(diào)用一次性管理進(jìn)程。在線(xiàn)上部署中,開(kāi)發(fā)人員依舊可以使用ssh或是運(yùn)行環(huán)境提供的其他機(jī)制來(lái)運(yùn)行這樣的進(jìn)程。