Celery分佈式任務隊列(1)--celery介紹+集羣部署+參數瞭解

簡介

  • 什麼是任務隊列?
    任務隊列用作在線程或計算機之間分配工作的機制。
    任務隊列的輸入是稱爲任務的工作單元。專用的工作進程會不斷監視任務隊列以執行新工作。
    Celery通過消息進行通信,通常使用代理在clients和worker之間進行調解。爲了啓動任務,客戶端將消息添加到隊列中,然後代理將消息傳遞給工作人員。
    celery系統可以由多個 workers 和 brokers組成,讓位於高可用性和水平擴展。
    Celery用Python編寫,但是該協議可以用任何語言實現。除了Python,還有Node.js 的node-celery和node-celery-ts,以及一個PHP客戶端。
    語言互操作性也可以通過公開HTTP終結點並具有請求該終結點的任務來實現(Webhooks)。

Celery由以下三部分構成:消息中間件(Broker)、任務執行單元Worker、結果存儲(Backend),如下圖
在這裏插入圖片描述

celery集羣的運作流程:
在這裏插入圖片描述
從上圖可見,相關的celery的編程模型中,劃分爲三個部分,分別是:

1,Producer(celery client): 負責生產相關的task,併發送到一個broker中。

2,broker: 作爲一個task的路由器,將task分發到不同的接收者。這裏broker實現對rabbitmq的封裝,屏蔽了rabbitmq複雜的調用細節。

3,Consumer(celery worker):接收到task以後,負責根據task的信息結構,執行相關的功能。

簡單說,可以有多個"消息隊列"(message Queue),不同的消息可以指定發送給不同的Message Queue,而這是通過Exchange來實現的,發送消息到"消息隊列"中時,可以指定routiing_key,Exchange通過routing_key來把消息路由(routes)到不同的"消息隊列"中去。Exchange 對應一個消息隊列(queue),即:通過"消息路由"的機制使Exchange對應queue,每個queue對應每個worker。

注:任務隊列與消息隊列都是由隊列實現的異步協議,只是消息隊列(Message Queue) 用來做異步通信,而任務隊列(Task Queue) 更強調異步執行的任務。實際上發送消息也是一個任務,也就是說任務隊列是在消息隊列之上的管理工作,任務隊列的很多典型應用就是發送消息,如發送郵件,發送短信,發送消息推送等。

== celery 和 redis 之間交互的基本原理==

1、當發起一個 task 時,會向 redis 的 celery key 中插入一條記錄。
2、如果這時有正在待命的空閒 worker,這個 task 會立即被 worker 領取。
3、如果這時沒有空閒的 worker,這個 task 的記錄會保留在 celery key 中。
4、這時會將這個 task 的記錄從 key celery 中移除,並添加相關信息到 unacked 和 unacked_index 中。
5、worker 根據 task 設定的期望執行時間執行任務,如果接到的不是延時任務或者已經超過了期望時間,則立刻執行。
6、worker 開始執行任務時,通知 redis。(如果設置了 CELERY_ACKS_LATE = True 那麼會在任務執行結束時再通知)
7、redis 接到通知後,將 unacked 和 unacked_index 中相關記錄移除。
8、如果在接到通知前,worker 中斷了,這時 redis 中的 unacked 和 unacked_index 記錄會重新回到 celery key 中。(這個回寫的操作是由 worker 在 “臨死” 前自己完成的,所以在關閉 worker 時爲防止任務丟失,請務必使用正確的方法停止它,如: celery multi stop w1 -A proj1)
9、在 celery key 中的 task 可以再次重複上述 2 以下的流程。
10、celery 只是利用 redis 的 list 類型,當作個簡單的 Queue,並沒有使用消息訂閱等功能

celery主要功能:
在這裏插入圖片描述

1、celery集羣部署

1.1、server節點

1.1.1、安裝celery

如果使用 Redis 作爲中間人(Broker)必須要安裝 Celery 的依賴庫,您可以通過 celery[redis] 進行安裝:

pip3 install -U "celery[redis]"

備註使用該命令會把下面功能全部安裝:Successfully installed amqp-2.5.2 billiard-3.6.3.0 celery-4.4.2 importlib-metadata-1.6.0 kombu-4.6.8 pytz-2020.1 redis-3.5.1 vine-1.3.0 zipp-3.1.0

其他種方式

pip3 install celery

在這裏插入圖片描述

配置瞭解:鏈接.

1.1.2、選擇中間人(Broker)

決定使用哪個作爲Broker? 這裏使用redis

Celery 支持多種消息傳輸的方式。
在這裏插入圖片描述

Celery 需要一箇中間件來進行接收和發送消息,通常以獨立的服務形式出現,成爲 消息中間人(Broker)

以下有幾種選擇:

  • RabbitMQ
    RabbitMQ 的功能比較齊全、穩定、便於安裝。在生產環境來說是首選的,有關 Celery 中使用 RabbitMQ 的詳細信息:

  • Redis
    Redis 功能比較全,但是如果突然停止運行或斷電會造成數據丟失

1.1.2.1、如果選擇使用redis,請安裝配置

安裝redis-server

sudo apt-get install redis-server

配置redis允許遠程連接

  • 配置redis.conf
    1、將 bind 127.0.0.1 使用#註釋掉
    2、將 protected-mode yes 改爲 protected-mode no(3.2之後加入的新特性,目的是禁止公網訪問redis cache,增強redis的安全性)
    3、將 requirepass foobared 註釋去掉,foobared爲密碼,也可修改爲別的值(可選,建議設置)
  • 設置iptables規則,允許外部訪問6379端口
    iptables -I INPUT 1 -p tcp -m state --state NEW -m tcp --dport 6379 -j ACCEPT

