RabbitMQ、Flask/fastapi和websockets

2024-04-25 13:51:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我的系统架构看起来与问题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服务器需要通知客户端在一段时间后返回并检查结果(然后返回建议)

一旦web服务器通过rabbitmq发布消息,工作人员将根据消息生成相关建议(通过查找数据库)。此消息和uuid将被发回另一个rabbitmq消息队列。现在,web服务器成为消费者

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

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


Tags: 代码fromimport服务器webhttp消息客户端
1条回答
网友
1楼 · 发布于 2024-04-25 13:51:09

回答您的问题:

1:根据REST standards,状态代码202似乎在这里这样做:

HTTP Status 202 indicates that request has been accepted for processing, but the processing has not been completed. This status code is useful when the actual operation is asynchronous in nature.

2:您可能希望服务中的另一个进程从队列中使用并更新本地服务器数据库。这通常不是fastapi Web服务器的一部分,而是一个单独的过程。然后,您的fastapi Web服务器可以每隔一段时间查询一次本地数据库,或者您可以在Web服务器上有一个单独的端点,当数据库更新时,此进程可以调用该端点

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

相关问题 更多 >