Celery简介及Docker测试环境搭建
Celery 簡介
任務隊列一般用于線程或計算機之間分配工作的一種機制。
任務隊列的輸入是一個稱為任務的工作單元,有專門的工作進行不斷的監視任務隊列,進行執行新的任務工作。
Celery 通過消息機制進行通信,通常使用中間人(Broker)作為客戶端和職程(Worker)調節。啟動一個任務,客戶端向消息隊列發送一條消息,然后中間人(Broker)將消息傳遞給一個職程(Worker),最后由職程(Worker)進行執行中間人(Broker)分配的任務。
Celery 可以有多個職程(Worker)和中間人(Broker),用來提高Celery的高可用性以及橫向擴展能力。
Celery 測試環境搭建
重要:為了使用更加簡單,我們所有命令行操作都是在宿主機上進行的!
Celery 的運行,至少需要一個 broker,一般選用 rabbitmq or redis,一個運行 Celery 的服務。那么安裝起來比較麻煩,網絡配置也比較麻煩,這里我們直接推薦用 Docker 來進行測試環境的搭建。
為什么用 Docker ? 假設我們直接安裝,來看看我們要做什么。
安裝 Docker
安裝比較簡單,我們直接推薦按照官方安裝即可:
Linux 安裝
Windows 安裝
Mac 安裝
Celery 容器構建
因為 docker hub 上面的 celery 鏡像比較老了,我們就從零安裝一個鏡像即可。
步驟如下:
-
拉取 python 鏡像作為基礎鏡像。因為目前 celery 還不支持 PY38,所以我們拉取 PY37 即可。
docker pull python:3.7-slim
-
利用拉取的 python 鏡像,生成 python 容器。運行以下命令:
$ docker run --name celery -v /tmp/celery_data:/tmp/celery_data -dit python:3.7-slim bash # 掛載目錄并在后臺創建運行 python 容器 $ docker exec celery bash -c "pip install celery redis -i https://pypi.tuna.tsinghua.edu.cn/simple # 在容器內安裝第三方庫 Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting celery Downloading https://pypi.tuna.tsinghua.edu.cn/packages/7e/54/4d87a8f589259456efb09f574d538fcf3fd7339a3daaae8e02320c1780f1/celery-4.4.2-py2.py3-none-any.whl (422 kB) Collecting redis Downloading https://pypi.tuna.tsinghua.edu.cn/packages/29/90/8c3f7cd9c23cc259dd01979f03971e70fe2ddad79b93a70026716be20ded/redis-3.5.1-py2.py3-none-any.whl (71 kB) .... $ docker ps # 查看運行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 655908bd8ae1 python:3.7-slim "python3" 12 minutes ago Up 12 minutes celery
可以看到,短短幾行命令,我們的 celery 容器創建完成,相關依賴庫也已經安裝成功。第一步,大功告成。
但是,我們還缺少一個 broker。同樣,我們用 docker 創建一個。
Broker 容器創建(rabbitmq)
這個創建就更簡單了!直接參照命令行即可。
$ docker pull rabbitmq $ docker run -d --name rq -p 5462:5462 rabbitmq # 取名為 rq (沒錯,就是太懶了,這名字有什么用? 不急!后面還有用!Backend 容器創建(redis)
依葫蘆畫瓢
$ docker pull redis $ docker run -d --name rd -p 6379:6379 redis # 取名為 rd (沒錯,就是太懶了,這名字有什么用? 不急!后面還有用!我們的依賴就安裝好了,看看目前的狀態:
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 655908bd8ae1 python:3.7-slim "bash" 2 minutes ago Up 2 minutes celery 047191725a73 redis "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 0.0.0.0:6379->6379/tcp rd a8766c15631f rabbitmq "docker-entrypoint.s…" 1 minutes ago Up 1 minutes 4369/tcp, 5671-5672/tcp, 25672/tcp, 0.0.0.0:5462->5462/tcp rq編寫 celery 應用
Ok,我們需要的三個基礎容器已經創建完成。我們來測試一下 celery,先編寫一個腳本:
$ vim /tmp/celery_data/tasks.py from celery import Celery app = Celery('tasks', backend='redis://localhost', broker='pyamqp://localhost')@app.task def add(x, y):return x + y咦,不對啊,這網絡地址怎么填?我看看,不對,用的 docker ,網絡填起來比較麻煩,各個 container 容器 ip 還不一樣。臥槽,這不是麻煩死了嗎?
等等,是不是一般人都會這么想。
害,別急。container 網絡是隔離的~更加安全,隔離性更高。當然,我們可以通過:
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' celery 172.17.0.7來查看各個容器的端口,然后再回填到我們的 tasks.py 中。但是呢,這樣還是比較麻煩,因為 ip 不能固定,最好的方式是什么呢,當然用 hosts 映射一個與域名類似的東西,保證名字相同就行。
什么東西能幫我們完成這個任務呢?當然就是我們的 docker network。
我們現在要做什么:
創建一個小型局域網,每個臺主機可以通過主機名直接連接。
docker network 的使用
使用比較簡單,命令如下:
創建 docker network
$ docker network create msg_middleware # 創建一個局域網 3576e1af1f60834e9c2871c39a94fcfe86bf63963057adca130fdc6fdf5b7302 $ docker network ls # 查看創建局域網 NETWORK ID NAME DRIVER SCOPE 00398aeb039a bridge bridge local 988e494caf26 host host local 064055db55a9 msg_middleware bridge local將 container 拉入網絡中
$ docker network connect msg_middleware celery $ docker network connect msg_middleware rd # 在 msg_middleware 的網絡下,相當于直接可以 ping rd $ docker network connect msg_middleware rq再更改 tasks.py 的配置
$ vim /tmp/celery_data/tasks.py from celery import Celery app = Celery('tasks', backend='redis://rd', broker='pyamqp://rq') # 注意這行!!!!@app.task def add(x, y):return x + y可以看到我們的鏈接就很簡單了,不再依賴于 ip 這樣非常方便。
Celery 簡單使用
到目前為止,我們所需要的 celery, broker, backend 都搞定了。毫無疑問,這樣肯定比你從零安裝快多了!
讓我們趕緊測測我們的 celery 吧!
測試 Celery
重要:為了使用更加簡單,我們所有命令行操作都是在宿主機上進行的!
首先,我們打開一個 shell 運行我們的 celery 腳本。
$ docker exec -w /tmp/celery_data/ -it celery bash -c "celery -A tasks worker --loglevel=info" /usr/local/lib/python3.7/site-packages/celery/platforms.py:801: RuntimeWarning: You're running the worker with superuser privileges: this is absolutely not recommended!Please specify a different user using the --uid option.User information: uid=0 euid=0 gid=0 egid=0uid=uid, euid=euid, gid=gid, egid=egid,-------------- celery@bffcf1356c76 v4.4.2 (cliffs) --- ***** ----- -- ******* ---- Linux-4.15.0-52-generic-x86_64-with-debian-10.1 2020-05-14 06:10:21 - *** --- * --- - ** ---------- [config] - ** ---------- .> app: tasks:0x7fc101c1cb90 - ** ---------- .> transport: amqp://guest:**@rq:5672// - ** ---------- .> results: redis://rd/ - *** --- * --- .> concurrency: 1 (prefork) -- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker) --- ***** ------------------- [queues].> celery exchange=celery(direct) key=celery[tasks]. tasks.add ...然后再開一個 shell,輸入命令:
$ docker exec -w /tmp/celery_data/ -it celery python Python 3.7.4 (default, Oct 17 2019, 06:10:02) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from tasks import add >>> res = add.delay(4, 4) >>> res.ready() True >>> res.get() 8可以看到我們的 測試環境 成功搭建~ celery 也能正常使用了!
但是,這里還是有個問題。
Q:
每次清掉測試環境之后,再啟動步驟很多,關閉操作也很多。,比較麻煩,有沒有什么簡單的方法呢?
A:
當然有啦!容器編排簡單版 docker-compose
docker-compose 管理測試容器
docker-compose 是什么?
點這里
Compose 是用于定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務。然后,使用一個命令,就可以從 YML 文件配置中創建并啟動所有服務。
docker-compose 安裝
安裝比較簡單,看一下這里就行
各系統的安裝方式
docker-compose file 的編排
有了 docker-compose 之后,就可以管理我們的容器了!我們回憶一下,目前我們有哪些東西:
- 三個容器
- rabbitmq
- redis
- celery
- 一個網絡
- msg_middleware
有了這些,我們就可以編寫我們的 docker-compose.yml 了。
創建一個 yml。
touch docker-compose.yml編寫 yml 文件:
version: '2' services:celery:image: python:3.7-slimcontainer_name: 'celery'volumes:- /tmp/celery_data:/tmp/celery_datadepends_on:- redis- rabbitmqnetworks:- msg_middlewareworking_dir: /tmp/celery_datacommand: ["bash", "celery.sh"]redis:image: rediscontainer_name: 'rd'ports:- 6379:6379networks:- msg_middlewarerabbitmq:container_name: 'rq'image: rabbitmqports:- 5462:5462networks:- msg_middleware networks:msg_middleware:細心的你會發現,我們有一個 celery.sh,其實腳本也比較簡單,如下:
$ vim celery.sh pip install celery redis -i https://pypi.tuna.tsinghua.edu.cn/simple celery -A tasks worker --loglevel=info把之前的命令行全放進來就行了(pip 這里不標準,應該放到 dockerfile 中的,便于演示,就直接這樣了。)
運行我們的 docker-compose 就可以啦!
啟動 測試集,,并在后臺運行
$ docker-compose up -d Creating network "data_msg_middleware" with the default driver Creating rq ... done Creating rd ... done Creating celery ... done檢測是否運行成功,我們在宿主機測試,參照之前的方式即可:
docker exec -w /tmp/celery_data/ -it celery python Python 3.7.4 (default, Oct 17 2019, 06:10:02) [GCC 8.3.0] on linux Type "help", "right", "credits" or "license" for more information. >>> from tasks import add >>> res = add.delay(4, 4) >>> res.ready() True >>> res.get() 8關閉 測試集
$ docker-compose down Stopping rd ... done Stopping rq ... done Removing celery ... done Removing rd ... done Removing rq ... done Removing network data_msg_middleware其他命令
- 停止 docker-compose stop
- 重啟 docker-compose restart
- 啟動子應用 docker-compose up subapp_name
- 刪除鏡像及容器 docker-compose rmi --all
總結
用 docker 來搭建 celery 測試環境的文章就到這里啦。相信大家對 docker 也有了一定的認識。至少用來做環境管理是非常方便的!
從 docker 創建我們所需的環境,再到 docker-compose 一鍵管理我們的環境,相信你也學到了很多。
至少再也不用擔心的環境問題了!
今天就到這里,下次我們會對 celery 進行深入使用哦,敬請期待。
參考資料:
Celery 中文文檔
菜鳥編程
docker compose
參考鏈接: https://dustyposa.github.com/posts/feca44b4/
總結
以上是生活随笔為你收集整理的Celery简介及Docker测试环境搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins X:基于Kubernet
- 下一篇: python django升级安装sql