解決問題:連接Redis服務出現DENIED Redis is running in protected mode because protected mode is enabled

protected-mode yes 改爲no

或者啓動redis時使用這個命令

src/redis-server --protected-mode no

擴展:
在 Docker 中運行 Redis ,可以通過以下命令實現(不用這種方式的可以不關注):

$ docker run -d -p 6379:6379 redis

1.1.2.2、如果選擇使用RabbitMQ,請安裝配置

使用RabbitMQ
如果您使用的是 Ubuntu 或 Debian ,可以通過以下命令進行安裝 RabbitMQ:

$ sudo apt-get install rabbitmq-server

pip install "celery[librabbitmq,redis,auth,msgpack]"

如果在 Docker 中運行 RabbitMQ ,可以使用以下命令:

$ docker run -d -p 5462:5462 rabbitmq

命令執行完畢之後,中間人(Broker)會在後臺繼續運行,準備輸出一條 Starting rabbitmq-server: SUCCESS 的消息。

如果您沒有 Ubuntu 或 Debian ,你可以訪問官方網站查看其他操作系統(如:Windows)的安裝方式:

http://www.rabbitmq.com/download.html

1.1.3、拷貝項目代碼到機子上

1.1.4、啓動worker

執行下面的命令啓動worker,執行任務(下面的兩個命令都可以用)

celery是以app來管理任務的

//tasks:是要管理的app名 ,即項目名
celery -A tasks worker --loglevel=info  
//celery_task:是要管理的app名 
celery worker -A celery_task -l info

各個參數含義:

worker: 代表第啓動的角色是work當然還有beat等其他角色;

-A :項目路徑,這裏我的目錄是project

-l:啓動的日誌級別,更多參數使用celery --help查看

在這裏插入圖片描述


1.2、worker節點

1.2.1、安裝celery

pip3 install celery

1.2.2、拷貝項目代碼到機子上

1.2.3、啓動worker

 celery worker -A celery_task -l info

在這裏插入圖片描述

2、celery參數

celery.bin.worker
用於啓動芹菜工作實例的程序。

芹菜工人命令(以前稱爲celeryd)

-c, --concurrency
處理隊列的子進程的數目。默認值是系統上可用的cpu數量。

-P, --pool
池實現:

prefork(默認)、eventlet、gevent、threads或solo。

-n, --hostname
設置自定義主機名(例如,' w1@%%h ')。擴展:%%h(主機名)、%%n(名稱)和%%d(域)。

-B, --beat
還可以運行芹菜打週期任務調度程序。請注意,此服務只能有一個實例。

請注意
-B用於開發目的。對於生產環境,您需要分別啓動芹菜打。

-Q, --queues
爲這個worker啓用的隊列列表,以逗號分隔。默認情況下,所有配置的隊列都是啓用的。例如:q視頻,形象

- x, exclude-queues
要爲此工作程序禁用的隊列列表,用逗號分隔。默認情況下,所有配置的隊列都是啓用的。例子:- x視頻,形象。

-I, --include
用逗號分隔要導入的其他模塊列表。例子:我foo.tasks bar.tasks

-s, --schedule
如果使用-B選項運行,則指向調度數據庫的路徑。默認爲celerybeat-schedule。擴展”。可以將db "附加到文件名中。

- o
應用優化概要文件。支持:默認情況下,公平

--prefetch-multiplier
爲這個工作者實例設置自定義預取乘數值。

--scheduler
要使用的調度程序類。默認是celery.beat.PersistentScheduler

-S, --statedb
到狀態數據庫的路徑。擴展”。可以將db '附加到文件名中。默認值:{默認}

-E, --task-events
發送可以被監視器捕獲的與任務相關的事件,如芹菜事件、celerymon和其他事件。

--without-gossip
不要訂閱其他員工活動。

--without-mingle
在剛開始的時候不要和其他員工同步。

--without-heartbeat
不要發送事件心跳。

--heartbeat-interval
發送工作者心跳的間隔(秒)

--purge
在啓動守護進程之前清除所有等待的任務。警告:這是不可恢復的,任務將從消息傳遞服務器中刪除。

--time-limit
爲任務啓用硬時間限制(以秒爲單位的int/float)。

--soft-time-limit
爲任務啓用軟時間限制(以秒爲單位int/float)。

--max-tasks-per-child
池工作程序在終止並被新工作程序替換之前可以執行的最大任務數。

--max-memory-per-child
在KiB中,子進程在被新進程替換之前可能消耗的最大駐留內存量。如果單個任務導致子進程超過此限制,則該任務將被完成,然後子進程將被替換。默認值:沒有限制。

--autoscale
通過提供max_concurrency、min_concurrency啓用自動調焦。例子:

--autoscale=10,3
(始終保持3個進程,但如果需要,可以增加到10個)

--detach
啓動worker作爲後臺進程。

-f, --logfile
日誌文件的路徑。如果沒有指定日誌文件,則使用stderr。

-l, --loglevel
日誌級別,在調試、信息、警告、錯誤、關鍵或致命之間進行選擇。

--pidfile
可選文件,用於存儲進程pid。

如果這個文件已經存在並且pid仍然是活動的,程序將不會啓動。

--uid
用戶id,或用戶的用戶名,以在分離後運行。

--gid
組id,或主組的組名,在分離後更改爲。

--umask
分離後工藝的有效umask(1)(八進制)。默認情況下繼承父進程的umask(1)。

--workdir
可選目錄切換到分離後。

--executable
可執行文件,用於分離的進程。

參考官方文檔:
1、Celery 4.4.2文檔

2、celery中文手冊

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章