Web services 如何使用FastAPI作为RabbitMQ(RPC)的使用者

Web services 如何使用FastAPI作为RabbitMQ(RPC)的使用者,web-services,flask,rabbitmq,fastapi,pika,Web Services,Flask,Rabbitmq,Fastapi,Pika,该示例演示了如何使用远程过程调用(RPC)在python中创建客户机和服务器 但我无法想象FastAPI服务如何成为使用pika for RabbitMQ从RCP客户端消费请求的服务器 任何web服务都将通过显式调用来请求,然而,我无法想象如何将RabbitMQ消费者集成到web服务中 另一方面,对于客户端来说,这很容易做到,通过显式调用web服务,您可以发布队列的请求 需要帮忙吗?还是一个好的开始?今天(4月28日),Andrej Baranovskij在youtube上发布了一个很棒的教程,

该示例演示了如何使用远程过程调用(RPC)在python中创建客户机和服务器

但我无法想象FastAPI服务如何成为使用pika for RabbitMQ从RCP客户端消费请求的服务器

任何web服务都将通过显式调用来请求,然而,我无法想象如何将RabbitMQ消费者集成到web服务中

另一方面,对于客户端来说,这很容易做到,通过显式调用web服务,您可以发布队列的请求


需要帮忙吗?还是一个好的开始?

今天(4月28日),Andrej Baranovskij在youtube上发布了一个很棒的教程,介绍了这一点

我将提供下面的链接。您还可以检查github源代码


您可以将
aio_pika
与pattern一起使用,并执行以下操作:

服务1(消耗)

在循环中消费:

#app/uuu init.py
从fastapi导入fastapi
从app.rpc导入
app=FastAPI()
...
@应用程序启动事件(“启动”)
def startup():
loop=asyncio.get\u event\u loop()
#使用相同的循环来消费
异步。确保未来(消耗(循环))
...
创建要从另一个服务调用的连接、通道和注册远程方法:

#app/rpc.py
从aio_pika导入连接_
从aio_pika.patterns导入RPC
从app.config导入配置
__全部[
“消费”
]
def remote_方法():
#做点什么
#将此方法与其他方法一起移动到另一个位置,例如app/rpc_方法
#我把它放在这里是为了简单
返回“它有效!”
异步def消耗(循环):
连接=等待连接\u健壮(config.AMQP\u URI,loop=loop)
通道=等待连接。通道()
rpc=等待rpc.create(通道)
#注册远程方法
等待rpc.register('remote\u method',remote\u method,auto\u delete=True)
回路连接
这就是您需要使用和响应的全部内容,现在让我们看看调用此远程方法的第二个服务

服务2(调用远程方法)

让我们首先创建RPC中间件,以便轻松管理和访问RPC对象,从API函数调用远程方法:

#app/utils/rpc#u.py
导入异步
来自fastapi导入请求、响应
从aio_pika导入连接_
从aio_pika.patterns导入RPC
从app.config导入配置
__全部[
“get_rpc”,
“rpc_中间件”
]
异步def rpc_中间件(请求:请求,下一步调用):
响应=响应(“内部服务器错误”,状态代码=500)
尝试:
#还可以将循环作为参数传递。为了简单起见,现在就把它放在这里
loop=asyncio.get\u event\u loop()
连接=等待连接\u健壮(config.AMQP\u URI,loop=loop)
通道=等待连接。通道()
request.state.rpc=等待rpc.create(通道)
响应=等待呼叫\u下一步(请求)
最后:
#UPD:我想我们可能想排队,但不想
#为每个请求重新创建它,以便我们可以删除此行并移动
#中间件的连接、通道和rpc初始化
#并在应用程序启动时执行一次
#也基于此:https://github.com/encode/starlette/issues/1029
#最好创建ASGI中间件,而不是HTTP
wait request.state.rpc.close()
返回响应
#在路由函数中使用rpc的依赖项
def get_rpc(请求:请求):
rpc=request.state.rpc
返回rpc
应用RPC中间件:

#app/uuu init.py
从app.utils导入rpc\u中间件
...
应用中间件(“http”)(rpc_中间件)
...
通过API函数中的依赖项使用RPC对象:

#app/api/whatever.py
从aio_pika.patterns导入RPC
从app.utils导入获取\u rpc
...
@router.get('/rpc')
异步def rpc_测试(rpc:rpc=Depends(get_rpc)):
response=wait rpc.proxy.remote_method()
...
添加一些日志以跟踪两个服务中发生的情况。您还可以将两个服务中的RPC逻辑组合为一个,以便能够使用和调用来自同一服务中的远程方法


希望这有助于了解基本概念。

我不确定您的应用程序将走向何方。IMHO API端点是“被动”应用程序,它等待请求并向客户机提供答案,而队列/流消费者通常是不同的用例,总是侦听消息,然后在不“回复”的情况下处理数据。我不是说这两件事不能同时进行,但是如果没有关于你目标的更多细节,我发现很难完全理解如何回答。