批量任務後臺執行功能實現細節。

將客戶端開啓、關閉、修改認證功能後臺執行。

一、後臺執行過程中出現錯誤或者遇到系統重啓時自動修復。

二、自動修復未啓動前,提供提前修覆按鈕。

三、每個客戶端在線程執行過程中提供提前操作處理。

四、前端展示進度。

五、自定義賬戶展示、恢復默認賬戶功能。

限制:

1、線程運行過程中或者出現運行錯誤時不能運行其他線程。(考慮優化爲出現錯誤時,可以運行其他線程。)

2、線程運行過程中不能刪除客戶端。

3、線程運行過程中還沒處理的客戶端不能單獨操作認證。

 

實現:

需求一實現方案:

原定方案:

線程開啓、關閉、修改時,在mon db中寫入任務執行狀態(operation_type: 0-開啓,1-關閉, 2-修改, status: running-運行中, end:執行遇到錯誤或者系統重啓。 end-running-後臺修復線程執行中)、認證信息以及所有的客戶端信息、進度信息,每處理一個客戶端則刪除一個客戶端,並更新進度。

問題:

每次處理一個客戶將端的操作在客戶端少的時候不會對性能有影響,但是當客戶端達到1000左右時,寫入mon db的操作將是一個比較耗時的操作。

優化方案:

1、線程開始後客戶端信息、進度信息不存入mon db,針對執行過程中客戶端是否已經被開啓和關閉是可以通過客戶端當前認證狀態獲取的,針對修改的情況,每次線程處理或者提前處理以後,將已經處理的客戶端存儲到內存中來達到判斷客戶端是否已經被修改。

2、進度信息存儲在內存中,如果後臺任務運行過程中遇到錯誤或者重啓,修復線程運行時進度重新計算,注意,修復線程運行時的進度爲總客戶端數減去之前已經被提前處理的客戶端數。

優化方案優勢爲能保證系統正常使用時不會出現操作mon db耗時的性能問題,劣勢爲當後臺修復線程運行中出現重啓時,會將已經修改過的客戶端再次重複修改(因爲重啓以後內存在記錄已經修改的客戶端數據已經不存在)。

 

需求二實現方案:

需求背景:

當後臺線程出現錯誤時,後臺會有一個5分鐘的定時線程嘗試自動修復,在修復線程沒有自動運行時,用戶客戶通過前端頁面提前修復。

方案:

後端提供修復接口,接口收到請求後則再次啓動一個修復線程,這個修復線程運行結束則停止,不再定時執行。修復線程前需要判斷當前是否有正常線程以及修復線程已經在運行,如果已經在運行則不啓動線程。

修復線程起來時,需要將之前記錄的客戶端進度信息清空,並將新的進度修改爲總客戶端數減去提前修改的客戶端數,將提前處理的客戶端標記爲已經處理進度,如果是修改操作將提前處理的客戶端標記爲已經修改,如果檢查到之前已經被操作的客戶端,則重新更新進度,如果是提前操作的客戶端,修復線程運行到這個客戶端時,則不更新進度。

 

需求三實現方案:

需求背景:

線程運行過程中,用戶想要提前修改後面的客戶端則可以執行提前操作。

方案:

操作每個客戶端都需加鎖,通過裝飾器實現,共享變量的修改需要在操作客戶端的方法內實現。

考慮到進度問題,需要將線程處理過或者提前處理的客戶端標記爲已經已經處理進度,每次操作客戶端時,如果是檢查到已經操作,則判斷是否已經修改進度,如果沒有更新進度,則需要更新進度。(處理依據:當客戶端被提前處理時,線程運行到這個客戶端以後不需要更新客戶端,因爲提前操作時已經更新,如果是線程出現失敗,則進度重新開啓,針對已經處理了進度的客戶端,需要判斷是否是之前的線程處理的還是此次修復線程運行過程中提前處理的客戶端,如果是之前線程處理的客戶端,則需要更新進度)

考慮到修復線程進度問題,需要將提前處理的客戶端記錄到mon db,修復線程啓動時的進度爲總客戶端數減去提前處理客戶端數。

 

需求四實現方案:

方案:

內存中存儲客戶端進度數據,如果遇到線程錯誤或者重啓則重新計算。

 

需求四實現方案:

方案:

如果修改客戶端單向認證不是線程處理或者提前處理的,則將其標記爲自定義認證客戶端,記錄到mon db,只有當刪除客戶端、關閉客戶端chap、恢復默認認證時將客戶端記錄清空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章