1. 程式人生 > >並行分散式框架 Celery 的分享理解

並行分散式框架 Celery 的分享理解

Celery 官網:http://www.celeryproject.org/

Celery 官方文件英文版:http://docs.celeryproject.org/en/latest/index.html

Celery 官方文件中文版:http://docs.jinkan.org/docs/celery/

celery配置:http://docs.jinkan.org/docs/celery/configuration.html#configuration

參考:http://www.cnblogs.com/landpack/p/5564768.html http://blog.csdn.net/happyAnger6/article/details/51408266

http://www.cnblogs.com/forward-wang/p/5970806.html

分散式佇列神器 Celery:https://segmentfault.com/a/1190000008022050

celery最佳實踐:https://my.oschina.net/siddontang/blog/284107

Celery 分散式任務佇列快速入門:http://www.cnblogs.com/alex3714/p/6351797.html

非同步任務神器 Celery 快速入門教程:https://blog.csdn.net/chenqiuge1984/article/details/80127446

定時任務管理之python篇celery使用:

http://student-lp.iteye.com/blog/2093397

非同步任務神器 Celery:http://python.jobbole.com/87086/

celery任務排程框架實踐:https://blog.csdn.net/qq_28921653/article/details/79555212

Celery-4.1 使用者指南: Monitoring and Management Guide:https://blog.csdn.net/libing_thinking/article/details/78592801

Celery安裝及使用:https://blog.csdn.net/u012325060/article/details/79292243

Celery學習筆記(一):https://blog.csdn.net/sdulsj/article/details/73741350

Celery 簡介

除了redis,還可以使用另外一個神器—Celery。Celery是一個非同步任務的排程工具。

Celery 是 Distributed Task Queue,分散式任務佇列,分散式決定了可以有多個 worker 的存在,隊列表示其是非同步操作,即存在一個產生任務提出需求的工頭,和一群等著被分配工作的碼農。

在 Python 中定義 Celery 的時候,我們要引入 Broker,中文翻譯過來就是“中間人”的意思,在這裡 Broker 起到一箇中間人的角色。在工頭提出任務的時候,把所有的任務放到 Broker 裡面,在 Broker 的另外一頭,一群碼農等著取出一個個任務準備著手做。

這種模式註定了整個系統會是個開環系統,工頭對於碼農們把任務做的怎樣是不知情的。所以我們要引入 Backend 來儲存每次任務的結果。這個 Backend 有點像我們的 Broker,也是儲存任務的資訊用的,只不過這裡存的是那些任務的返回結果。我們可以選擇只讓錯誤執行的任務返回結果到 Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。

Celery(芹菜)是一個非同步任務佇列/基於分散式訊息傳遞的作業佇列。它側重於實時操作,但對排程支援也很好。Celery用於生產系統每天處理數以百萬計的任務。Celery是用Python編寫的,但該協議可以在任何語言實現。它也可以與其他語言通過webhooks實現。Celery建議的訊息佇列是RabbitMQ,但提供有限支援Redis, Beanstalk, MongoDB, CouchDB, 和資料庫(使用SQLAlchemy的或Django的 ORM) 。Celery是易於整合Django, Pylons and Flask,使用 django-celery, celery-pylons and Flask-Celery 附加包即可。

Celery 介紹

在Celery中幾個基本的概念,需要先了解下,不然不知道為什麼要安裝下面的東西。概念:Broker、Backend。

  1. 什麼是broker?

broker是一個訊息傳輸的中介軟體,可以理解為一個郵箱。每當應用程式呼叫celery的非同步任務的時候,會向broker傳遞訊息,而後celery的worker將會取到訊息,進行對於的程式執行。好吧,這個郵箱可以看成是一個訊息佇列。其中Broker的中文意思是 經紀人 ,其實就是一開始說的 訊息佇列 ,用來發送和接受訊息。這個Broker有幾個方案可供選擇:RabbitMQ (訊息佇列),Redis(快取資料庫),資料庫(不推薦),等等

  1. 什麼是backend?

通常程式傳送的訊息,發完就完了,可能都不知道對方時候接受了。為此,celery實現了一個backend,用於儲存這些訊息以及celery執行的一些訊息和結果。Backend是在Celery的配置中的一個配置項 CELERY_RESULT_BACKEND ,作用是儲存結果和狀態,如果你需要跟蹤任務的狀態,那麼需要設定這一項,可以是Database backend,也可以是Cache backend,具體可以參考這裡: CELERY_RESULT_BACKEND 。

對於 brokers,官方推薦是 rabbitmq 和 redis,至於 backend,就是資料庫。為了簡單可以都使用 redis。

我自己演示使用RabbitMQ作為Broker,用MySQL作為backend。

來一張圖,這是在網上最多的一張Celery的圖了,確實描述的非常好
在這裡插入圖片描述

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

  1. 訊息中介軟體

Celery本身不提供訊息服務,但是可以方便的和第三方提供的訊息中介軟體整合。包括,RabbitMQ, Redis, MongoDB (experimental), Amazon SQS (experimental),CouchDB (experimental), SQLAlchemy (experimental),Django ORM (experimental), IronMQ

  1. 任務執行單元

Worker是Celery提供的任務執行的單元,worker併發的執行在分散式的系統節點中。

  1. 任務結果儲存

Task result store用來儲存Worker執行的任務的結果,Celery支援以不同方式儲存任務的結果,包括AMQP, redis,memcached, mongodb,SQLAlchemy, Django ORM,Apache Cassandra, IronCache 等。

這裡我先不去看它是如何儲存的,就先選用redis來儲存任務執行結果。