【问题标题】:RabbitMQ, Flask/fastapi and websocketsRabbitMQ、Flask/fastapi 和 websockets
【发布时间】:2020-01-17 07:27:34
【问题描述】:

我的系统架构看起来与问题here 中发布的图非常相似。我的实现和发布的问题之间的主要区别在于,我将使用 fastapi/flask 作为 web 服务器(在 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服务器需要在一定时间后通知客户端返回并检查结果(然后返回建议)。

一旦网络服务器通过rabbitmq 发布消息,工作人员将根据消息生成相关建议(通过查找数据库)。该消息连同 uuid 将被发送回另一个 rabbitmq 消息队列。现在网络服务器变成了消费者。

问题 2:假设网络服务器注册为出口路径上消息队列的消费者,网络服务器是否会在消息队列的单独线程上获取数据?

问题3:客户端和服务器可以通过web-sockets异步通信,而不是等待客户端的另一个HTTP请求发送建议?

【问题讨论】:

    标签: python flask websocket rabbitmq fastapi


    【解决方案1】:

    回答您的问题:

    1:根据REST standards,状态码202好像是在这里做的:

    HTTP 状态 202 表示请求已被接受 处理,但处理尚未完成。这种状态 当实际操作本质上是异步时,代码很有用。

    2:您可能希望服务中的不同进程从队列中消费并更新本地服务器数据库。这通常不是您的 fastapi 网络服务器的一部分,而是一个单独的过程。然后,您的 fastapi 网络服务器可以经常查询本地数据库,或者您可以在网络服务器上有一个单独的端点,而不是在数据库更新时由该进程调用。

    3:如果您有可以处理 websocket 连接的客户端实用程序,那么可以。请参阅有关它的 fastapi 文档here。否则,最好在第一次请求时返回状态代码 202 并让客户端每隔几秒查询一次网络服务器。另一种选择是使用回调 url,但这取决于客户端的情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-08
      • 2014-02-14
      • 1970-01-01
      • 2021-03-29
      • 2019-09-30
      • 2022-10-03
      • 1970-01-01
      • 2022-08-08
      相关资源
      最近更新 更多