【问题标题】:How can I have multiple Azure user info on a single server?如何在单个服务器上拥有多个 Azure 用户信息?
【发布时间】:2021-09-14 13:51:06
【问题描述】:

我正在开发一个 API,当用户通过 azure-cli 登录到 azure 时调用订阅和租户信息。

当用户登录CSP(内部使用az login --use-device-code进行CSP登录)时,用户会收到urlhttps://microsoft.com/devicelogin和一个密码。

完成这个过程之后,用户的登录信息就留在了我们的主服务器上,用户的订阅和租户信息就可以通过这个调用了。

在单个用户的情况下,这个过程完全没有问题。但是,当多个用户同时发出请求时,只会调用最后一个请求的用户的信息。

另外,另一个问题是主服务器的进程被阻塞,直到通过 azure-cli 请求该进程完成。

当多个用户请求CSP登录时,在不阻塞主服务器、不覆盖用户信息的情况下,如何正常运行?

供参考,主服务器为FastAPI。

【问题讨论】:

  • 嘿,你为什么不也粘贴一些代码。您如何配置端点以及存储用户租户信息的变量似乎存在问题。

标签: multithreading azure async-await parallel-processing azure-cli


【解决方案1】:

根据您的解释,您似乎有一个快速的 api 服务器,它公开了一个用户用于登录的 api。来自 api 的响应将是设备登录 url 和客户端使用的设备代码。所有后续调用都将使用此信息完成。

所以现在第一个问题是主线程问题,在这个过程完成之前,api 不应该被阻塞。

为此,您需要有异步 api,它执行后台作业并在任务完成时通知用户,或者用户可以定期请求信息,直到作业状态发生变化。

这意味着我们需要修改我们的 fastapi 服务器,使其能够执行多线程、队列任务并具有一些查找缓存。

我建议的最佳方法是使用带有以下库的 fastapi 堆栈:

  • Celery - 一个异步任务管理器,可让您运行和管理队列中的作业。
  • RabbitMQ - 用于在任务工作者和 Celery 之间进行通信的消息代理
  • Redis - 用于存储和检索值的内存缓存(键值存储)。

您可以使用相同的 Redis 缓存来解决您的第二个问题,也可以在需要存储和使用多个会话信息而不被覆盖的地方。这将帮助您处理多个会话信息或多个用户信息。

请查看下面来自 github 的一些示例项目:

jjpizarro/fastapi-celery-1

CloudNua/fastapi-celery

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多