Celery 原始碼解析七 Worker 之間的互動

2022-02-08 21:04:43 字數 3591 閱讀 3981

序列文章:

前面對於 celery 的分布式處理已經做了一些介紹,例如第五章的遠端控制和第六章的event機制,但是,我認為這些分布式都比較簡單,並沒有體現出多例項之間的協同作用,所以,今天就來點更加複雜的,對於多例項直接的互動更多,這就是 gossip 和 mingle。

在 celery 的介紹中,mingle 主要用在啟動或者重啟的時候,它會和其他的 worker 互動,從而進行同步。同步的資料有:

這裡從注釋中可以很簡單得看出mingle的作用,然後初始化也是比較簡單,關鍵還是line 37start,需要我們關注sync做了什麼,為什麼上來二話不說就sync?其實上來就sync很好理解,畢竟mingle的作用就是進行 sync 嘛,所以我們要關注的是如何實現的:

這裡原來的**有點冗餘,我給忽略掉了,直接上精簡後的**,所以你可以很清晰得看到**的邏輯是這樣的:

mingle 向每乙個 worker 傳送問候:hello

每個 worker 都向 mingle 回覆自己的資訊(clock 和 tasks)

mingle 更新自己的資訊

這些邏輯我們從精簡後的**可以簡單看出來,所以就不細說了,但是有一點需要展開講講,那就是line 47中的inspect.hello,這應該是第五篇的內容,但是,之前只是介紹了一下如何註冊,並沒有對這些命令一一解析,所以這裡用到了,我們就不妨看看裡面的內容。

ok,這裡我們可以看到在line 319、320就返回了兩個東西,分別是:

然後就返回到剛起來的 worker 了,收到這個訊息的 worker 就根據這兩個資訊重新整理自己的狀態,然後繼續執行,mingle也就完成了自己的任務了。

和 mingle 不同,gossip 卻是消費 event 的,本來按道理應該放在第六篇中介紹,但是由於篇幅原因,所以一起放在這裡來說了,不多贅述,我們直接看bootstep

由於gossip的初始化內容太多,所以我也不全都展開了,挑了些重點(還是很多),但是目前我們可以忽略大部分的內容,最先需要關注的是line 24,如果你夠細心的話你會發現這個bootstep和其他不一樣,因為它繼承的是consumerstep,這是會註冊乙個 consumer 的!

然後我們沒啥好看了,所以按照套路還是看看start唄,然而它呼叫的也是父類的start,所以,沒辦法咯,直接跟過去:

諾,是這樣吧,是增加了consumer,這樣的話,我們就必須看看這個 consumer 是什麼了,能夠消費什麼樣的資料:

好,這樣就清晰了,所有關於worker.#的 event 都被這裡消費了,這裡算是看完了。

那現在的問題變成了這些 event 都是從**過來的,我們有必要對源頭進行一下追蹤,但是,怎麼追蹤呢?回想一下第六篇中講 event 的訊息傳遞的那裡,再和這裡一對比,事情就很清楚了。

你以為gossip就這麼結束了麼?嘿嘿,那你就被 celery 給矇騙了,悄悄告訴你,celery 在 gossip 中埋伏了乙個厲害的功能,但是沒有對外宣稱,那就是leader 選舉!,不信?我帶你去看看:

這是選舉的入口,先不解析**,我們先來看看有誰呼叫了它:

ok,可以發現這有個 control 命令用到了它,這裡有注釋,我們可以看到引數分別代表的意思:

那麼這樣我們就清楚了,首先,有乙個 action 需要執行,但是,那麼多的 worker,交給誰執行呢?這就需要進行選舉,那麼選舉的方式是怎麼進行的呢,我先用一張圖來描述一下這個過程:

control 表示需要進行乙個選舉,然後乙個 worker 的 gossip 就傳送了乙個 event:worker-elect,然後所有的 worker 都能接收到:

每個 worker 接收到之後,就對這個選舉進行響應,將自己的選號(clock)送過去,這樣,每個 worker 在傳送選號的同時,也接收到別人的選號,因為收發的路線太多,我就找乙個 worker 來表示收,但是其他 worker 也是有收的,只是我沒有標出來:

當乙個 worker 收到所有 worker 的 ack 之後,那麼它就會對所有的 worker 的選號進行排序,選出其中最大的選號作為本次選舉的leader,如果leader是自己那麼就處理這個 action,如果不是自己,那麼忽略,應該被選中的leader也在執行這個過程,所以不需要別人擔心。

這就是實際執行的示意圖,對應到**就分別是:

第一步中的 control 要求選舉和傳送選舉 event 我們前面已經看過了

worker 收到選舉 event 之後,發出自己的參選宣告:

每個 wroker 對別人回應的參選資訊進行選舉:

ok,整個流程就是這樣的了,那麼問題來了,萬一有乙個 worker 收不到 replies 或者發出的 reply 不小心丟了會怎麼樣?是不是整個選舉過程就進行不下去了?我好像沒有看到 celery 有在這方面做一些努力。

Fabric 原始碼解析 原始碼目錄解析

這裡對重要的一些目錄進行說明 bccsp 與密碼學 加密 簽名 證書等等 相關的加密服務 將fabric中用到的密碼學相關的函式抽象成了一組介面,便於拓展。bddtests 一種新型的軟體開發模式 行為驅動開 需求 開發 common 一些公共庫 錯誤處理 日誌處理 賬本儲存 策略以及各種工具等等 ...

Spring原始碼深度解析(七)獲取Document

經過了驗證模式準備的步驟就可以進行document載入了,xmlbeanfactoryreader類對於文件讀取並沒有親歷親為,而是委託給了documentlaoder去執行,documentloader是個介面,真正呼叫的是defaultdocumentloader,解析 如下 dzaidf 在這...

sel4原始碼解析(七) vspace

sel4 vspace指的是程序的虛擬位址空間。armv8 64位版本的sel4 對應的頁表劃分分為四級,分別是 pgd page global directory pud page upper directory pd page directory 和pt page table pgdpgd結構體...