踩坑過程
服務器部署了一個flask-apscheduler的定時任務項目,每天的幾個時間點會自動推送消息或者跑任務。但經過一段時間后,發現有幾個任務莫名其妙的沒有運行,其他任務又可以正常運行。排查下來也不是代碼問題,因為其他任務可以跑,就一兩個任務不行,反復排查問題無果。后面在網上找原因,提示說可以在flask-apscheduler項目中增加log來排查,我在項目入口監聽了log,果不其然,發現了一些問題
LOG記錄
2021-01-23 06:00:00 base.py[line:952] WARNING Error getting due jobs from job store 'default': (pymysql.err.OperationalError) (2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))"). [SQL: SELECT apscheduler_jobs.id, apscheduler_jobs.job_state FROM apscheduler_jobs WHERE apscheduler_jobs.next_run_time <= %(next_run_time_1)s ORDER BY apscheduler_jobs.next_run_time] [parameters: {'next_run_time_1': 1611352800.002729}] (Background on this error at: http://sqlalche.me/e/13/e3q8) 2021-01-23 06:00:10 base.py[line:120] WARNING Run time of job "job_cordcloud_sign_in (trigger: cron[month='*', day='*', day_of_week='*', hour='6', minute='0', second='0'], next run at: 2021-01-23 06:00:00 CST)" was missed by 0:00:10.012178
- 以上是截取的部分log記錄
問題分析
從log中可以看到,當執行job名為job_cordcloud_sign_in的任務時,報了一個數據庫錯誤。問題就出在這,我這個任務是需要去查庫,然后再走job邏輯的,查庫的時候報錯了,導致后面的代碼沒有執行。根據這個錯誤,網上查解決方案就簡單了
最終原因
主要是我這個程序里的涉及到數據庫操作的任務之間運行間隔時間超過了8小時,而數據庫默認8小時不從數據庫取數據則斷開連接,所以會拋出這個錯誤
解決方案
-
方案一:
網上說可以優化代碼,增加重連場景,但我沒有采用這種辦法,大家可以去嘗試下
-
方案二:
我采用的是直接修改數據庫的interactive_timeout
配置,默認是28800秒,即8小時
show global variables like '%timeout';
修改方法
修改my.cnf的配置,如下圖
修改后的效果
總結
還是自己對底層的東西了解的不夠透徹,這種問題應該是比較粗淺的,但我因為沒有碰到過此類問題,所以走了很多彎路,在這里也記錄下,以免以后自己再掉到同樣的坑里。碰到同樣問題的朋友也可以做個參考