1

我的系统架构看起来与此处问题中发布的图非常相似。我的实现和发布的问题之间的主要区别在于,我将使用 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 发布消息,worker 将根据消息生成相关建议(通过查找数据库)。该消息连同 uuid 将被发送回另一个 rabbitmq 消息队列。现在 Web 服务器成为消费者。

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

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

4

1 回答 1

0

要回答您的问题:

1:根据REST 标准,状态码202似乎在这里:

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

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

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

于 2020-02-28T22:04:27.910 回答