万万没想到,一个不起眼的小功能,差点把我们项目搞崩溃!

news2024/11/15 12:10:41

大家好,我是程序员鱼皮。今天分享一个真实项目开发的小故事。

故事

最近我们团队一直在持续更新编程导航网站,优化了界面,也新增了不少功能。现在网站长下面这样,是不是看着比以前舒服多了?

编程导航:https://code-nav.cn

当然,项目更新就意味着引入了新的 Bug。万万没想到,前两天我们优化了一个不起眼的小功能,差点把我们的项目搞崩溃了!

就是右上角这个看起来毫不起眼的消息通知小图标,以前我们只在用户刷新进入页面时会查询一次当前用户的未读消息数,后来为了提升用户体验,我们更改了下获取消息的逻辑,改为每隔 10 秒定时查询更新,让用户能够及时获取到最新的消息。

这种操作俗称 “轮询请求”,也是前端实时获取后端数据变化的一种方法。但是有经验的朋友,能不能想到我们这么修改后可能会出现什么问题?

起初我也没在意,结果前几天看我们后端监控的时候,发现了一个反常的现象。

哝,下面这个,是我们系统接口的调用量分布图:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

让我觉得反常的点在于:为什么凌晨两点多,还能有这么多调用量?说实在的,我不相信大半夜这么多人还在偷偷卷。

其实我本能地联想到,应该是获取未读消息的轮询接口,在一直被调用。让团队的同学查日志确认后,果不其然凶手就是它!

原因也很简单,一旦用户打开了网页,哪怕之后去睡觉了,只要网页不关闭,照样会定时发送轮询请求。像我这种习惯开一堆网页又几乎不关电脑的朋友,应该还是挺多的,一个人就有可能 “贡献” 一大堆请求。要不是我对目前的用户量心里有点 btree,还真特么以为用户增长爆了呢!

解决问题

那么如何解决这个问题呢?

1、调整时间间隔

首先最简单的方法,就是延长轮询的时间间隔,比如将 10 秒延长到 20 秒、30 秒等等。

可以参考别家的网站,时间间隔设置长一点完全没有问题。

2、页面活跃状态监控

在用户离开页面时停止轮询请求,用户返回页面时重新开始轮询,这样就不会出现请求浪费的情况。

利用浏览器提供的 visibilitychange 事件就可以实现了,非常简单:

document.addEventListener('visibilitychange', function() {
  if (document.visibilityState === 'hidden') {
    console.log('用户离开当前页面');
    // 用户离开页面时的处理逻辑
  } else if (document.visibilityState === 'visible') {
    console.log('用户回到当前页面');
    // 用户返回页面时的处理逻辑
  }
});

回归到我们的项目,用户离开页面时移除轮询请求的定时执行器(setInterval),进入页面时再重新启动定时执行器即可。

但是,仅通过这个事件判断用户是否活跃还不够。如果用户不是直接切换浏览器当前窗口的 tab 页,而是新打开了一个窗口,也不会触发上述事件。我们还可以监听窗口失焦事件,判断用户是否切换了窗口。示例代码如下:

function handleWindowBlur() {
  console.log('用户离开当前窗口');
  // 用户离开窗口时的处理逻辑
}

function handleWindowFocus() {
  console.log('用户回到当前窗口');
  // 用户回到窗口时的处理逻辑
}

// 添加事件监听器
window.addEventListener('blur', handleWindowBlur);
window.addEventListener('focus', handleWindowFocus);

但是,仅通过这些事件判断用户是否活跃还不够!用户还可以挂在页面内不做任何动作,所以我们还要对一些鼠标、键盘事件进行监听,指定时间内没有触发这些事件,就标记为不活跃。

const ACTIVE_ACTIONS = [
  'mousemove', // 鼠标移动
  'mousedown', // 鼠标按下
  'touchstart', // 触摸屏幕【移动端】
  'wheel', // 鼠标滚轮
  'keydown', // 键盘输入
];

