異步方案Celery
生產者消費者設計模式
問題:
我們的代碼是自上而下同步執行的。
發送短信是耗時的操作。如果短信被阻塞住,用戶響應將會延遲。
響應延遲會造成用戶界面的倒計時延遲。
解決:
異步發送短信
發送短信和響應分開執行,將發送短信從主業務中解耦出來。
生產者消費者設計模式介紹
為了將發送短信從主業務中解耦出來,我們引入生產者消費者設計模式。
它是最常用的解耦方式之一,尋找中間人(broker)搭橋,保證兩個業務沒有直接關聯。
總結:
生產者生成消息,緩存到消息隊列中,消費者讀取消息隊列中的消息并執行。
由商城生成發送短信消息,緩存到消息隊列中,消費者讀取消息隊列中的發送短信消息并執行。
Celery介紹和使用
消費者取到消息之后,要消費掉(執行任務),需要我們去實現。
任務可能出現高并發的情況,需要補充多任務的方式執行。
耗時任務很多種,每種耗時任務編寫的生產者和消費者代碼有重復。
取到的消息什么時候執行,以什么樣的方式執行。
結論:
實際開發中,我們可以借助成熟的工具Celery來完成。
有了Celery,我們在使用生產者消費者模式時,只需要關注任務本身,極大的簡化了程序員的開發流程。
Celery介紹
Celery
。介紹一個簡單、靈活且可靠、處理大量消息的分布式系統,可以在一臺或者多臺機器上運行。
。單個 Celery 進程每分鐘可處理數以百萬計的任務。
。通過消息進行通信,使用消息隊列(broker)在客戶端和消費者之間進行協調。
安裝Celery
1 $ pip install Celery
創建Celery實例并加載配置
celery_tasks.main.py
1 # celery啟動文件
2 from celery import Celery
3 # 創建celery實例
4 celery_app=Celery('home')
加載Celery配置
celery_tasks.config.py
1 # 指定消息隊列的位置
2 broker_url="redis://127.0.0.1/10"
celery_tasks.main.py
1 # celery啟動文件
2 from celery import Celery
3 # 創建celery實例
4 celery_app=Celery('home')
5 # 加載celery配置
6 celery_app.config_from_object('celery_tasks.config')
定義發送短信任務
注冊任務:celery_tasks.main.py
1 # celery啟動文件
2 from celery import Celery
3 # 創建celery實例
4 celery_app=Celery('home')
5 # 加載celery配置
6 celery_app.config_from_object('celery_tasks.config')
7 # 自動注冊celery任務
8 celery_app.autodiscover_tasks(['celery_tasks.sms'])
定義任務:celery_tasks.sms.tasks.py
1 @celery_app.task
2 def send_sms(to,datas,temp_id):
3? ? ? ?"""發送短信的異步任務"""
4? ? ? ?ccp = CCP()
5? ? ? ?try:
6? ? ? ? ? ? ?result=ccp.send_message(to,datas,temp_id)
7? ? ? ?except Exception as e:
8? ? ? ? ? ? ?result=-2
9? ? ? ? return result
啟動Celery服務
1 celery -A home.tasks.task_sms worker -l info
-A指對應的應用程序, 其參數是項目中 Celery實例的位置。
worker指這里要啟動的worker。
-l指日志等級,比如info等級。
調用發送短信任務
1# Celery異步發送短信驗證碼
2send_sms.delay(mobile, [sms_code,int(constants.SMS_CODE_REDIS_EXPIRES/60)]
用戶登錄
賬號登錄
用戶名登錄邏輯分析
用戶名登錄接口設計
用戶名登錄接口定義
1 @api.route("/sessions", methods=["POST"])
2 def login():
3? ? ? ? """用戶登錄
4? ? ? ? 參數: 手機號、密碼, json
5? ? ? ? """
用戶名登錄后端邏輯
1 @api.route("/sessions", methods=["POST"])
2 def login():
3? ? ? ? """用戶登錄
4? ? ? ? 參數: 手機號、密碼, json
5? ? ? ? """
6? ? ? ? # 獲取參數
7? ? ? ? # 校驗參數
8? ? ? ? # 手機號的格式
9? ? ? ? # 從數據庫中根據手機號查詢用戶的數據對象
10? ? ? ?# 用數據庫的密碼與用戶填寫的密碼進行對比驗證
11? ? ? ? # 如果驗證相同成功,保存登錄狀態, 在session中
2020-11-26