在愈來愈多的應用智能化,不少後臺功能不能及時反饋給用戶,可是又不影響用戶的體驗,大量的任務後臺化,由服務器處理完以後再反饋給用戶。html
隨着這種功能的普遍應用,任務到底有沒有執行成爲維護的難題,畢竟不少小公司開發和維護是一體的。mysql
爲了解決這種任務式的難題,特借鑑了張宴的架構思想:輕量級開源簡單隊列服務 HTTPSQS 1.2 版本發佈[原創][張宴]
redis
在這基礎上,思考了幾個問題:sql
1. HTTPSQS未記錄任務信息服務器
2. 任務失敗後HTTPSQS數據被覆蓋丟失架構
3. 任務處理過程當中被中斷又沒有被catch到異常(致使變成髒任務)併發
4. 任務被重複put (屢次執行,毫無心義)高併發
在這基礎上面輔助使用了Mysql+HTTPSQS+Mutex的模式來實現應用的穩定,任務處理併發性。post
簡單一架構圖以下:測試
Mutex Task :使用redis實現的一種互斥鎖,主要功能用於併發、任務重複執行的控制。
流程步驟:
1. 同時在mysql和Httpsqs插入任務,任務的標識爲WAIT。
2. 後臺SERVICE從HTTPSQS中讀取數據
3. Mutex Task任務標識爲DOING
4. Mysql Task任務標識爲DOING
5. 業務邏輯處理
6. 處理完畢,業務處理失敗:Mutex Task爲ERROR同時Mysql Task爲ERROR。
輔助程序:
1. ERROR Task從新入HTTPSQS,執行以上步驟,根據業務須要控制重試次數,可擴展Mutex Task來實現重試次數
簡單二架構圖以下:
流程步驟:
1. 在mysql插入任務,任務的標識爲WAIT。
2. 輔助程序put任務進入HTTPSQS,Mysql Task標識爲READY。
2. 後臺SERVICE從HTTPSQS中讀取數據
3. Mutex Task任務標識爲DOING
4. Mysql Task任務標識爲DOING
5. 業務邏輯處理
6. 處理完畢,業務處理失敗:Mutex Task爲ERROR同時Mysql Task爲ERROR。
輔助程序:
1. 輔助程序put任務進入HTTPSQS,Mysql Task標識爲READY。
2. ERROR Task更改任務狀態ERROR => WAIT,輔助程序自動按照新任務執行。執行以上步驟,根據業務須要控制重試次數,可擴展Mutex Task來實現重試次數。
架構2已應用於正式環境。
正式環境實施有如下情況出現:
1. 任務DOING狀態,因爲PHP異常機制不是很完善,能夠還原當時環境,測試修正。
2. 任務爲READY狀態,因爲Mutex Task的控制,該任務爲重複任務,是否繼續執行看業務須要。
3. SERVICE無需寫成while(true){//doing task} ,可使用CRON定時+執行次數控制,能夠併發,能夠防止主程序僵死狀態。
特推薦 Mutex Task (源碼) :
特推薦 Abstract Service (源碼) :
可私信oShine索取