【发布时间】:2017-05-29 06:32:45
【问题描述】:
我们正在使用 aiohttp 构建一个 rest api。我们的应用程序旨在让用户发送请求比接收响应更频繁(因为计算时间)。对于用户而言,仅最新请求的结果很重要。是否可以停止对过期请求的计算?
谢谢
【问题讨论】:
-
这违反了 HTTP 的核心原则之一。如果您想将该服务扩展到负载均衡器后面的多个服务器怎么办?然后它会变得非常棘手,取消其他服务器可能正在处理的请求。这可能不是您应该尝试解决的实际问题!
-
“取消”到底是什么意思?服务器断开连接?
-
重写后:这是否意味着一个 HTTP 请求可能需要几分钟 (?) 才能完成?这也是糟糕的 HTTP 设计;一个请求最多应在几秒钟内得到答复,典型的基线目标是 200 毫秒。如果您需要运行更长时间的作业,请将其视为作业:一个 HTTP 请求启动一个后台任务并返回任务 ID。然后,客户端可以使用另一个 HTTP 请求查询作业状态。例如。
POST /tasks { params },GET /tasks/42。显然,此类后台任务可以通过任何在您的后端有意义的机制来取消。 -
我们现在的目标是 5-10 秒。
-
对于 HTTP 请求来说太长了。根据
POST /tasks接受一个新的“作业请求”,启动一个独立于 Web 服务器的后台任务,返回一个新的资源 ID。让客户端查询新资源的结果/状态 (GET /tasks/42)。如果有新任务取代任务,则取消任务;客户端可以知道这种隐式取消,不再需要查询旧资源。
标签: python http nginx python-asyncio aiohttp