簡體   English   中英

RabbitMQ、Flask/fastapi 和 websockets

[英]RabbitMQ, Flask/fastapi and websockets

我的系統架構看起來與此處問題中發布的圖非常相似。 我的實現和發布的問題之間的主要區別在於,我將使用 fastapi/flask 作為網絡服務器(在 python 中)和rabbitmq 進行消息傳遞。

我的高級偽代碼(使用 fastAPI)如下:

from fastapi import APIRouter
from starlette.responses import Response
router = APIRouter()

@router.post("/users/{message}")
async def provide_suggestions(message: str, response: Response):
    uuid = generate_uuid(message)
    message_dict = {"uuid": uuid, "data": message}.
    result = await post_message_to_rabbit_mq(message_dict)
    response.status_code = SOME_VALID_HTTP_RESPONSE_CODE # what would this be?

問題 1:HTTP 響應代碼是什么? 基本上,Web 服務器需要通知客戶端在一段時間后返回並檢查結果(然后返回建議)。

一旦 Web 服務器通過 rabbitmq 發布消息,工作人員將根據消息生成相關建議(通過查找數據庫)。 此消息與 uuid 將在另一個 rabbitmq 消息隊列中回發。 現在 Web 服務器變成了消費者。

問題2:假設網絡服務器在出口路徑上注冊為消息隊列的消費者,網絡服務器是否會在消息隊列的單獨線程上獲取數據?

問題 3:客戶端和服務器是否可以通過web-sockets異步通信,而不是等待來自客戶端的另一個 HTTP 請求發送建議?

回答您的問題:

1:根據REST 標准,狀態碼202似乎在這里執行:

HTTP 狀態 202 表示已接受請求進行處理,但處理尚未完成。 當實際操作本質上是異步的時,此狀態代碼很有用。

2:您希望服務中的不同進程從隊列中使用並更新本地服務器數據庫。 這通常不是您的 fastapi 網絡服務器的一部分,而是一個單獨的過程。 然后,您的 fastapi 網絡服務器可以經常查詢本地數據庫,或者您可以在網絡服務器上有一個單獨的端點,以便在數據庫更新時可以由該進程調用。

3:如果您有可以處理 websocket 連接的客戶端實用程序,那么可以。 這里查看 fastapi 的文檔。 否則最好在第一次請求時返回狀態代碼 202 並讓客戶端每隔幾秒鍾查詢一次網絡服務器。 另一種選擇是使用回調 url,但這取決於客戶端的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM