Node.js躬行記(5)——定時任務的除錯
最近做一個活動,需要用到定時任務,於是使用了 node-schedule 庫。
用法很簡單,就是可配置開始、結束時間,以及重複執行的時間點,如下所示,從2020-12-23T09:00:00Z開始,每10分鐘執行一次,直至2020-12-23T09:30:30Z結束。
schedule.scheduleJob({ start: '2020-12-23T09:00:00Z', end: '2020-12-23T09:30:30Z', rule: '* */10 * * * *' }, test);
一、時間修改困難
如果是需要在未來某個時間段執行的定時任務,那麼要還原真實場景,就得修改伺服器時間。
測試環境雖然可以改時間,但是我們這邊是幾個組共用幾臺伺服器,修改了時間後,可能會影響其他組的業務,並且正式環境的時間是不能修改的。
一開始測試的時候,改過幾次時間,改時間畢竟太繁瑣,每次程式碼釋出,伺服器的時間就又會重置,又要修正一次,還收到了其他組的投訴。
後面就改成今天的時間段,這次的定時任務的時間段有7個,每次修改好後,就要提交一遍程式碼,然後合併分支,最後釋出一下程式碼,服務也會重新啟動。
這種純手工方式過於費時,後面想到可以在後臺做個通用配置(下圖是個配置列表),將這些常量(例如時間引數)存在資料庫(例如MongoDB或MySQL)中,可隨時讀寫。
下圖是個增和改的彈框,在新增的時候需要格式化多行文字中的JSON資料,先用 eval(),再用JSON.stringify(),這樣的話在呼叫JSON.parse()的時候就不會出錯。
JSON.stringify(eval(`(${values.content})`))
為了讓JSON資料的展示更友好,就需要格式化資料,也就是要有空格。
JSON.stringify(JSON.parse(record.content), null, 2)
二、錯誤檢視困難
在測試環境或正式環境,如果定時任務處理的資料錯誤了,那麼只能通過日誌來排查。
而一臺跑著的伺服器中會有很多其他的定時任務,在測試環境中,為了能看清楚日誌,可以只執行一個任務。
但是在正式環境中,是不能停止任務的,像目前執行的定時任務,可能幾秒內就有幾百行的日誌,用肉眼觀察有點累。
好在我們這邊接入了阿里雲的日誌服務,可以檢視日誌控制檯,裡面有豐富的查詢過濾條件,可以準確的定位到某條日誌。
如果你有更好的除錯方法,歡迎留言討論。
三、應急處理
在線上執行的時候,可能會因為這個那個的問題導致任務沒有在指定時間執行。
那麼就得開放一個入口,來手動執行這個任務。
一開始的想法是寫個臨時介面,然後用postman手動訪問,不過這樣的話對運營不太友好,畢竟運營會有人半夜值班盯著活動,但開發人員是不會半夜還盯著伺服器的。
於是又快速搭了個後臺執行頁面,有個下拉框可選擇任務時間段,還有個執行按鈕,到時候出問題的話,就手動執行一次。
&n