IX. 易處理
快速啟動(dòng)和優(yōu)雅終止可最大化健壯性
12-Factor 應(yīng)用的 進(jìn)程 是 易處理(disposable)的,意思是說(shuō)它們可以瞬間開(kāi)啟或停止。 這有利于快速、彈性的伸縮應(yīng)用,迅速部署變化的 代碼 或 配置 ,穩(wěn)健的部署應(yīng)用。
進(jìn)程應(yīng)當(dāng)追求 最小啟動(dòng)時(shí)間 。 理想狀態(tài)下,進(jìn)程從敲下命令到真正啟動(dòng)并等待請(qǐng)求的時(shí)間應(yīng)該只需很短的時(shí)間。更少的啟動(dòng)時(shí)間提供了更敏捷的 發(fā)布 以及擴(kuò)展過(guò)程,此外還增加了健壯性,因?yàn)檫M(jìn)程管理器可以在授權(quán)情形下容易的將進(jìn)程搬到新的物理機(jī)器上。
進(jìn)程 一旦接收 終止信號(hào)(SIGTERM) 就會(huì)優(yōu)雅的終止 。就網(wǎng)絡(luò)進(jìn)程而言,優(yōu)雅終止是指停止監(jiān)聽(tīng)服務(wù)的端口,即拒絕所有新的請(qǐng)求,并繼續(xù)執(zhí)行當(dāng)前已接收的請(qǐng)求,然后退出。此類型的進(jìn)程所隱含的要求是HTTP請(qǐng)求大多都很短(不會(huì)超過(guò)幾秒鐘),而在長(zhǎng)時(shí)間輪詢中,客戶端在丟失連接后應(yīng)該馬上嘗試重連。
對(duì)于 worker 進(jìn)程來(lái)說(shuō),優(yōu)雅終止是指將當(dāng)前任務(wù)退回隊(duì)列。例如,RabbitMQ 中,worker 可以發(fā)送一個(gè)NACK信號(hào)。 Beanstalkd 中,任務(wù)終止并退回隊(duì)列會(huì)在worker斷開(kāi)時(shí)自動(dòng)觸發(fā)。有鎖機(jī)制的系統(tǒng)諸如 Delayed Job 則需要確定釋放了系統(tǒng)資源。此類型的進(jìn)程所隱含的要求是,任務(wù)都應(yīng)該 可重復(fù)執(zhí)行 , 這主要由將結(jié)果包裝進(jìn)事務(wù)或是使重復(fù)操作 冪等 來(lái)實(shí)現(xiàn)。
進(jìn)程還應(yīng)當(dāng)在面對(duì)突然死亡時(shí)保持健壯,例如底層硬件故障。雖然這種情況比起優(yōu)雅終止來(lái)說(shuō)少之又少,但終究有可能發(fā)生。一種推薦的方式是使用一個(gè)健壯的后端隊(duì)列,例如 Beanstalkd ,它可以在客戶端斷開(kāi)或超時(shí)后自動(dòng)退回任務(wù)。無(wú)論如何,12-Factor 應(yīng)用都應(yīng)該可以設(shè)計(jì)能夠應(yīng)對(duì)意外的、不優(yōu)雅的終結(jié)。Crash-only design 將這種概念轉(zhuǎn)化為 合乎邏輯的理論。