django 實現(xiàn)celery動態(tài)設(shè)置周期任務(wù)執(zhí)行時間
藍鯨paas平臺app開發(fā)經(jīng)驗分享
騰訊藍鯨智云是一套基于PaaS的技術(shù)解決方案,提供了完善的前后臺開發(fā)框架、調(diào)度引擎、公共組件等模塊,幫助業(yè)務(wù)的產(chǎn)品和技術(shù)人員快速構(gòu)建低成本、免運維的支撐工具和運營系統(tǒng)。
PaaS平臺不僅將應(yīng)用服務(wù)的運行和開發(fā)環(huán)境作為一種服務(wù)提供給開發(fā)者用戶,更為開發(fā)者用戶提供了高效便捷的開發(fā)服務(wù),如:組件系統(tǒng),統(tǒng)一登錄,權(quán)限管理,后臺框架,MagicBox,桌面/工作臺等。

PaaS平臺提供支持多語言的開發(fā)框架,助力運維人員能基于平臺之上以自己擅長的技術(shù)語言(Python、java等)開發(fā)運維自動化工具。
通過了解PaaS的設(shè)計理念,運維人員能夠基于藍鯨的PaaS平臺,從零開始進行SaaS應(yīng)用的實戰(zhàn)開發(fā),快速構(gòu)建企業(yè)運維/運營系統(tǒng),提升企業(yè)自動化水平。
開發(fā)背景
之前在一個銀行自動化運維項目中,客戶希望我們在藍鯨PaaS上開發(fā)一個數(shù)據(jù)庫巡檢SaaS。具體需求如下:
為了保障數(shù)據(jù)庫正常運行,保證數(shù)據(jù)的安全性、完整性和可用性,需要開發(fā)一個自動化巡檢工具,代替原來的人工數(shù)據(jù)庫巡檢。并且巡檢周期窗口分為日巡檢、周巡檢、月巡檢、半年度巡檢四類:
日巡檢維護指每日按計劃進行的巡檢維護活動,以檢查數(shù)據(jù)庫運行狀態(tài)、數(shù)據(jù)庫備份狀態(tài)和告警錯誤為主要內(nèi)容。
周巡檢維護指按一周為周期,在每周指定日按計劃進行的巡檢維護活動,它的工作內(nèi)容是在日巡檢維護工作內(nèi)容的基礎(chǔ)上添加數(shù)據(jù)庫對象檢查、安全性檢查等內(nèi)容組成。
月巡檢維護指按一月為周期,在每月指定日按計劃進行的巡檢維護活動,它的工作內(nèi)容是在周巡檢維護工作內(nèi)容的基礎(chǔ)上添加系統(tǒng)參數(shù)配置檢查、硬件與系統(tǒng)平臺運行狀態(tài)檢查等內(nèi)容組成。
年度巡檢維護指按半年或者一年為周期,在指定日按計劃進行的巡檢維護活動,它的工作內(nèi)容是在月巡檢維護工作內(nèi)容的基礎(chǔ)上添加數(shù)據(jù)庫性能診斷檢查組成。
巡檢實現(xiàn)方式分為兩種:
1、立即巡檢
用戶首先選擇某一業(yè)務(wù)下對應(yīng)的目標主機,需要巡檢的數(shù)據(jù)庫實例(支持多選),設(shè)置數(shù)據(jù)采樣區(qū)間(當(dāng)前時間之前的任意時間段)。

點擊立即巡檢按鈕,等待數(shù)秒鐘,巡檢完成。點擊查看詳情,導(dǎo)出報告。

2、定時巡檢
用戶可以根據(jù)需求設(shè)置每天、每周、每月來執(zhí)行巡檢任務(wù)。這里舉例說明一下每周,用戶首先需要配置某業(yè)務(wù)下面主機、數(shù)據(jù)庫實例、巡檢頻率、巡檢時長(任意天數(shù))、執(zhí)行時間(每周某一天的某時某分某秒),如下圖:

