精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

成人不卡视频| 可以直接在线观看的av| 黄色在线成人| 亚洲人午夜精品免费| 中文字幕国产免费| 黑人极品ⅴideos精品欧美棵| 99久久精品久久久久久清纯| 国产精品久久久久久久久借妻| 黄色香蕉视频在线观看| 琪琪久久久久日韩精品| 欧美精品色综合| 国产人妻777人伦精品hd| 8888四色奇米在线观看| 成人午夜视频免费看| 国产精品人成电影在线观看| 国产午夜精品无码| 日韩精品久久| 日韩精品小视频| 亚洲综合123| 欧美日韩亚洲国产| 午夜精品福利一区二区三区av| 日韩国产欧美一区| 神马久久久久久久久久| 久久精品国产亚洲高清剧情介绍| 欧美激情亚洲精品| 蜜桃av免费在线观看| 欧洲精品一区| 日韩欧美国产一区在线观看| 日本黄大片一区二区三区| 天堂中文在线播放| 亚洲天堂a在线| 日本高清久久一区二区三区| 天天干天天舔天天射| 国产精品1024| 成人激情视频在线| 一级黄色大片免费| 久久资源在线| 91禁外国网站| 国产精品a成v人在线播放| 国产精品7m凸凹视频分类| 国产一区二区三区在线视频| 欧美在线一级片| 99精品国产高清一区二区麻豆| 欧美日韩精品一区二区| 北条麻妃视频在线| 国产精品专区免费| 欧美丝袜一区二区| 久久无码高潮喷水| 小h片在线观看| 激情成人中文字幕| 免费国产a级片| 高清精品在线| 图片区小说区国产精品视频| 欧美中日韩在线| 欧美18hd| 日韩毛片在线免费观看| 日韩 欧美 自拍| 最爽无遮挡行房视频在线| 综合久久给合久久狠狠狠97色| 亚洲精品乱码久久久久久蜜桃91 | 精品欧美一区二区三区在线观看| 日韩欧美在线视频免费观看| 无码aⅴ精品一区二区三区浪潮| 国产欧洲在线| 日韩欧美在线视频观看| 狠狠热免费视频| 免费成人美女女| 欧美三级在线播放| 亚洲高清在线不卡| 成人动漫视频| 日韩av网址在线| 手机免费看av| 97精品国产福利一区二区三区| 久久精品福利视频| 国产精品30p| 久久国产高清| 成人国产精品久久久| 精品人妻一区二区三区蜜桃 | 超碰个人在线| 一区二区三区精品在线| 99热自拍偷拍| yw.尤物在线精品视频| 欧美妇女性影城| 中文字幕在线视频一区二区| 美女一区二区在线观看| 国产亚洲精品美女久久久| 欧美视频一区二区在线| 激情国产一区| 国产成人aa精品一区在线播放 | 手机av在线| 欧美午夜不卡视频| 激情小说欧美色图| 国产精品亚洲片在线播放| 日韩小视频网址| 亚洲精品午夜久久久久久久| 日韩精品一二三四| 97人人做人人人难人人做| 四虎精品成人影院观看地址| 中文字幕不卡三区| 婷婷五月综合缴情在线视频| 99欧美精品| 亚洲大胆人体在线| 久久一级免费视频| 国产精品久久国产愉拍| 国产日韩欧美影视| 亚州av在线播放| 亚洲欧美日韩国产另类专区 | 欧美成人精品欧美一| 久久午夜精品一区二区| 97超碰人人看人人| 懂色av中文在线| 亚洲h精品动漫在线观看| 日本三级黄色网址| 视频一区在线观看| 久久久人成影片一区二区三区观看| www.五月婷婷.com| 99视频在线观看一区三区| 中国一级大黄大黄大色毛片| av在线一区不卡| 日韩av网站在线| 国产精品日日夜夜| 国产一区 二区 三区一级| 色一情一区二区三区四区| 国产高清视频色在线www| 欧美精品三级日韩久久| 精品一区二区6| 久久这里只有| 欧美综合激情| 婷婷六月国产精品久久不卡| 亚洲电影免费观看高清完整版在线观看 | 凹凸国产熟女精品视频| 超碰成人在线免费| 欧美精品在线免费播放| 国产又粗又长又大视频| 欧美国产日本视频| 日本美女高潮视频| 精品盗摄女厕tp美女嘘嘘| 2018国产精品视频| 天天舔天天干天天操| 污片在线观看一区二区| youjizz.com国产| 精品福利av| 国产乱码精品一区二区三区不卡| 五月婷婷视频在线观看| 91麻豆精品国产91久久久资源速度| 在线观看免费黄色网址| 美女国产一区二区| 一本一道久久a久久精品综合 | 亚洲一区久久久| 成人在线视频亚洲| 欧美va天堂va视频va在线| 久久久91视频| 成人一区在线看| 黄色美女网站在线观看| 99热这里只有成人精品国产| 都市激情久久久久久久久久久| 秋霞午夜在线观看| 91精品在线免费观看| 波多野结衣爱爱视频| 国产精品影视在线观看| 狠狠精品干练久久久无码中文字幕 | 日韩在线一区视频| 亚洲不卡av不卡一区二区| 成人av电影天堂| 女囚岛在线观看| 精品国产一二三| 全部毛片永久免费看| 久久久久久久久久久黄色| 国产第一页视频| 久久精品国产99久久| 成人免费在线视频网站| 中文字幕伦理免费在线视频 | 91久久久久久| 五月婷婷视频在线观看| 日韩大陆欧美高清视频区| 无码人妻熟妇av又粗又大| 国产精品人成在线观看免费| 日本r级电影在线观看| 亚洲日本国产| 翔田千里亚洲一二三区| 日本在线视频一区二区三区| 98视频在线噜噜噜国产| 69视频在线观看| 精品区一区二区| 波多野结衣高清在线| 亚洲色图在线播放| 中文字幕狠狠干| 久久99精品久久久久久动态图 | 国产伦精品一区二区三区四区视频 | 亚洲女人的天堂| 丝袜熟女一区二区三区| 日本免费新一区视频| 无码人妻精品一区二区蜜桃百度| 日韩三级视频| 91欧美激情另类亚洲| 成人观看网址| 久久精品成人动漫| 女人天堂在线| 精品欧美一区二区三区精品久久 | 另类国产ts人妖高潮视频| 中国成人亚色综合网站| 日韩av网站在线免费观看| 成人黄色av网| 天天综合网天天| 欧美激情一二区| 1区2区3区在线观看| 精品国内二区三区| 中文字幕欧美人妻精品| 精品人伦一区二区三区蜜桃免费| 亚洲熟女毛茸茸| 久久一夜天堂av一区二区三区| 日本成人xxx| 日韩专区一卡二卡| 一女被多男玩喷潮视频| 欧美成人午夜| 中文字幕一区二区三区5566| 免费不卡中文字幕在线| 国产高清在线精品一区二区三区| 欧美日韩卡一| 日韩av色综合| 欧美日韩国产观看视频| 欧美激情一区二区久久久| 色老头视频在线观看| 亚洲日韩中文字幕在线播放| 天堂av一区二区三区| 精品免费国产二区三区| av中文字幕播放| 精品视频一区 二区 三区| 欧美成人一区二区三区四区| 亚洲成人午夜电影| 国产精品99无码一区二区| 亚洲一区二区四区蜜桃| 欧美黄色aaa| 亚洲视频小说图片| 亚洲欧美日韩第一页| 久久久精品日韩欧美| 三叶草欧洲码在线| www.亚洲精品| 日本黄色动态图| caoporn国产精品| 中文字幕人妻一区二区三区| 不卡高清视频专区| 国产二级一片内射视频播放| 高清视频一区二区| 人妻互换一二三区激情视频| 国产精品中文字幕欧美| 欧美熟妇精品一区二区| 国产99久久久国产精品免费看| 香蕉视频xxxx| 粉嫩一区二区三区性色av| 国产精品无码自拍| 成人国产精品免费网站| 亚洲国产精品无码久久久久高潮| 不卡大黄网站免费看| 一级国产黄色片| 久久久精品一品道一区| 欧美熟妇激情一区二区三区| 中文字幕乱码久久午夜不卡 | 亚洲成人激情自拍| 国产又爽又黄的视频| 色综合久久久久综合99| 国产偷人爽久久久久久老妇app | 亚洲第一天堂在线观看| 精品国产乱码久久久久久夜甘婷婷| 亚洲男人天堂久久| 日韩成人网免费视频| 黄色av网址在线免费观看| 中文字幕成人在线| 最新黄网在线观看| 91精品国产高清久久久久久| 伊人久久高清| 亚洲自拍小视频| 精品精品精品| 日产中文字幕在线精品一区 | 99在线免费视频观看| 99在线|亚洲一区二区| 蜜臀视频一区二区三区| 精品在线亚洲视频| av电影在线播放| 久久久久国产精品人| 天天综合天天做| 日韩欧美亚洲成人| 国产又粗又猛又爽又黄的| 欧美xxxxxxxx| 久久经典视频| 色综合久综合久久综合久鬼88| 日韩大片免费观看| 成人在线激情视频| 欧美日韩导航| 中文字幕一区综合| 夜夜爽av福利精品导航| 在线观看岛国av| 99久久综合狠狠综合久久| 国产精品suv一区二区88| 亚洲国产精品一区二区久久| 无码人妻av一区二区三区波多野 | 欧美激情国内自拍| 久久影院视频免费| a级片在线观看免费| 在线精品亚洲一区二区不卡| 精品人妻少妇AV无码专区| 亚洲天堂网在线观看| 秋霞在线午夜| 国产区精品在线观看| 欧美大胆视频| 黄色录像特级片| 日本亚洲视频在线| 催眠调教后宫乱淫校园| 国产精品国产三级国产aⅴ原创| 国产小视频在线免费观看| 7777精品伊人久久久大香线蕉| 日本成人一区二区三区| 欧美多人爱爱视频网站| 久久91视频| 欧美在线视频一区二区三区| 在线国产欧美| xxxxwww一片| 亚洲欧洲另类国产综合| 波多野结衣激情视频| 日韩va亚洲va欧洲va国产| 五月天激情在线| 7777奇米亚洲综合久久| 97欧美在线视频| 999在线免费视频| 久久久精品免费观看| 51国产偷自视频区视频| 亚洲国产日韩欧美在线动漫| 中文字幕伦理免费在线视频| 成人免费网站在线| 欧美电影《轻佻寡妇》| 亚洲精品久久久中文字幕| 国产亚洲综合在线| 日本中文字幕第一页| 亚洲韩国欧洲国产日产av| 黑人极品ⅴideos精品欧美棵| 97在线中文字幕| 欧美久久影院| 少妇极品熟妇人妻无码| 一区二区三区日韩精品视频| 国产成人精品白浆久久69| 久久人人爽人人爽爽久久| 高清不卡一区| 国产精品视频一二三四区| 国产精品小仙女| 国产一级二级毛片| 亚洲精品一区二区三区蜜桃下载| 人人超在线公开视频| 国产精品手机在线| 在线视频精品| 亚洲国产欧美视频| 日本高清无吗v一区| www.亚洲视频| 91久久精品日日躁夜夜躁国产| 68国产成人综合久久精品| 久久综合桃花网| 亚洲自拍偷拍欧美| 欧美视频在线观看一区二区三区| 国内精品久久久久久久| 欧美美女在线直播| 精品视频无码一区二区三区| 国产精品美女久久久久久久久| 在线免费一级片| 久久的精品视频| 国产成人夜色高潮福利影视| 男人添女人下面高潮视频| 国产婷婷色一区二区三区| 男操女视频网站| 久久夜色精品国产欧美乱| 国产成人在线中文字幕| 免费看的黄色大片| 欧美激情一区二区三区| 91亚洲视频在线观看| 欧美激情va永久在线播放| 日韩有码中文字幕在线| www.com黄色片| 伊人夜夜躁av伊人久久| 婷婷丁香花五月天| 国产欧美 在线欧美| 欧美精品啪啪| 亚洲国产欧美视频| 欧美精品丝袜久久久中文字幕| 蜜桃成人365av| 欧美一区三区二区在线观看| 国内精品久久久久影院色| 日本三级午夜理伦三级三| 中日韩美女免费视频网站在线观看| 久久中文字幕一区二区| 久久久噜噜噜www成人网| 中文欧美字幕免费| 日本精品久久久久久| 国产欧美精品在线| 亚洲毛片在线| 99久久久免费精品| 国产偷亚洲偷欧美偷精品| 中文字幕成人| 97在线播放视频| 一区二区三区高清| 成人精品福利| 精品免费国产| 国产成人免费视频|