1. 程式人生 > 程式設計 >django 實現celery動態設定週期任務執行時間

django 實現celery動態設定週期任務執行時間

藍鯨paas平臺app開發經驗分享

騰訊藍鯨智雲是一套基於PaaS的技術解決方案,提供了完善的前後臺開發框架、排程引擎、公共元件等模組,幫助業務的產品和技術人員快速構建低成本、免運維的支撐工具和運營系統。

PaaS平臺不僅將應用服務的執行和開發環境作為一種服務提供給開發者使用者,更為開發者使用者提供了高效便捷的開發服務,如:元件系統,統一登入,許可權管理,後臺框架,MagicBox,桌面/工作臺等。

PaaS平臺提供支援多語言的開發框架,助力運維人員能基於平臺之上以自己擅長的技術語言(Python、java等)開發運維自動化工具。

通過了解PaaS的設計理念,運維人員能夠基於藍鯨的PaaS平臺,從零開始進行SaaS應用的實戰開發,快速構建企業運維/運營系統,提升企業自動化水平。

開發背景

之前在一個銀行自動化運維專案中,客戶希望我們在藍鯨PaaS上開發一個數據庫巡檢SaaS。具體需求如下:

為了保障資料庫正常執行,保證資料的安全性、完整性和可用性,需要開發一個自動化巡檢工具,代替原來的人工資料庫巡檢。並且巡檢週期視窗分為日巡檢、周巡檢、月巡檢、半年度巡檢四類:

日巡檢維護指每日按計劃進行的巡檢維護活動,以檢查資料庫執行狀態、資料庫備份狀態和告警錯誤為主要內容。

周巡檢維護指按一週為週期,在每週指定日按計劃進行的巡檢維護活動,它的工作內容是在日巡檢維護工作內容的基礎上新增資料庫物件檢查、安全性檢查等內容組成。

月巡檢維護指按一月為週期,在每月指定日按計劃進行的巡檢維護活動,它的工作內容是在周巡檢維護工作內容的基礎上新增系統引數配置檢查、硬體與系統平臺執行狀態檢查等內容組成。

年度巡檢維護指按半年或者一年為週期,在指定日按計劃進行的巡檢維護活動,它的工作內容是在月巡檢維護工作內容的基礎上新增資料庫效能診斷檢查組成。

巡檢實現方式分為兩種:

1、立即巡檢

使用者首先選擇某一業務下對應的目標主機,需要巡檢的資料庫例項(支援多選),設定資料取樣區間(當前時間之前的任意時間段)。

點選立即巡檢按鈕,等待數秒鐘,巡檢完成。點選檢視詳情,匯出報告。

2、定時巡檢

使用者可以根據需求設定每天、每週、每月來執行巡檢任務。這裡舉例說明一下每週,使用者首先需要配置某業務下面主機、資料庫例項、巡檢頻率、巡檢時長(任意天數)、執行時間(每週某一天的某時某分某秒),如下圖:

實現方式

針對以上需求,平時我們開發時使用periodic_task裝飾器,程式啟動後自動執行週期任務:

@periodic_task(run_every=crontab(minute='*/5',hour='*',day_of_week="*"))
def get_time():
  """
  celery 週期任務示例

  run_every=crontab(minute='*/5',day_of_week="*"):每 5 分鐘執行一次任務
  """
  now = datetime.datetime.now()
  logger.error(u"celery 週期任務呼叫成功,當前時間:{}".format(now))

crontab()例項化的時候沒設定任何引數,都是使用預設值。crontab一共有7個引數,常用有5個引數分別為:

minute:分鐘,範圍0-59

hour:小時,範圍0-23

day_of_week:星期幾,範圍0-6。以星期天為開始,即0為星期天。這個星期幾還可以使用英文縮寫表示,例如“sun”表示星期天

day_of_month:每月第幾號,範圍1-31

month_of_year:月份,範圍1-12

以上方案有個弊端:

需要每次根據巡檢是周幾,來計算資料取樣區間具體時間,然後觸發定時任務,可能會存在誤差。

定時任務無法直接取消

舉例來說,假如客戶選擇每週三早上8點執行任務,取樣區間為3天。假如首次10月1日8:00執行任務,觸發定時任務獲取9月28日8:00-10月1日8:00之間的資料;然後再次執行時間為10月8日,再次觸發定時任務,迴圈執行。

最終,通過以下方式解決:

模板函式提前開發完成,加上@task()裝飾器:

@task()
def auto_iip(**kwargs):
   logger.error(kwargs)
   '此處寫邏輯程式碼'

測試每分鐘執行一次,啟動工程,啟動celery,呼叫下面函式,OK,等待1分鐘,sucess!

from djcelery.models import PeriodicTask,CrontabSchedule
from djcelery.schedulers import ModelEntry,DatabaseScheduler
def test_celery_task(date_data):
  crontab= CrontabSchedule.objects.create(
    hour='*',minute='*/1',day_of_week='*',day_of_month='*',month_of_year="*"
  )
  schedule = crontab.schedule

  create_or_update_task = DatabaseScheduler.create_or_update_task
  #'home_application.celery_tasks.auto_iip' home模組下的task。
  task_template='home_application.celery_tasks.auto_iip'
  #task_name自定義,不能重複。
  task_name = 'test'
  schedule_dict = {
    'schedule': schedule,'args': [],'kwargs': data,'task': task_template,'enabled': 1
  }
  create_or_update_task(task_name,**schedule_dict)

定時任務停止,直接根據task_name進行刪除

def delete_celery_task(task_name):
  DatabaseScheduler.delete_task(task_name)

ok!大功告成。

以上這篇django 實現celery動態設定週期任務執行時間就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。