任務調度

介紹

在本方案中,使用celery作為任務分發平臺。對于存入celery的大量任務,能達到以下的要求:

  1. 任務邏輯相互獨立
  2. 橫向擴展任務處理能力
  3. 抽象(抽象的意義在于,化繁為簡) 除業務邏輯以外的 處理過程,將后續代碼編寫的關注點主要放在業務邏輯的實現上
  4. 鏈式任務觸發

結構

flow.png

設計方案

任務邏輯封裝

我們將任務邏輯按照約定的格式封裝,并以設置name屬性的方式為任務打上標記,而后通過current_node/default_node確定app 發送的節點。這些準備工作完成后,將任務名稱和任務數據交由celery app進行發送。如此能夠保持發送端的輕量級,使任務更快、更穩定、更無壓力的發送到執行端。

以下是任務的封裝功能偽代碼。


class BaseLogic(object):

    logic_name = None
    nodes = []

    def __init__(self):
        if not self.logic_name or not self.nodes:
            raise attributeError

    def next_node(current_node=None): # 邏輯具有了修改下一個執行節點的能力。

    def send_other(self,  other_logic_name):

    def send_others(self, other_logic_names):

    def set(self,  key,  value):

    def get(self,  key,  default=None):

    def die(self):

    def __repr__(self):  

class SpiderLogic(BaseLogic):

    def crawl(self):

    def publish(self):

    def store(self):

      

發送器封裝

class App():

    def __init__(self, app->celery.app):
        self.app = app

    def send(self, node_name, data=None): # 發送初始任務。發送任務名稱和傳遞的數據(LogicClass.name, data)

任務處理流程簡述

不同節點的worker會收到屬于本節點的任務。worker提供任務的執行流程。

worker是無狀態的,worker的每次運行會傳入此次運行所需的數據,多次任務運行之間相互不會產生影響。對于無狀態的系統,可以避免考慮數據同步等額外的交互問題。同時根據任務數量級和任務執行所需要的資源的不同,可以對worker進行橫向擴展。

基礎task處理邏輯的封裝功能偽代碼:

class ProcessTask(celery.Task):
    """
    worker中實際運行的任務流程封裝
    """
    name = None

    def __init__(self):

    def run(self, data):
        logic_ins = logic_factory(data)
        self._run(logic_ins)
        self.send_next(logic_ins)
        self.send_others(logic_ins)

    def _run(self, logic_ins):
        raise NotImplementedError

    def send_next(self, logic_ins):
        node_name = logic_ins.next_nodes.pop()
        self.send_to_node(node_name)

    def send_others(self, logic_ins):

        for node_name in logic_ins.other_nodes:
            self.send_to_node(node_name)

    def send_to_node(self, node_name):

class CrawlProcessTask(ProcessTask):

    name = 'crawl'

    def _run(self, logic_ins):
        logic_ins.crawl()

收到任務的名稱以后,worker會通過 工廠方法 根據任務名稱實例化對應的類,并且按照worker既定的執行流程,執行對應的業務邏輯。

執行完成后,按照logic class 既定的順序,自動觸發下一個流程。當然如果需要將數據進行鏈式處理,那么在邏輯類中,通過定義other_logics,數據也會發送到對應節點開始新的流程。

總結

任務邏輯相互獨立的意義在于,當一個任務需要調整邏輯時,會自然而然的將修改鎖定在獨立的代碼塊中,也就是最小化此次修改的影響范圍。所以我們將任務相互獨立的抽象成不同的邏輯類。而當任務相互獨立以后,我們需要一個統一的任務運行機制,并且此機制希望對于任務毫無干預,也就是機制不關注運行任務的內容是什么,而是關注運行任務的流程。所以我們對于任務運行設計了一套流程。

在流程中,我們將任務封裝成為一個個的類,在類中定義好業務邏輯以及處理節點的順序。類通過一個統一的入口進入流程處理。同時,通過這個順序,被封裝后的celery app 可以找到首個接收的worker 節點,然后通過celery的分布式任務分發能力,進行任務的分發。

同時在類中設置鏈式處理邏輯,解除單個任務之間的壁壘,將任務鏈條串起來,解決任務之間數據交互的問題。

故此,我們將業務代碼抽離出任務分發流程,任務相互獨立,同時提供數據傳遞的方案,保證任務流程的正常執行。同時通過worker節點的無狀態,以及celery節點的擴容能力,使得當有大量任務產生的時候,能夠對任意任務節點數量進行橫向擴展。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容