有一种八阿哥(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. opengl第一个工程

    #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> void framebuffe ...

  2. 学习-guava

    Guava Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库 例如:集合 [collections] .缓存 [caching] .原生类型支持 [primitives sup ...

  3. Python实现电子词典(图形界面)

    Python实现电子词典(图形界面) 终端电子词典:https://www.cnblogs.com/noonjuan/p/11341375.html 文件一览: .├── client.py├── d ...

  4. vue之非父子通信

    一.非父子通信: 思路: 找个中间存储器,组件一把信息放入其中,组件二去拿 代码如下: let hanfei = new Vue();  # 实列化个空的vue对象,作为中间存储器来时间        ...

  5. kafka如何保证数据可靠性和数据一致性

    数据可靠性 Kafka 作为一个商业级消息中间件,消息可靠性的重要性可想而知.本文从 Producter 往 Broker 发送消息.Topic 分区副本以及 Leader 选举几个角度介绍数据的可靠 ...

  6. 内置函数、反射、__str__、__del__、元类

    一.内置函数的补充 isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo: pass obj=Foo() print(isinstance(obj,Foo) ...

  7. 【Gamma】事后分析

    目录 [Gamma]事后分析 设想和目标 计划 资源 变更管理 设计/实现 测试/发布 团队的角色,管理,合作 总结 照片 [Gamma]事后分析 设想和目标 我们的软件要解决什么问题?是否定义得很清 ...

  8. 批处理中setlocal enabledelayedexpansion的作用详细整理

    转自:https://www.jb51.net/article/29323.htm 设置本地为延迟扩展.其实也就是:延迟变量,全称延迟环境变量扩展, 想进阶,变量延迟是必过的一关!所以这一部分希望你能 ...

  9. 用简单的JS代码制作计算器

    代码+注释一共不到200行,是练习交流的必备良药 主界面如下: 操作示意图: 以下是代码部分 HTML: <div> <table class="window"& ...

  10. SQLServer -------- 解决忘记sa 密码,创建一个新的

    时间真的是一个可怕的武器,你可以不服老,但是你不能改变,你年纪的增长,在我们创建数据库的时候,会创建sa 和密码,但是密码忘记怎么办, 提供一种方法,创建一个新的进行软件部署 实现方法:1.找到安全性 ...