有一种八阿哥(Bug),叫“在我电脑上是好的呀”。

有一种解决方式,叫“你去好好排查一下你自己的代码”。

有一种控诉,叫“这绝不是后端的问题”。

你能忍吗?我不能忍,为这事,我可没少跟同事撕逼,可是有什么用吗? 最后我想,这事儿也许不怪别人,怪就怪我无法直接证明这些bug不是我的。今天我们就来说说有哪些难搞的线上问题,该如何去定位,并解决它。

但是,解决线上的问题,不是看你会什么,而是看你有什么?

==========================================

【前端监控系统】 Github地址;只需要简单几步,就可以搭建一套属于自己的前端监控系统。

==========================================

一、白屏 - 前端小伙伴的噩梦

页面白屏了,这对前端小伙伴来说,是最严重的bug了,因为业务因此瘫痪了,哪怕不是你的锅,你也背定了。于是,你对着一张白屏,心急如焚,却一脸懵逼,因为你什么有用的信息都没有,解决起来真的无从着手。那么导致白屏的原因有哪些呢?

  1. 很遗憾,确实是你的JS报错了,运行时抛出异常,导致白屏。

  2. 静态资源加载失败,如:js、css文件加载失败,导致白屏。

以上两点是导致前端白屏的主要原因,当然你说还有什么机子兼容性不好太卡,网络异常什么的,那都小概率事件,属于前端监控的另一个维度,我们在这里就不说了,以后说。

从上边两张图可以看出,如果你知道了用户在某个时间做了某个动作之后,发生了错误,解决起来,也就易如反掌了。

二、接口报错 - 如何优雅的甩给后端

可能有人会认为接口的报错应该由后台来关注,统计,并修复。 确实如此,而且后台服务有了很多成熟完善的统计工具,完全能够应对大部分的异常情况, 那么为什么还需要前端来解决接口问题呢。原因很简单,因为前端是bug的第一发现位置,他们肯定会先找到你,那么在你帮后台背锅之前怎么快速优雅的"甩锅"呢?

我们公司的后台可是有着完善的监控系统,他们都觉得自己的代码和监控都做得非常完善,但是从我的监控结果来看,事实并非如此。当然,你也许会说这是开发和测试不专业,这么明显的问题都没有发现,但是,我只能用一句话来解释:人非圣贤。与其追究是谁的责任,不如想办法解决问题。将线上的损失减少到最低。


同样道理,如果你把下边这张截图发给你们的后台小伙伴,你还需要跟他们争论是谁的锅吗?当然,如果是你自己的锅,你还是赶紧偷偷修改掉吧,别跑去丢人了,哈哈。

三、网络问题 - 用户的锅

网络是跟用户体验密切相关的因素,但却是开发小伙伴无能为力的因素,因为这取决于用户当时的网络环境是否良好。如果我们能够判断出用户当时的网络情况,对我们排查问题也是很有帮助的。

首先,网络环境对页面首次加载影响最明显。 理论上讲,我们是无法,或者说不方便把用户当时的网络情况计算出来,但是我们可以侧面评估出用户当时的网络环境。虽然我们测不出来网速,但是我们可以计算出用户首次加载页面的时间,以此来评估用户的网络环境。

其次,网络环境影响接口的效率。你也许会说,如果网络环境不好,我们只要等待足够长的时间,接口啥的总是能够加载出来的,但是线上用户使用app的时候都会有个极限等待时间。也就是说用户等待到一定时间,就会变得不耐烦了,就会杀掉你的程序,流失用户。所以,我们一定要在到达用户极限等待时间之前,给用户一个反馈,这就是为什么我们需要给前端接口加一个超时时间。

如果,网络环境评估良好,而接口请求耗时又很长,这时候你就可以去找后端的小伙伴算账了。

四、CDN报错 - 替第三方公司背锅

好吧,最憋屈的一种线上Bug,就是替第三方公司背锅啦。如果是第三方的东西出了问题,上头永远都只怀疑是你的代码有bug,如果你没有有力的证据,即使你已经排查过了,他们也只会说一句“你再去好好排查一下你自己的代码”,这时候是不是有一键盘呼他脸上的冲动。

于是,我一怒之下,在监控系统里加入了对静态资源的监控功能。前不久,阿里部分区域的出现了5分钟无法访问的情况。我们线上群里顿时就炸开了锅,让我赶紧排查问题。我打开了错误监控,发现只有静态资源报错陡然飙升。在群里轻轻的说了一句,是CDN有问题,果然,不一会儿,CDN就发了公告了。我转头看向窗外,轻轻地吐了一口气,天上的云静静的飘着,此时此刻只有我自己知道,我再也不用替你背锅了。

五、前端代码错误 - 这才是自己的锅

别人的锅都甩给他们了,剩下咱来聊聊自己的锅。正常情况下,线上前端代码出现错误的可能行比较小,因为经过细心的测试,前端代码错误是很容暴露出来的。另外,咱自己的锅,咱自己清楚,加上我做了一个非常细致的错误分析,问题解决起来也是得心应手

