天天看點

在阿裡雲容器服務中使用定時任務

定時任務是常見需求。普遍的做法是,選擇一台或幾台機器,通過crontab實作定時任務。但是對于大規模或大量的定時任務,這種做法的缺點非常多,比如:

可靠性低,一台機器當機,該機器上的定時任務就無法執行了

沒有排程功能,機器之間的負載可能不均衡

沒有重試機制,任務可能運作失敗

無法運作大規模分布式任務

隻有10月25号之後更新了agent版本或新建立的叢集才能使用該功能。

跟離線任務一樣,定時任務也是基于docker compose的,隻需要在應用模闆裡添加<code>aliyun.schedule</code>标簽,如下面例子所示。

其中<code>aliyun.schedule: "0-59/30 * * * * *"</code>表示每30秒執行一次該任務;schedule的格式跟crontab完全相同(但要注意格式是<code>秒 分 時 天 月 星期</code>,比linux上的crontab多了秒這一項),使用的時間為中原標準時間。

因為定時任務隻能是離線任務,隻要添加了<code>aliyun.schedule</code>标簽,會自動添加<code>aliyun.project_type: "batch"</code>标簽,是以上述例子中<code>aliyun.project_type: "batch"</code>也可以省略。

另外,離線任務中所有的功能,在定時任務中依然可用。比如<code>scale</code>、<code>retry_count</code>、<code>remove_containers</code>等,具體含義請參考離線任務的文檔。

定時任務被建立後,應用處于“等待”狀态。當任務指定的時間到達時,任務會被啟動運作,其後的狀态變化跟離線應用相同;下一個執行時間到達時,應用狀态會重複這一過程。

同一個定時任務同一時刻隻會有一個執行個體在執行,如果任務的執行時間大于其執行周期(比如上述任務的執行時間大于30秒),則下一次執行會進入執行隊列;如果執行隊列長度大于3,則會丢棄該次執行。

可以在應用詳情中檢視運作曆史及結果,如下圖所示;隻保留最後10次的運作曆史。

在阿裡雲容器服務中使用定時任務

定時任務控制器采用主-從備模式。主要制器故障時,控制功能将切換至備用控制器。

如果任務的執行時刻正好在主從切換期間,則會延遲至切換完成後執行;如果主從切換期間同一個任務有多次執行,切換完成後隻會執行一次。

一般情況下,主從切換時間是秒級,但是為了保證不丢失,請不要設定重複周期小于1分鐘的定時任務。

繼續閱讀