Celery简介及Docker测试环境搭建
Celery 簡(jiǎn)介
任務(wù)隊(duì)列一般用于線程或計(jì)算機(jī)之間分配工作的一種機(jī)制。
任務(wù)隊(duì)列的輸入是一個(gè)稱為任務(wù)的工作單元,有專門的工作進(jìn)行不斷的監(jiān)視任務(wù)隊(duì)列,進(jìn)行執(zhí)行新的任務(wù)工作。
Celery 通過消息機(jī)制進(jìn)行通信,通常使用中間人(Broker)作為客戶端和職程(Worker)調(diào)節(jié)。啟動(dòng)一個(gè)任務(wù),客戶端向消息隊(duì)列發(fā)送一條消息,然后中間人(Broker)將消息傳遞給一個(gè)職程(Worker),最后由職程(Worker)進(jìn)行執(zhí)行中間人(Broker)分配的任務(wù)。
Celery 可以有多個(gè)職程(Worker)和中間人(Broker),用來(lái)提高Celery的高可用性以及橫向擴(kuò)展能力。
Celery 測(cè)試環(huán)境搭建
重要:為了使用更加簡(jiǎn)單,我們所有命令行操作都是在宿主機(jī)上進(jìn)行的!
Celery 的運(yùn)行,至少需要一個(gè) broker,一般選用 rabbitmq or redis,一個(gè)運(yùn)行 Celery 的服務(wù)。那么安裝起來(lái)比較麻煩,網(wǎng)絡(luò)配置也比較麻煩,這里我們直接推薦用 Docker 來(lái)進(jìn)行測(cè)試環(huán)境的搭建。
為什么用 Docker ? 假設(shè)我們直接安裝,來(lái)看看我們要做什么。
安裝 Docker
安裝比較簡(jiǎn)單,我們直接推薦按照官方安裝即可:
Linux 安裝
Windows 安裝
Mac 安裝
Celery 容器構(gòu)建
因?yàn)?docker hub 上面的 celery 鏡像比較老了,我們就從零安裝一個(gè)鏡像即可。
步驟如下:
-
拉取 python 鏡像作為基礎(chǔ)鏡像。因?yàn)槟壳?celery 還不支持 PY38,所以我們拉取 PY37 即可。
docker pull python:3.7-slim
-
利用拉取的 python 鏡像,生成 python 容器。運(yùn)行以下命令:
$ docker run --name celery -v /tmp/celery_data:/tmp/celery_data -dit python:3.7-slim bash # 掛載目錄并在后臺(tái)創(chuàng)建運(yùn)行 python 容器 $ docker exec celery bash -c "pip install celery redis -i https://pypi.tuna.tsinghua.edu.cn/simple # 在容器內(nèi)安裝第三方庫(kù) 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 # 查看運(yùn)行的容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 655908bd8ae1 python:3.7-slim "python3" 12 minutes ago Up 12 minutes celery
可以看到,短短幾行命令,我們的 celery 容器創(chuàng)建完成,相關(guān)依賴庫(kù)也已經(jīng)安裝成功。第一步,大功告成。
但是,我們還缺少一個(gè) broker。同樣,我們用 docker 創(chuàng)建一個(gè)。
Broker 容器創(chuàng)建(rabbitmq)
這個(gè)創(chuàng)建就更簡(jiǎn)單了!直接參照命令行即可。
$ docker pull rabbitmq $ docker run -d --name rq -p 5462:5462 rabbitmq # 取名為 rq (沒錯(cuò),就是太懶了,這名字有什么用? 不急!后面還有用!Backend 容器創(chuàng)建(redis)
依葫蘆畫瓢
$ docker pull redis $ docker run -d --name rd -p 6379:6379 redis # 取名為 rd (沒錯(cuò),就是太懶了,這名字有什么用? 不急!后面還有用!我們的依賴就安裝好了,看看目前的狀態(tài):
$ 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 應(yīng)用
Ok,我們需要的三個(gè)基礎(chǔ)容器已經(jīng)創(chuàng)建完成。我們來(lái)測(cè)試一下 celery,先編寫一個(gè)腳本:
$ 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咦,不對(duì)啊,這網(wǎng)絡(luò)地址怎么填?我看看,不對(duì),用的 docker ,網(wǎng)絡(luò)填起來(lái)比較麻煩,各個(gè) container 容器 ip 還不一樣。臥槽,這不是麻煩死了嗎?
等等,是不是一般人都會(huì)這么想。
害,別急。container 網(wǎng)絡(luò)是隔離的~更加安全,隔離性更高。當(dāng)然,我們可以通過:
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' celery 172.17.0.7來(lái)查看各個(gè)容器的端口,然后再回填到我們的 tasks.py 中。但是呢,這樣還是比較麻煩,因?yàn)?ip 不能固定,最好的方式是什么呢,當(dāng)然用 hosts 映射一個(gè)與域名類似的東西,保證名字相同就行。
什么東西能幫我們完成這個(gè)任務(wù)呢?當(dāng)然就是我們的 docker network。
我們現(xiàn)在要做什么:
創(chuàng)建一個(gè)小型局域網(wǎng),每個(gè)臺(tái)主機(jī)可以通過主機(jī)名直接連接。
docker network 的使用
使用比較簡(jiǎn)單,命令如下:
創(chuàng)建 docker network
$ docker network create msg_middleware # 創(chuàng)建一個(gè)局域網(wǎng) 3576e1af1f60834e9c2871c39a94fcfe86bf63963057adca130fdc6fdf5b7302 $ docker network ls # 查看創(chuàng)建局域網(wǎng) NETWORK ID NAME DRIVER SCOPE 00398aeb039a bridge bridge local 988e494caf26 host host local 064055db55a9 msg_middleware bridge local將 container 拉入網(wǎng)絡(luò)中
$ docker network connect msg_middleware celery $ docker network connect msg_middleware rd # 在 msg_middleware 的網(wǎng)絡(luò)下,相當(dāng)于直接可以 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可以看到我們的鏈接就很簡(jiǎn)單了,不再依賴于 ip 這樣非常方便。
Celery 簡(jiǎn)單使用
到目前為止,我們所需要的 celery, broker, backend 都搞定了。毫無(wú)疑問,這樣肯定比你從零安裝快多了!
讓我們趕緊測(cè)測(cè)我們的 celery 吧!
測(cè)試 Celery
重要:為了使用更加簡(jiǎn)單,我們所有命令行操作都是在宿主機(jī)上進(jìn)行的!
首先,我們打開一個(gè) shell 運(yùn)行我們的 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 ...然后再開一個(gè) 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可以看到我們的 測(cè)試環(huán)境 成功搭建~ celery 也能正常使用了!
但是,這里還是有個(gè)問題。
Q:
每次清掉測(cè)試環(huán)境之后,再啟動(dòng)步驟很多,關(guān)閉操作也很多。,比較麻煩,有沒有什么簡(jiǎn)單的方法呢?
A:
當(dāng)然有啦!容器編排簡(jiǎn)單版 docker-compose
docker-compose 管理測(cè)試容器
docker-compose 是什么?
點(diǎn)這里
Compose 是用于定義和運(yùn)行多容器 Docker 應(yīng)用程序的工具。通過 Compose,您可以使用 YML 文件來(lái)配置應(yīng)用程序需要的所有服務(wù)。然后,使用一個(gè)命令,就可以從 YML 文件配置中創(chuàng)建并啟動(dòng)所有服務(wù)。
docker-compose 安裝
安裝比較簡(jiǎn)單,看一下這里就行
各系統(tǒng)的安裝方式
docker-compose file 的編排
有了 docker-compose 之后,就可以管理我們的容器了!我們回憶一下,目前我們有哪些東西:
- 三個(gè)容器
- rabbitmq
- redis
- celery
- 一個(gè)網(wǎng)絡(luò)
- msg_middleware
有了這些,我們就可以編寫我們的 docker-compose.yml 了。
創(chuàng)建一個(gè) 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:細(xì)心的你會(huì)發(fā)現(xiàn),我們有一個(gè) celery.sh,其實(shí)腳本也比較簡(jiǎn)單,如下:
$ vim celery.sh pip install celery redis -i https://pypi.tuna.tsinghua.edu.cn/simple celery -A tasks worker --loglevel=info把之前的命令行全放進(jìn)來(lái)就行了(pip 這里不標(biāo)準(zhǔn),應(yīng)該放到 dockerfile 中的,便于演示,就直接這樣了。)
運(yùn)行我們的 docker-compose 就可以啦!
啟動(dòng) 測(cè)試集,,并在后臺(tái)運(yùn)行
$ docker-compose up -d Creating network "data_msg_middleware" with the default driver Creating rq ... done Creating rd ... done Creating celery ... done檢測(cè)是否運(yùn)行成功,我們?cè)谒拗鳈C(jī)測(cè)試,參照之前的方式即可:
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關(guān)閉 測(cè)試集
$ 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
- 啟動(dòng)子應(yīng)用 docker-compose up subapp_name
- 刪除鏡像及容器 docker-compose rmi --all
總結(jié)
用 docker 來(lái)搭建 celery 測(cè)試環(huán)境的文章就到這里啦。相信大家對(duì) docker 也有了一定的認(rèn)識(shí)。至少用來(lái)做環(huán)境管理是非常方便的!
從 docker 創(chuàng)建我們所需的環(huán)境,再到 docker-compose 一鍵管理我們的環(huán)境,相信你也學(xué)到了很多。
至少再也不用擔(dān)心的環(huán)境問題了!
今天就到這里,下次我們會(huì)對(duì) celery 進(jìn)行深入使用哦,敬請(qǐng)期待。
參考資料:
Celery 中文文檔
菜鳥編程
docker compose
參考鏈接: https://dustyposa.github.com/posts/feca44b4/
總結(jié)
以上是生活随笔為你收集整理的Celery简介及Docker测试环境搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jenkins X:基于Kubernet
- 下一篇: deepin v20.2.4设置全局搜索