如何安全可靠的處理後臺任務 Cache應用/任務Mutex,用於高併發任務處理通過多個項目使用

在愈來愈多的應用智能化,不少後臺功能不能及時反饋給用戶,可是又不影響用戶的體驗,大量的任務後臺化,由服務器處理完以後再反饋給用戶。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 (源碼) :

     Cache應用/任務Mutex,用於高併發任務處理通過多個項目使用

 

特推薦 Abstract Service (源碼) :

  可私信oShine索取

相關文章
相關標籤/搜索