繁体   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