【问题标题】:如何处理高响应时间
【发布时间】:2022-01-01 22:51:53
【问题描述】:

有两种不同的服务。一个服务 -Django 正在从前端获取请求,然后在另一个服务 -Flask 中调用 API。

但是 Flask 服务的响应时间很长,如果用户导航到另一个页面,该请求将被取消。

应该是后台任务还是发布/订阅模式?如果是这样,如何在后台执行,然后告诉用户这里是你的最后一个结果?

【问题讨论】:

    标签: python django google-cloud-pubsub


    【解决方案1】:

    您有两个可能的主要选择:

    • 向 Django 的“简单”视图发出初始请求,该视图加载带有微调器的框架 HTML 页面,其中一些 JS 将触发对第二个 Django 视图的 XHR 请求,该第二个 Django 视图将包含其他服务 (Flask) 调用。因此,您甚至可以正确提醒您的用户加载需要时间并处理浏览器端的退出(在离开/中止请求之前询问确认...)

    • 如果可能,缓存 Flask 服务的结果,这样就不需要在每次页面加载时调用它。

    您可以通过在异步请求中调用服务并缓存其结果来组合这两种解决方案(例如,根据上下文,您可能需要根据连接的用户自定义缓存)。 第一个解决方案可以使用 pub/sub、websockets 等来拒绝,但经典的 XHR 似乎适合您的情况。

    【讨论】:

      【解决方案2】:

      在我们的项目中,我们有几个耗时的端点。我们的解决方案类似于之前的答案: 一旦我们收到一个请求,我们就会调用一个 Celery 任务,该任务在异步模式下完成其昂贵的工作。我们不等待其结果,而是向用户返回快速响应。 Celery 任务通过 WebSockets 将其进度/结果发送给用户。前端处理此 WS 消息。这种方法的好处是我们不会花费后端的 CPU。我们花费在另一台机器上运行的 Celery worker 的 CPU。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        • 2023-03-20
        • 1970-01-01
        • 2018-01-30
        • 2019-05-01
        • 2020-10-16
        相关资源
        最近更新 更多