// 批量添加事件监听
ACTIVE_ACTIONS.map((event) => window.addEventListener(event, onActive));

有些视频网站就是这么干的,用户如果切换窗口,就把视频暂停,不要浪费流量。

对了,有个重要事项,给页面绑定事件后,在页面销毁或切换路由时,记得删除已绑定的事件!

3、精简接口数据

保证轮询接口返回数据的精简非常重要。

很多经验不足的同学容易出现的问题是,在后端直接通过 select 把所有数据和字段查出来返回给前端,一把梭。这其实会产生性能的浪费,比如博客系统的列表页,其实不用返回每篇博客完整的文章内容,有个标题、描述等信息就够了。对于轮询接口,就更要注意这点,比如我们要获取未读消息,不是一次性把所有未读消息列表返回给前端,而是只需要返回未读消息数即可,需要拉取未读消息列表时,再进行获取。可以大大节约带宽占用和流量。

4、其他技术实现

还有其他的方案,就是干脆不用轮询技术,改为使用 SSE 或者 WebSocket 之类的实时通讯技术,前端和服务器建立一个长连接,由服务器定时推送数据给前端,而不是前端主动请求。

随着 AI 的发展,SSE 技术也被带火了,很适合 AI 生成内容的场景,我最新带大家做的 AI 答题应用平台,就用到了 AI + SSE 来自动生成题目。代码开源:https://github.com/liyupi/yudada

但我们并没有选择使用这些技术,反而一定程度上增加了开发成本和系统复杂度,通过前 3 种方案就可以解决问题啦~


可访问我的 Github:https://github.com/liyupi ,了解更多技术和项目内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1813127.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

萌啦OZON数据分析工具:OZON电商卖家的得力助手

在当下电商领域,数据分析的重要性不言而喻。对于在OZON这一俄罗斯电商平台上耕耘的卖家而言,拥有一款高效、准确的数据分析工具,无疑是提升销售业绩、优化运营策略的关键。今天,我们就来聊聊“萌啦OZON数据分析工具”,…

模型的手工下载技巧-代码自动批量下载模型文件

之前分享过通过镜像网站手工下载模型文件的技巧(见这里模型的手工下载技巧-镜像网站的使用)。但有的时候,模型文件数量较多,一个个​手工下载非常不便。比如著名的“麦橘写实”模型。 有没有什么好办法可以把整个目录都下载下来呢…

泰国街头狂潮肖战王一博魅力引爆

泰国街头狂潮!肖战王一博魅力引爆,中国明星影响力横扫东南亚!当《怦然心动20岁》的镜头转向泰国的繁华街头,一场意想不到的明星风暴正在悄然酝酿。在这场青春的盛宴中,嘉宾们随机采访路人,试图探寻泰国人民…

rospkg.os_detect.OsNotDetected检测不到系统的解决办法

遇到上述报错时,可以参考博客进行解决

美容美发门店SaaS收银系统源码分享、连锁美业拓客系统预约系统源码

美业收银管理系统对于美容、美发、医美行业的门店来说至关重要,它不仅可以帮助提高管理效率和降低成本,还可以改善客户体验并促进业务增长。 (私信获取更多方案/演示视频) 以下是美业系统的一些作用和重要性: 1. 记录…

两台电脑之间如何互传文件?快学起来

电脑已经是现代社会不可或缺的综合性办公设备,无论是在学习还是工作中,我们很多时候都需要在两台电脑之间互传文件,以便实现文件共享和共同协作。 两台电脑之间如何互传文件?本文将探讨两台电脑互传文件的意义、方法和注意事项。…

远程医疗平台如何连接医生和患者?

远程医疗平台,以其创新的信息技术手段,构筑了一个无视地理界限的医疗服务新体系,实现了医患之间的实时互动和诊疗服务。例如欣九康诊疗系统,通过一系列功能模块,有效连接了医生与患者,为两者提供了一个全面…

2024/6/11随笔

