包含crongolang的詞條

本文目錄一覽:

基於gocron實現的定時任務服務降級方案

    目前APP業務中啟用的定時任務已達到400+,目前管理比較混亂,很多任務運行時佔用服務器資源巨大,其中不乏一些非緊急的任務,平時並不會有太大影響,但是當流量高峰來臨時,這些定時任務可能會成為壓死駱駝的最後一根稻草。為了避免出現這樣的問題,我們通常會在高流量來之前去調整一些定時任務的執行間隔時間或者暫停一些不影響服務的定時任務。這樣做的弊端是工作量很大,同時難免會有遺漏。由此衍生除了對任務分級的訴求。對任務分級後,高峰流量時,可視情況降級相關等級的定時任務。

        PS:設計核心流程的任務等,如支付回調

        PS:任務中設計到事務等

    基於gocron的任務節點做任務分級,不同級別的任務對應不同的gocron節點。如下圖:

    把三級任務放在三級節點上跑,如下圖:

    以此類推,不同級別的任務跑在對應級別的節點上。

    當流量高峰來臨時,我們想通過停掉所有三級任務來實現快速降級,而這個操作僅僅需要關閉對應節點的連接即可。如下圖

PS:這個操作同時會停止所有正在運行的任務

舉個例子:目前我的三級任務節點上運行了一個同步數據的任務(預計5分鐘左右能執行完),當我把三級任務節點關閉時,這個任務會直接失敗,在節點對應的機器上我們可以看到所有進程也被直接kill掉了,即使我的任務是多進程在跑,相應的子進程也會被kill掉。如下:

當前正在服務的三級節點-asgard三級定時任務

當前正在節點-asgard三級定時任務上運行的任務-商品數據整合同步搜索個推庫

節點服務器上正在運行的進程

這時候我們關閉asgard三級定時任務這個節點

可以看到任務直接執行失敗了

同時,節點服務器上的進程也被kill掉了

    由於二級任務可能涉及到事務等操作,非萬分緊急情況下不能直接終止,以免導致臟數據的產生。對於這種任務的降級我們不能直接通過節點的方式停止任務。可以通過關閉任務的方式停止。如下:

PS:關閉任務的操作會等當前的任務執行完成再關閉,不會對當前任務產生任何影響

舉個例子:

還拿asgard三級定時任務這個節點來看,目前這個節點在鏈接狀態

這個節點下跑了一個任務

同樣的,節點服務器上有對應的進程在跑着

這時候,我們關閉這個任務

我們可以看到,關閉這個任務,不會影響正在執行的任務

節點對應的服務器上的任務也正常在跑

PS:這個關閉任務對應的是,完成當前任務後不再執行新的任務。

    1、基於gocron的任務節點對任務做分級處理

    2、一、二、三級任務的劃分

    3、服務降級的兩種方式:關閉節點關閉任務

go中使用cmd與cron

/bin/bash -c “ls -l”

cmd-golang-pipe

pipe()創建2個文件描述符,fd[0]可讀,fd[1]可寫

fork() 創建子進程 fd[1]被繼承到子進程

dup2() 重定向子進程 stdout/stderr到fd[1]

exec() 在當前進程內,加載並執行二進制程序

模擬一下cmd調用

模擬調用cmd時,殺死bash進程

go開源Cronexpr庫

Parse() 解析與校驗Cron表達式

Next() 根據當前時間,計算下一次調度時間

模擬一下cron調用

執行結果

模擬多個cron調用

執行結果

gin結合cron,實現定時任務

cron需要進行初始化,在gin的main中進行,然後後面的定時任務,使用addjob,addjob會返回一個jobid,後面關閉時,可以使用這個id去關閉。

1.main.go中初始化cron

2.InitCron,返回一個Cron類型

3.使用cj進行添加任務,任務會返回一個id,因為調用的時候會使用協程,將id通過channel返回

4.將id回收,已被刪除定時任務時使用。另外實現mqttJob需要實現Run接口,addjob才能運行

5.刪除定時任務,cj為gin初始化的new cron

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/181649.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-23 06:43
下一篇 2024-11-23 06:44

相關推薦

發表回復

登錄後才能評論