使用 ajax 轮询缓解繁重的 django 石墨烯请求
Posted
技术标签:
【中文标题】使用 ajax 轮询缓解繁重的 django 石墨烯请求【英文标题】:Mitigate heavy django graphene request with ajax polling 【发布时间】:2021-04-06 16:32:09 【问题描述】:我有一些查询会导致超时。因为在某些非常特殊的边缘情况下,数据的计算在服务器上花费的时间太长。我的特定堆栈的最佳解决方案是什么?我正在考虑每 20 秒左右轮询一次服务器,以查看我的数据是否准备就绪。但我不确定如何做到这一点。或者如何跟踪我当前正在处理的请求是哪个客户端发出的。
我的堆栈:
Graphene Django Apollo【问题讨论】:
【参考方案1】:由于您使用的是 Django,您可以轻松地使用 Django Channel 在 Django 中启用 websocket。
使用 websocket,您可以在数据准备好时从服务器向发出请求的客户端发送异步通知,这样您就不需要每秒轮询一次。
在该链接中有创建双向通信的所有信息。本教程适用于聊天系统,但您可以轻松适应您的需求
【讨论】:
我已经想到了。我将 Apollo 用于我的前端,并且基于他们的 docs 似乎说订阅(websockets)并不真正适合这个用例。我也想远离 websockets,因为这个请求适用于 +95% 的用例。我只是想避免在没有超时的情况下超时。【参考方案2】:你有选择。 一个是 Apollo 重试链接,您可以按如下方式使用它
const myLink = new RetryLink(
delay:
initial: 300,
max: Infinity,
jitter: true
,
attempts:
max: 5,
retryIf: (error, _operation) => !!error
);
我认为这是最省事的方法。 Retry Link Doc
第二个选项是使用订阅而不是查询。订阅是客户端和服务器之间的开放链接,通常用于聊天应用程序或任何实时需要的东西,因此您可以使用它,客户端将在服务器完成计算后得到响应。 您必须在 client side 和 server side 上做一些工作才能使其正常工作。
【讨论】:
我认为 Retry 会在每次发出请求时重新启动我的后端进程,对吗?因此,如果我有一个持续超时的呼叫。不会只是重试只会导致另一个超时。值得注意的是,我目前没有实现任何缓存机制。对于订阅,我也想远离 websocket,因为这个请求适用于 +95% 的用例。我只是想避免在没有超时的情况下超时。以上是关于使用 ajax 轮询缓解繁重的 django 石墨烯请求的主要内容,如果未能解决你的问题,请参考以下文章