端午买了很多地毯和一些氛围灯,地毯拼夕夕也好贵。地毯折合的一块70*70的8块钱了。。。真是造孽啊,看今天朋友圈怎么都去旅游了呢?不行,明年我也想去旅游了,先去广州再西安,然后再去上海。剩下的就随便去哪…

UML精简概述

UML精简概述 UML精简概述 UML精简概述UML的定义常见的关系 在学习设计模式之前,需要掌握一些预备知识,主要包括UML类图和面向对象设计原则,它们是“基础内功”,将为后续的“深入修行”奠定基础。UML类图可用于描述每一个设计模式的…

web网页测试bug定位详细步骤

前言 1、前置条件 1)需要的知识 熟透系统业务、团队成员情况; 熟悉使用F12或抓包工具; 了解HTTP/HTTPS协议; 了解系统的架构,数据走向; 2)定位前的操作 保存bug产生的记录; 排除…

videoJS 视频 + 独一无二皮肤 + mp4/m3u8

推荐和参考文章: video.js调用-腾讯云开发者社区-腾讯云> 一、总结(点击显示或隐藏总结内容)一句话总结:网上有各种细致的现成的代码可以拿来用,没必要自己死专1、video.js有两种初始化方式?一种是在v…

生成式AI时代已来,你是否做好了准备?

面对正在来临的生成式AI时代,从个人到企业,都应该为之做好充足的准备。 生成式AI时代的黎明已经来临 “生成式AI时代的黎明已经来临,它将会改变我们每个人的生活和工作方式、改变每一个行业。”在近日召开的2024亚马逊云科技中国峰会上&#…

第5章:模型预测控制(MPC)

5.1 模型预测控制(Model Predictive Controller -- MPC) 注:MPC 更像是一种控制策略的框架,它使用了最优的控制思想在里面,如下的几种控制策略其实都是 MPC 的变体; MHC(Moving Horizon Contr…

ARM32开发--PWM通道输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 文章目录 前言 内容 需求 通用定时器多通道 开发流程 多通道配置 占空比更新 完整代码 高级定时器通道输出 开发流程 通道配置 Break配置 完整代码 总结 前言 加强掌握…

专属部署简介

什么是专属部署 专属部署(也称为专用部署)是一种部署选择,它允许用户将数据和应用部署到自己的专用云基础架构中,而不是与其他租户共享基础架构。这种部署方式可以提供更高的安全性、控制力和性能优化,因为用户可以完全控制和管理自己的基础设…

IT人的拖延——让“优先队列”带你走出“频繁切换”的拖延

在快节奏的IT行业,我们经常会面临多任务并行的挑战,经常这个事情还没做,那个事情就找上门,然后放下手中的活,去干另一件事。我们的工作环境多半是开放的环境,频繁的任务切换不仅降低了工作效率,…

2024/06/11--代码随想录算法1/17|理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 动态规划:当前状态由前面的状态推导而来 贪心:局部选最优 动态规划5步曲 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 力扣链接 动态规划5步曲 确定d…

【机器学习】让计算机变得更加智能

Hi~!这里是奋斗的小羊,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 💥💥个人主页:奋斗的小羊 💥💥所属专栏:C语言 目录 机器学习:让计算机…

[linux] 上手新ubuntu机器的初始化工作(自用侵删)

文章目录 环境类Vimzshother 应用类Typora激活环境准备解包替换文件app.asar激活Typora VsCodeextension.vscode乱码 WattToolkitQQWPS输入法:FcitxDeepin-wine : Wechat 环境类 Vim 直接贴配置 vim-Plug: let mapleader "," let g:mapleader "," le…

据阿谱尔APO Research统计显示,2023年全球有机硅弹性体凝胶市场销售额约为2.1亿美元

根据阿谱尔 (APO Research)的统计及预测,2023年全球有机硅弹性体凝胶市场销售额约为2.1亿美元,预计在2024-2030年预测期内将以超过4.17%的CAGR(年复合增长率)增长。 有机硅弹性体凝胶是一类具有独特性质和广泛应用领域…