1205线上事故复盘分析

发布时间: 11.15
测试环境node版本: 10.15.3
生产环境node版本: bj2320->8.11.3, bj0177->8.9.4

出错原因:

代码中使用/(?<=exp)/后行断言匹配exp后面的部分, 低版本的node无法识别该语法, 在bj0177上报错, 由于页面为后端直出渲染, 用户展示的错误为直接看到500

未被发现原因:
  • 测试环境的node版本及bj2320 node版本均支持该语法, 测试过程未发现问题
  • 服务拆分迁移后未做告警策略
  • 两台机器同时跑这个服务, 一台报错后会将请求通过cdn回源转发到另一台机器, 即bj2320, 这台机器上没有问题
  • 问题如何发现, cdn回源有时间差, 第一次请求若在bj0177, 打开显示500, 再次打开时则正常, 问题为运营发现
  • 经统计, 现在日志中能看到的从11.30开始到问题发现回滚, 每天的错误请求数为: 1811,1326, 627, 926, 596, 585
报错日志.png
function replaceImgSrc(){
  let contentReplaced = content
  let itemCur
  let imageArr = content.match(/|\/>)/g)
  console.log(imageArr)
  if(imageArr.length !== 0) {
    imageArr.forEach( item => {
      if(parseFloat(item.match(/(?<=data-width=('|"))[^"^']+/g))) {
        const src = item.match(/(?<=\ssrc=('|"))([^"^']+)/g)[0]
        itemCur = item.replace(src, '')
        contentReplaced = contentReplaced.replace(item, itemCur.replace(/
在浏览器中的运行结果

后续如何避免这类问题

  • 使用nvm node版本管理工具, 使用与线上服务相同的node版本进行开发
  • 现在本机为windows系统, 考虑申请使用自己mac了...

你可能感兴趣的:(1205线上事故复盘分析)