celery 分布式任務佇列 原理

2022-07-03 21:39:10 字數 2510 閱讀 5443

在學習celery之前,我先簡單的去了解了一下什麼是生產者消費者模式。

在實際的軟體開發過程中,經常會碰到如下場景:某個模組負責產生資料,這些資料由另乙個模組來負責處理(此處的模組是廣義的,可以是類、函式、執行緒、程序等)。產生資料的模組,就形象地稱為生產者;而處理資料的模組,就稱為消費者。

單單抽象出生產者和消費者,還夠不上是生產者消費者模式。該模式還需要有乙個緩衝區處於生產者和消費者之間,作為乙個中介。生產者把資料放入緩衝區,而消費者從緩衝區取出資料,如下圖所示:

生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過訊息佇列(緩衝區)來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給訊息佇列,消費者不找生產者要資料,而是直接從訊息佇列裡取,訊息佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。這個訊息佇列就是用來給生產者和消費者解耦的。------------->這裡又有乙個問題,什麼叫做解耦?

解耦:假設生產者和消費者分別是兩個類。如果讓生產者直接呼叫消費者的某個方法,那麼生產者對於消費者就會產生依賴(也就是耦合)。將來如果消費者的**發生變化,可能會影響到生產者。而如果兩者都依賴於某個緩衝區,兩者之間不直接依賴,耦合也就相應降低了。生產者直接呼叫消費者的某個方法,還有另乙個弊端。由於函式呼叫是同步的(或者叫阻塞的),在消費者的方法沒有返回之前,生產者只好一直等在那邊。萬一消費者處理資料很慢,生產者就會白白糟蹋大好時光。緩衝區還有另乙個好處。如果製造資料的速度時快時慢,緩衝區的好處就體現出來了。當資料製造快的時候,消費者來不及處理,未處理的資料可以暫時存在緩衝區中。等生產者的製造速度慢下來,消費者再慢慢處理掉。

因為太抽象,看過網上的說明之後,通過我的理解,我舉了個例子:吃包子。

假如你非常喜歡吃包子(吃起來根本停不下來),今天,你媽媽(生產者)在蒸包子,廚房有張桌子(緩衝區),你媽媽將蒸熟的包子盛在盤子(訊息)裡,然後放到桌子上,你正在看巴西奧運會,看到蒸熟的包子放在廚房桌子上的盤子裡,你就把盤子取走,一邊吃包子一邊看奧運。在這個過程中,你和你媽媽使用同乙個桌子放置盤子和取走盤子,這裡桌子就是乙個共享物件。生產者新增食物,消費者取走食物。桌子的好處是,你媽媽不用直接把盤子給你,只是負責把包子裝在盤子裡放到桌子上,如果桌子滿了,就不再放了,等待。而且生產者還有其他事情要做,消費者吃包子比較慢,生產者不能一直等消費者吃完包子把盤子放回去再去生產,因為吃包子的人有很多,如果這期間你好朋友來了,和你一起吃包子,生產者不用關注是哪個消費者去桌子上拿盤子,而消費者只去關注桌子上有沒有放盤子,如果有,就端過來吃盤子中的包子,沒有的話就等待。對應關係如下圖:

考察了一下,原來當初設計這個模式,主要就是用來處理併發問題的,而celery就是乙個用python寫的並行分布式框架。

然後我接著去學習celery

celery的定義

celery(芹菜)是乙個簡單、靈活且可靠的,處理大量訊息的分布式系統,並且提供維護這樣乙個系統的必需工具。

我比較喜歡的一點是:celery支援使用任務佇列的方式在分布的機器、程序、執行緒上執行任務排程。然後我接著去理解什麼是任務佇列。

任務佇列

訊息佇列

訊息佇列的輸入是工作的乙個單元,稱為任務,獨立的職程(worker)程序持續監視佇列中是否有需要處理的新任務。

celery 用訊息通訊,通常使用中間人(broker)在客戶端和職程間斡旋。這個過程從客戶端向佇列新增訊息開始,之後中間人把訊息派送給職程,職程對訊息進行處理。如下圖所示:

celery 系統可包含多個職程和中間人,以此獲得高可用性和橫向擴充套件能力。

celery的架構

celery的架構由三部分組成,訊息中介軟體(message broker),任務執行單元(worker)和任務執行結果儲存(task result store)組成。

訊息中介軟體

celery本身不提供訊息服務,但是可以方便的和第三方提供的訊息中介軟體整合,包括,rabbitmq,redis,mongodb等,這裡我先去了解rabbitmq,redis。

任務執行單元

worker是celery提供的任務執行的單元,worker併發的執行在分布式的系統節點中

任務結果儲存

task result store用來儲存worker執行的任務的結果,celery支援以不同方式儲存任務的結果,包括redis,mongodb,django orm,amqp等,這裡我先不去看它是如何儲存的,就先選用redis來儲存任務執行結果。

分布式任務佇列Celery

celery 芹菜 是基於python開發的分布式任務佇列。它支援使用任務佇列的方式在分布的機器 程序 執行緒上執行任務排程。基本用法是在程式裡引用celery,並將函式方法繫結到task from celery import celery def add x,y return x y from t...

Celery分布式任務佇列

celery是乙個簡單 靈活且可靠的,處理大量訊息的分布式系統 專注於實時處理的非同步任務佇列 同時也支援任務排程 celery的架構由三部分組成,訊息中介軟體 message broker 任務執行單元 worker 和任務執行結果儲存 task result store 組成。訊息中介軟體 ce...

Celery分布式任務佇列

celery是一款非常簡單,靈活,可靠的分布式系統,可用於處理大量訊息,並且提供了一整套操作此系統的一系列工具 celery是一款訊息佇列工具,可用於處理實時資料以及任務排程 什麼是任務佇列?任務佇列一般用於執行緒或計算機之間分配工作的一種機制 任務佇列的輸入是乙個成為任務的工作單元,有專門的職稱 ...