如何避免前端轮询太频繁对服务器造成压力

发布于 2022-08-31 20:59:13 字数 122 浏览 11 评论 0

一个微信小游戏,要定时根据后台的状态做出反应,对实时性有一定要求。
现在是每秒都会发送一个ajax请求根据返回值来看状态是否改变,但是怕这样使用的人多了以后对服务器造成压力~
不知道大家有什么好的解决方法没有~

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

甜点 2022-09-07 20:59:13

既然是微信,最佳的是做socket连接,不过需要你们服务端改造下,这样前端比较省心,服务端推送就好了

其次的方案是参考comet模式,发一个ajax请求出去后,服务器如果没有新消息,不要反回,hold住这个连接,直到有数据;

前端要做三个事情:
第一个事情是由于http是短连接,一般浏览器都会设置一个超时时间,所以前端这个连接如果超过一定时间没有返回,需要abort掉,重新发起,推荐30秒;
第二个事情是每次服务器有数据返回后,这个请求就结束了,你需要发起一个新的请求做监听;
第三个事情是多页面请求冲突问题,比较麻烦,不过如果你们是小游戏,应该是单页面应用就不用处理了,一般多页面应用或者WEB网站这类的,是通过localstorage来共享信息避免重发请求,也可以关掉前一个请求,在当前页面重新发起一个请求

不管哪种方案都要服务器端做改造,这不仅仅是前端自己的事,因为如果每一个连接都开一个线程,很快就会内存不够挂掉的。

深白境迁sunset 2022-09-07 20:59:13

后端加缓存

  1. 加一层Redis或者Memcache做缓存,缓解对后端特别是数据库的压力,当然也要控制好缓存的过期

前后端结合

  1. 根据在线人数和服务器系统负载动态确定轮训的初始间隔,接着利用类似于拥塞控制的算法让每次轮训间隔可变
  2. 使用Comet,Metor,Socket.io这样的中间件,配合AJAX或者WebSocket,实现PUB/SUB模式

纯前端方案

  1. 选择一款合适的支持实时推送的BaaS(后端即服务),我自己用过Firebase,类似还有若干
王权女流氓 2022-09-07 20:59:13

状态改变由服务端主动推

愁杀 2022-09-07 20:59:13

用NodeJS的socket.IO模块

能否归途做我良人 2022-09-07 20:59:13

"websocket,轮询,长连接"三选一

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文