总结:造成线上问题的因素有很多,代码错误仅仅是其中一个很小的因素。我们如何在这众多繁杂的因素之中找到真正原因,就需要有意见趁手的工具。我开发使用前端监控系统到现在,最深的感触是:“这个监控系统并不是帮我解决了很多问题,而是能够告诉我那些问题我不能解决”,这就足以让我从现实的困境中解脱出来。所谓,工欲善其事必先利其器,说得可能就是这个意思吧。

=================================

怎么解决前端线上Bug的更多相关文章

  1. ××校招:前端线上笔试题--页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动

    题目: 请让页面中的一个元素(10px*10px)围绕坐标(200, 300) 做圆周运动:   原理: 1.页面上画一个圆,画一个圆心.在这个圆的圆周上面画一个点,我们就让这个点绕着圆周跑: 2.怎 ...

  2. 使用chrome调试前端线上代码

    家都知道在前端开发过程中,为加快网站静态资源加载速度都会对js/css等静态资源进行压缩合并再部署到生产环境,而在实际开发过程中开发人员一般都是在开发环境进行源码文件开发调试的,当部署平台或部署人员将 ...

  3. 听说”双11”是这么解决线上bug的

    听说"双11"是这么解决线上bug的 --Android线上热修复的使用与原理 预备知识和开发环境 Android NDK编程 AndFix浅析 Android线上热修复的原理大同 ...

  4. 线上BUG:MySQL死锁分析实战

    原文链接:线上BUG:MySQL死锁分析实战 1 线上告警 我们不需要关注截图中得其他信息,只要能看到打印得org.springframework.dao.DeadlockLoserDataAcces ...

  5. 线上bug的解决方案--带来的全新架构设计

    缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...

  6. 程序员如何描述清楚线上bug

    案例 一个管理后台的bug,把操作记录中的操作员姓名,写成了该操作员的id.原因是修改了一个返回操作人姓名的函数,返回了操作人的id.但是还有其他地方也用这个函数,导致其他地方把姓名字段填写成了操作员 ...

  7. 线上bug分析

    昨天下午大神把组内几十号人召集在一起开Online bug分析大会,主要是针对近期线上事故从事故原因和解决方案两个维度来分析. 对金融软件来说,每一次的线上事故都有可能给公司带来重大的损失,少扣了用户 ...

  8. 记一次解决tomcat自动关闭的bug

    最近一个运行了4年的javaee web项目,经常接到客户反馈系统无法打开.登录服务器查看服务,发现是tomcat自动关闭了.基本是3到4天发生一次. 运维人员开始以为是其他服务杀死了tomcat服务 ...

  9. 线上bug或故障界定及填写规范

    [线上故障与线上Bug界定] 一.线上故障: 1.  故障参照公司规范稍做调整: a)         1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b)       ...

随机推荐

  1. 修改MyEclipse/Eclipse左侧文字大小(MacOS/Windows)

    一.Windows 首先找到 Eclipse/MyEclipse 的安装目录,然后找到如下目录: \plugins\org.eclipse.ui.themes_1.1.200.v20160815-05 ...

  2. 待办事项App 评测

    1. 敬业签 2. Microsoft To-Do(奇妙清单) 3. Evernote 4.one note 5.Google Keep 6.to-do-ist 7.365 日历 8.Any.Do 9 ...

  3. qt中设置窗口左上角的图标

    前面一节已经详细的讲解了怎么添加图片到qt的图片资源文件中,这里就不赘述了,不太了解的可以看看博主的这篇随笔:qt中建立图片资源管理文件 this->setWindowIcon(QIcon(&q ...

  4. Image动画

    前几课讲的静态Image挺有趣的,但是如果能有动画的效果,那就更有趣了,mPython做出动画效果也不难.用images的列表,list. 下面就是一个列表: eggs bacon tomatoes ...

  5. | C语言I作业04

    | C语言I作业004 标签: 18软件 李煦亮 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://www.cnblogs.com/pengchen511/p/ ...

  6. dockerfile 命令

    FROM 功能为指定基础镜像,并且必须是第一条指令. 如果不以任何镜像为基础,那么写法为:FROM scratch. 同时意味着接下来所写的指令将作为镜像的第一层开始 语法: FROM <ima ...

  7. C语言有关文件编辑的函数

    fopen()函数 函数作用 用来打开一个文件 头文件 #include <stdio.h> 用法 FILE *fopen(char *filename, *type); TYPES &q ...

  8. 关于 golang build

    如何编译 golang 的编译还是比较容易的,用法如下: go build [-o output] [-i] [build flags] [packages] 上面方括号标记的参数,都可以没有-- 最 ...

  9. cocos2d设置窗口标题

    //窗口标题 #ifdef WIN32 CCEGLView* pGlView=CCDirector::sharedDirector()->getOpenGLView(); if (pGlView ...

  10. Java学习:面向对象的三大特征:封装性、继承性、多态性之继承性

    面向对象的三大特征:封装性.继承性.多态性. 继承 继承是多态的前提 ,如果没有继承,就没有多态. 继承主要解决的问题就是:共性抽取. 继承关系当中的特点: 子类可以拥有父类的“内容” 子类还可以拥有 ...