精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何快速創建一個擁有異步任務隊列集群的 Rest Api

開發 前端
本文分享如何使用 docker-compose、FastAPI、rq 來快速創建一個包含異步任務隊列集群的 REST API,后端執行任務的節點可以隨意擴展。

異步任務是 Web 后端開發中最常見的需求,非常適合多任務、高并發的場景。本文分享如何使用 docker-compose、FastAPI、rq 來快速創建一個包含異步任務隊列集群的 REST API,后端執行任務的節點可以隨意擴展。

系統的架構圖:

上圖中的每一個方框都可以理解為一個服務器。

用戶請求 api, api 將任務放入 redis 隊列,worker 自動去 redis 隊列取出任務并執行,worker 節點可以任意水平擴展。

接下來,我們來實現這一架構的 demo,你可以看到 docker 的強大和方便之處。

1、先創建一個虛擬環境,安裝依賴

依賴 fastapi,redis,rq 庫,安裝后生成一個 requirements.txt 文件

  1. mkdir myproject 
  2. python3 -m venv env 
  3. source env/bin/activate 
  4. pip install rq 
  5. pip install fastapi 
  6. pip install redis 
  7. pip freeze > requirements.txt 

2、編碼實現 REST API、Worker

REST 是一種風格,這里不是重點,我們使用 FastAPI 來快速創建一個接口,新建一個 api.py 的文件,內容如下:

  1. from fastapi import FastAPI 
  2. from redis import Redis 
  3. from rq import Queue 
  4. from worker import send_captcha 
  5. app = FastAPI() 
  6.  
  7. # 需要注意,這里的 host 是主機名,在 docker 中就是服務名,后面的 docker-compose.ymal 中的服務名稱也要是這個 
  8. redis_conn = Redis(host='myproj_redis', port=6379, db=0) 
  9.  
  10. # 定義一個隊列,名稱是 my_queue 
  11. q = Queue('my_queue'connection=redis_conn) 
  12.  
  13. @app.get('/hello'
  14. def hello(): 
  15.     """Test endpoint""" 
  16.     return {'hello''world'
  17.  
  18. # Rest API 示例 
  19. @app.post('/send_captcha/{phone_number}', status_code=201) 
  20. def addTask(phone_number: str): 
  21.     ""
  22.     Adds tasks to worker queue. 
  23.     Expects body as dictionary matching the Group class. 
  24.  
  25.     ""
  26.     job = q.enqueue(send_captcha, phone_number) 
  27.  
  28.     return {'job'"tasks add done."

這里的 send_captcha 函數就是一個異步任務,從 worker.py 中導入,worker.py 的內容如下:

  1. import time 
  2.  
  3. def send_captcha(phone_number): 
  4.     ""
  5.     模擬一個耗時的異步任務 
  6.     ""
  7.     print(f'{time.strftime("%T")} 準備發送手機驗證碼') # in place of actual logging 
  8.     print(f'{time.strftime("%T")} 生成隨機驗證碼并存入 redis,設置 5 分鐘過期時間'
  9.     time.sleep(5) # simulate long running task 
  10.     print(f'{time.strftime("%T")} {phone_number}發送完成'
  11.     return { phone_number: 'task complete'

return { phone_number: 'task complete'}

3、構建 Dokcer 鏡像

現在的目標是實現一個擁有兩個執行節點的集群。我們需要啟動 4 個容器來完成一個集群部署:

  • 容器1:運行 FastAPI app
  • 容器2:運行 Redis 服務
  • 容器3:運行 worker 1 服務
  • 容器4:運行 worker 2 服務

其中容器 1、3、4 都是 Python 應用,可以共用一個 Python 鏡像。

為了方便調試,我們可以讓 1、3、4 容器共享我們的本地路徑,這樣改了代碼就不需要重新構建鏡像,比較方便。

創建一個包含依賴的 Python 鏡像

現在我們來創建一個包含前文 requirements.txt 依賴的 Python 鏡像,編寫 Dockerfile,內容如下:

  1. FROM python:3.8-alpine 
  2. RUN adduser -D myproj 
  3. WORKDIR /home/myproj 
  4. COPY requirements.txt requirements.txt 
  5. RUN pip install -r requirements.txt 
  6. RUN chown -R myproj:myproj ./ 
  7. USER myproj 
  8. CMD uvicorn api:app --host 0.0.0.0 --port 5057 

內容說明:

FROM python:3.8-alpine

指定使用 python:3.8-alpine,這個容器已經預裝了 Python3.8,可以在命令行執行 docker search python 看看有哪些 Python 鏡像。

RUN adduser -D myproj

添加一個用戶 myproj,這一步的主要目的是為了生成目錄 /home/myproj

WORKDIR /home/myproj

設置程序的執行路徑為 /home/myproj

COPY requirements.txt requirements.txt

復制當前路徑下的 requirements.txt 到容器的 /home/myproj,這里沒有復制 .py 文件是因為后面我們啟動容器的時候會共享本地路徑,不需要再復制了,生產部署時最好復制到窗口內部,這樣容器就不會依賴本機。

RUN pip install -r requirements.txt

在容器中安裝依賴

RUN chown -R myproj:myproj ./

將 /home/myproj 路徑下的文件的擁有者和所屬組改為 myproj,這一步為了使用 myproj 用戶來啟動 fastapi 服務,生產環境通常用 root 用戶啟動,也就不需要這個指令了。

USER myproj

切換到 myproj 用戶

CMD uvicorn api:app --host 0.0.0.0 --port 5057

容器啟動后執行的命令,服務端口為 5057

更多的 Dockerfile 語法請參考官方文檔,這里僅是簡要說明。

現在 Dockerfile 所在的目錄執行下面的命令構建一個鏡像:

  1. docker build -t myproject:latest . 

創建完成后,可以使用 docker images 來查看:

  1. ❯ docker images | grep myproj 
  2. myproject               

4、啟動集群

這里使用 Docker Compose 來啟動 4 個容器,為什么用 Docker Compose 呢?因為方便,如果不用的話,需要手動一個容器一個容器啟動。

Docker Compose 會讀取一個 yaml 格式的配置文件,依據配置文件來啟動容器,各容器共享同一網絡。還記得 api.py 中使用的 Redis 主機名嗎,這里就需要將 redis 服務名設置為那個主機名。

編寫一個 docker-compose.yml 內容如下:

  1. version: '3' 
  2.  
  3. services: 
  4.   myproj_redis: 
  5.     image: redis:4.0-alpine 
  6.     ports: 
  7.       - "6379:6379" 
  8.     volumes: 
  9.       - ./redis:/data 
  10.  
  11.   myproj_api: 
  12.     image: myproject:latest 
  13.     command: uvicorn api:app --host 0.0.0.0 --port 5057 
  14.     ports: 
  15.       - "5057:5057" 
  16.     volumes: 
  17.       - ./:/home/myproj 
  18.  
  19.   myproj_worker1: 
  20.     image: myproject:latest 
  21.     command: rq worker --url redis://myproj_redis:6379 my_queue 
  22.     volumes: 
  23.       - ./:/home/myproj 
  24.  
  25.   myproj_worker2: 
  26.     image: myproject:latest 
  27.     command: rq worker --url redis://myproj_redis:6379 my_queue 
  28.     volumes: 
  29.       - ./:/home/myproj 

第一個容器是 myproj_redis,運行著 redis 服務, redis 的數據通過 volumes 方式保存在本地,因此需要在本地創建一個 redis 目錄,來映射容器內部的 /data 目錄。

第二個容器就是 fastapi 服務,端口 5057,使用本地路徑映射為 /home/myproj

第三個容器和第四個容器是 worker 節點,雖然也映射了本地路徑,但它僅使用 worker.py 文件。當任務太多時,worker 節點可以擴展,解決負載壓力,

最終的目錄是這樣:

執行 docker compose 命令啟動 4 個容器:

  1. docker compose -f docker-compose.yml up 

可以看到 4 個服務均啟動并正常打印了日志輸出。

4、測試

現在來測試一下,左邊的窗口,我使用 Python 快速發送了 3 個 post 請求:

  1. import subprocess 
  2. for i in range(3): 
  3.     subprocess.run("curl -v -X POST 'http://localhost:5057/send_captcha/18012345678'",shell = True

從右邊窗口的日志輸出可以看出 worker1 和 worker2 都執行了任務,其中 worker1 執行了 2 個,worker2 執行了 1 個。

查看完整代碼請點擊「閱讀原文」

最后的話

本文分享了如何使用 Dockerfile 構建一個鏡像,使用 Docker Compose 管理一個容器集群,以此為基礎實現了一個具有異步任務隊列集群的 REST API,拋磚引玉,關于 Dockerfile、docker-compose 的詳細用法,還請參考 Docker 官方文檔

 

責任編輯:武曉燕 來源: Python七號
相關推薦

2023-08-01 07:25:38

Expresso框架API

2021-08-10 07:27:42

Elasticsear集群開源

2023-11-19 20:16:43

RESTAPIPOST

2023-04-10 14:20:47

ChatGPTRESTAPI

2020-10-28 17:15:45

Redis前端數據庫

2010-03-08 16:36:53

攻略備案域名注冊淘寶網

2020-09-29 07:24:14

Python字典數據

2013-07-01 11:01:22

API設計API

2024-05-23 11:26:02

2020-08-25 07:48:17

Kubernetes集群系統

2024-10-14 08:46:50

Controller開發代碼

2023-05-11 12:40:00

Spring控制器HTTP

2020-09-22 07:50:23

API接口業務

2024-01-02 13:58:04

GoREST API語言

2023-08-14 09:00:00

APIgRPCREST

2023-03-01 09:39:40

調度系統

2018-06-19 16:04:27

Dubbo應用Java

2019-11-11 10:45:44

LinuxWindows 10Debian 10

2013-05-02 10:40:24

xcode

2021-05-27 09:50:03

連接池FTP服務器
點贊
收藏

51CTO技術棧公眾號

www.99视频| 欧美一区二区在线不卡| 日韩国产欧美精品在线| 亚洲精品二区| 免费观看一区二区三区毛片| jizz久久久久久| 亚洲午夜精品久久久久久app| 色综合视频在线观看| 成人3d动漫一区二区三区91| 熟女少妇内射日韩亚洲| 99riav视频在线观看| 91精品亚洲| 91黄色小视频| 美女主播视频一区| 日韩免费黄色片| 欧美另类中文字幕| 国产精品久久久久影院色老大| 69国产精品成人在线播放| 最好看的中文字幕| 黄色网在线免费看| 免费不卡在线视频| 一色桃子一区二区| 国产午夜精品福利| 中文字幕亚洲二区| 亚洲 中文字幕 日韩 无码| 少妇高潮一区二区三区99小说| 亚洲精品va| 青青青免费在线| 大地资源二中文在线影视观看| 日本视频在线播放| 日韩激情视频在线观看| 日韩精品亚洲元码| 欧美日韩亚洲一| 婷婷国产在线| 国产日韩欧美三级| 精品视频在线播放| 欧美精品色视频| www国产在线观看| 国产一本一道久久香蕉| 久久九九亚洲综合| 久久人人爽人人片| 巨胸喷奶水www久久久免费动漫| 久久精品一区二区三区不卡牛牛 | 美女主播精品视频一二三四| 一区二区三区在线视频观看58| 国产女主播一区| 欧美精品在线视频观看| 国产又粗又猛大又黄又爽| 成人激情综合| 国产精品三级av| 你懂的视频在线一区二区| 亚洲精品第五页| 伊人激情综合| 日韩av最新在线| 国产成人精品综合久久久久99| 久久精品xxxxx| 亚洲码国产岛国毛片在线| 国产精品国产精品国产专区不卡| 精品国产免费观看| 国内精品久久久久久久97牛牛 | 午夜激情在线观看视频| 亚洲s色大片| 欧美激情一区二区三区四区| 亚洲国产欧美日韩另类综合| 3d精品h动漫啪啪一区二区| 久久久美女视频| 免费看成人人体视频| 日本精品一级二级| 女性隐私黄www网站视频| 日本精品一区二区三区在线播放| 国产午夜精品在线观看| 欧美一级片免费观看| 国产女同91疯狂高潮互磨| 99精品欧美| 色婷婷久久av| 无码人妻aⅴ一区二区三区| japanese色系久久精品| 在线一区二区三区四区五区| 热久久最新地址| 久久精品国产亚洲a∨麻豆| 国产一区在线不卡| 99电影网电视剧在线观看| 少妇人妻偷人精品一区二区| 91色综合久久久久婷婷| 亚洲自拍偷拍在线| 中文字幕免费视频观看| 99精品99| 国产成人精品视| 日本熟妇乱子伦xxxx| 亚欧美无遮挡hd高清在线视频| xxxxx成人.com| 少妇特黄一区二区三区| 中文在线综合| 欧美精品丝袜久久久中文字幕| 成人免费观看视频在线观看| 精品三区视频| 欧美一个色资源| 在线能看的av网站| 国精产品一区二区三区有限公司| 亚洲国产一二三| 红桃一区二区三区| 日韩影院在线| 亚洲va欧美va人人爽| 超碰10000| 依依综合在线| 欧美日韩亚洲天堂| 国产午夜大地久久| 粉嫩av一区二区三区四区五区| 欧美一区二区三区免费在线看| 国产视频久久久久久| 91国内精品| 亚洲天堂成人在线| 美女100%无挡| 免费成人av| 亚洲欧美一区二区三区久久 | 精品人妻在线播放| 日本vs亚洲vs韩国一区三区| 欧洲亚洲在线视频| 91视频免费网址| 精品影视av免费| 国产在线拍偷自揄拍精品| 性高潮视频在线观看| 国产经典欧美精品| 97神马电影| 成人免费在线视频网| 中文字幕不卡在线观看| 偷拍视频一区二区| 日本在线免费网| 色综合天天综合网天天狠天天| 国产探花在线观看视频| 欧美日韩中出| 中文字幕9999| 免费看日韩毛片| 国产盗摄精品一区二区三区在线| 亚洲国产精品日韩| 欧美人体一区二区三区| 日韩av一卡二卡| 国产一级做a爱免费视频| 一本色道88久久加勒比精品| 91视频8mav| www三级免费| 亚洲欧洲成人自拍| 精品人妻大屁股白浆无码| 超碰在线视屏| 在线免费亚洲电影| 亚洲精品视频大全| 亚洲精品孕妇| 国产精品扒开腿爽爽爽视频 | 日韩视频不卡| αv一区二区三区| 丝袜美女在线观看| 偷拍一区二区三区四区| 欧美激情精品久久久久久小说| 一区二区网站| 欧美激情在线狂野欧美精品| 国产高潮久久久| 成人黄色在线视频| 日韩精彩视频| 亚洲电影视频在线| 91精品国产91综合久久蜜臀| 婷婷激情四射网| 亚洲免费播放| 久久久久久99| 成人免费看片| 欧美一区二区成人6969| 看免费黄色录像| 国产精品一区免费在线观看| 久久综合入口| 日本免费一区二区三区四区| 国产午夜一区二区| 国产性一乱一性一伧一色| 国产成人久久精品77777最新版本| av中文字幕av| 国产精品99久久免费观看| 中文字幕久久久| 在线观看免费中文字幕| 99热这里都是精品| 欧美日韩一级在线| 黑人精品一区| 中文字幕v亚洲ⅴv天堂| 国产女人18毛片水真多| 亚洲午夜久久久久久久久电影院| 无码任你躁久久久久久老妇| 天天色综合色| 国产精品第100页| av大片在线观看| 五月婷婷欧美视频| 久久精品国产亚洲av麻豆| 日韩国产欧美在线观看| 日韩视频在线免费播放| 精品欠久久久中文字幕加勒比| 欧美专区在线视频| 欧美性天天影视| 色婷婷精品大在线视频 | 极品国产人妖chinesets亚洲人妖| 国语自产在线不卡| 91免费视频播放| 国产亚洲欧美色| 天天综合网久久| 蜜桃成人av| 91精品在线看| 蜜桃视频动漫在线播放| 日韩亚洲精品视频| 天堂在线资源8| 欧美日韩精品免费观看视频| b站大片免费直播| 激情综合网最新| 亚洲综合五月天| 99久久伊人| 欧美激情18p| 亚洲第一页在线观看| 色狠狠色噜噜噜综合网| 国产在线观看免费av| 国产精品少妇自拍| 国产精品久久不卡| 亚洲伊人观看| 欧美在线视频二区| 999久久精品| 国产日韩欧美成人| 亚洲欧美se| 亚洲天堂av在线免费观看| 精品黑人一区二区三区在线观看| 日本高清不卡aⅴ免费网站| 欧产日产国产v| 国产不卡免费视频| 你真棒插曲来救救我在线观看| 国产精品自在| 91久久精品视频| 日本精品网站| 欧美一区二区三区……| 久久精品国产亚洲a∨麻豆| 欧美v亚洲v综合ⅴ国产v| 日韩伦人妻无码| 亚洲婷婷综合久久一本伊一区| 免费观看黄网站| 免播放器亚洲一区| 日日碰狠狠丁香久燥| 国产日本精品| 国产美女主播在线播放| 欧美久久一级| 久久日韩精品| 国产三级精品三级在线观看国产| 亚洲综合国产精品| 国产精品麻豆| 午夜免费日韩视频| www 日韩| 伊人伊人伊人久久| 国产一级网站视频在线| 亚洲欧洲激情在线| 国产中文字幕在线播放| 亚洲欧美在线磁力| 欧美孕妇孕交| 日韩亚洲欧美综合| 国产精品久久久久久久免费| 亚洲线精品一区二区三区八戒| 国产美女久久久久久| 综合欧美亚洲日本| 在线免费观看亚洲视频| 26uuu亚洲综合色欧美| 亚洲最大的黄色网| 99精品久久只有精品| 日本高清久久久| 精品亚洲免费视频| 免费不卡av网站| 国产**成人网毛片九色| 欧洲熟妇的性久久久久久| 麻豆精品视频在线观看视频| 成人免费性视频| 欧美在线电影| 国产精品一国产精品最新章节| 91综合久久爱com| 韩国精品一区二区三区六区色诱| 国产亚洲欧美日韩精品一区二区三区| 国产精品av免费在线观看| 97精品国产99久久久久久免费| 国产在线高清精品| 视频一区中文字幕精品| 国产精品一区二区三区久久久| 电影k8一区二区三区久久| 中文字幕在线亚洲| а√资源新版在线天堂| 久久人人爽人人爽人人片av高请| 玖玖在线播放| 国产精品久久一区| 亚洲人成午夜免电影费观看| 国产91网红主播在线观看| 91吃瓜在线观看| 97超碰国产精品女人人人爽| 国产综合av| 91影视免费在线观看| 免费看成人人体视频| 亚洲高清123| 欧美三级网页| 50路60路老熟妇啪啪| 国产呦萝稀缺另类资源| 日韩网站在线播放| 最好看的中文字幕久久| 亚洲欧美精品一区二区三区| 亚洲午夜久久久久久久久电影院| 黄色一级视频免费看| 狠狠躁夜夜躁人人爽天天天天97 | 国产精品自产拍高潮在线观看| 免费看日产一区二区三区| 久久国产精品精品国产色婷婷| 日韩欧美综合| 视频三区二区一区| 欧美另类亚洲| 久久久久亚洲AV成人无在| 夜久久久久久| jizzzz日本| 成人av在线看| 网爆门在线观看| 欧美高清一级片在线观看| 欧美日韩激情在线观看| 亚洲激情自拍视频| 四虎成人在线观看| 欧美午夜片在线免费观看| 欧美精品乱码视频一二专区| 日韩欧美精品网址| a天堂视频在线| 51精品久久久久久久蜜臀| 91九色蝌蚪91por成人| 日韩av在线一区二区| 中国av在线播放| 久久99热精品| 国产黄色大片在线观看| 国产精品自产拍在线观看| 青青草原在线亚洲| 国产成人永久免费视频| 久久99精品一区二区三区三区| 日本丰满少妇裸体自慰| 亚洲一区二区av在线| 国产精品视频无码| 最近2019免费中文字幕视频三| 日本乱码一区二区三区不卡| 国产v亚洲v天堂无码| 欧美日韩大片免费观看| 蜜臀av性久久久久蜜臀av| 99久久这里只有精品| 日本男人操女人| 91丨九色丨蝌蚪丨老版| 日本三级一区二区| 日韩av影院在线观看| 国产99re66在线视频| 97超级在线观看免费高清完整版电视剧| 日韩久久视频| 一区二区三区网址| 国产白丝网站精品污在线入口| 三级黄色在线观看| 亚洲成a人片综合在线| 亚洲AV无码一区二区三区性| 麻豆乱码国产一区二区三区 | 在线观看免费av片| 亚洲国产一区自拍| av在线免费观看网| 国产精品免费久久久久影院| 禁断一区二区三区在线| 日本一二三区视频在线| 国产一区视频网站| 国产成人无码aa精品一区| 日韩美女主播在线视频一区二区三区| 五月婷婷深深爱| 少妇高潮久久久久久潘金莲| 99久久伊人| 最新中文字幕久久| 国产成人av电影在线| 日韩欧美高清在线观看| 精品一区二区三区四区在线| 超碰超碰人人人人精品| 日本在线观看不卡| 美国毛片一区二区| 青青草原在线免费观看| 亚洲а∨天堂久久精品9966| 亚洲视频tv| 91免费视频网站| 欧美成人首页| 韩国视频一区二区三区| 成人欧美一区二区三区黑人麻豆| 不卡视频免费在线观看| 69av在线视频| 日本午夜一区| 爱情岛论坛亚洲自拍| 五月激情六月综合| 成人欧美一区| 99久久国产免费免费| 国产日韩欧美高清免费| 黄色裸体一级片| 色综合久久99| 在线观看av的网站| 国产精品国产三级国产专区53| 久久久久网站| 中出视频在线观看| 欧美日韩一区三区| 国产高清在线| 日韩美女在线观看| 亚洲精品国产首次亮相| 少妇真人直播免费视频| 欧美精品一级二级三级| 黄色在线网站噜噜噜| 亚洲一二三区在线|