實現(xiàn)方式
針對以上需求,平時我們開發(fā)時使用periodic_task裝飾器,程序啟動后自動執(zhí)行周期任務(wù):
@periodic_task(run_every=crontab(minute='*/5', hour='*', day_of_week="*"))
def get_time():
"""
celery 周期任務(wù)示例
run_every=crontab(minute='*/5', hour='*', day_of_week="*"):每 5 分鐘執(zhí)行一次任務(wù)
"""
now = datetime.datetime.now()
logger.error(u"celery 周期任務(wù)調(diào)用成功,當(dāng)前時間:{}".format(now))
crontab()實例化的時候沒設(shè)置任何參數(shù),都是使用默認值。crontab一共有7個參數(shù),常用有5個參數(shù)分別為:
minute:分鐘,范圍0-59
hour:小時,范圍0-23
day_of_week:星期幾,范圍0-6。以星期天為開始,即0為星期天。這個星期幾還可以使用英文縮寫表示,例如“sun”表示星期天
day_of_month:每月第幾號,范圍1-31
month_of_year:月份,范圍1-12
以上方案有個弊端:
需要每次根據(jù)巡檢是周幾,來計算數(shù)據(jù)采樣區(qū)間具體時間,然后觸發(fā)定時任務(wù),可能會存在誤差。
定時任務(wù)無法直接取消
舉例來說,假如客戶選擇每周三早上8點執(zhí)行任務(wù),采樣區(qū)間為3天。假如首次10月1日8:00執(zhí)行任務(wù),觸發(fā)定時任務(wù)獲取9月28日8:00-10月1日8:00之間的數(shù)據(jù);然后再次執(zhí)行時間為10月8日,再次觸發(fā)定時任務(wù),循環(huán)執(zhí)行。
最終,通過以下方式解決:
模板函數(shù)提前開發(fā)完成,加上@task()裝飾器:
@task() def auto_iip(**kwargs): logger.error(kwargs) '此處寫邏輯代碼'
測試每分鐘執(zhí)行一次,啟動工程,啟動celery,調(diào)用下面函數(shù),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自定義,不能重復(fù)。
task_name = 'test'
schedule_dict = {
'schedule': schedule,
'args': [],
'kwargs': data,
'task': task_template,
'enabled': 1
}
create_or_update_task(task_name, **schedule_dict)
定時任務(wù)停止,直接根據(jù)task_name進行刪除
def delete_celery_task(task_name): DatabaseScheduler.delete_task(task_name)
ok!大功告成。
以上這篇django 實現(xiàn)celery動態(tài)設(shè)置周期任務(wù)執(zhí)行時間就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Django+Celery實現(xiàn)動態(tài)配置定時任務(wù)的方法示例
- 如何使用Celery和Docker處理Django中的定期任務(wù)
- Django實現(xiàn)celery定時任務(wù)過程解析
- 使用celery和Django處理異步任務(wù)的流程分析
- Django集成celery發(fā)送異步郵件實例
- django之使用celery-把耗時程序放到celery里面執(zhí)行的方法
- Django中celery執(zhí)行任務(wù)結(jié)果的保存方法
- 使用celery執(zhí)行Django串行異步任務(wù)的方法步驟
- Django-celery-beat動態(tài)添加周期性任務(wù)實現(xiàn)過程解析
相關(guān)文章
python jieba分詞并統(tǒng)計詞頻后輸出結(jié)果到Excel和txt文檔方法
本篇文章主要介紹了python jieba分詞并統(tǒng)計詞頻后輸出結(jié)果到Excel和txt文檔方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02
關(guān)于Python?Selenium自動化導(dǎo)出新版WOS(web?of?science)檢索結(jié)果的問題
這篇文章主要介紹了Python?Selenium自動化導(dǎo)出新版WOS(web?of?science)檢索結(jié)果,本代碼屬于半自動化導(dǎo)出,考慮到開發(fā)效率等因素,有兩處在首次導(dǎo)出時需要手動操作,具體實現(xiàn)過程跟隨小編一起看看吧2022-01-01
關(guān)于numpy.where()函數(shù) 返回值的解釋
今天小編就為大家分享一篇關(guān)于numpy.where()函數(shù) 返回值的解釋,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

