使用 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 石墨烯请求的主要内容,如果未能解决你的问题,请参考以下文章

求教,django与长轮询,该怎么解决

AJAX成功的Django渲染模板

如何异步运行长时间运行的操作并在 ASP.Net Ajax 中为用户显示加载并轮询结果?

Django 会话不是使用 JWT 和石墨烯生成的

Django 石墨烯中继限制对用户拥有的对象的查询

如何使用石墨烯-django 对多个字段中的图标使用 OR 条件