前端通信:ajax设计方案(七)--- 增加请求错误监控、前端负载均衡以、请求宕机切换以及迭代问题修复

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

距离上个迭代过了很长时间,中间经历了很多事情,也在每个空余时间构思了这个迭代的东西以及下个迭代要做的东西。时间周期稍微长了,望见谅。

而且,至今这个开源库的start也已经到了165个了,会支持关注和研究的。


首先解决了上个迭代遇到的问题进行完善和修复:

1. 上个迭代做ajax timeout设置的时候,手抖将timeout不小心设置成timeoutEvent,这期做了修复

2. 解决全局配置中配置额外参数,批量检查时会参数错误问题。


1. 增加浏览器发送请求的错误监控和搜集:

应用场景:

前端开发依赖的东西比较多,比如宿主环境(浏览器)、以及数据接口(自己服务器或者第三方Api等等),上个迭代进行了浏览器错误搜集,可以分析用户在不同环境下宿主的使用率和差异以及问题。但是对于用户的数据请求一直没有做监控,因为用户在不同的场景、网络状况下乃至在开发或者发布中将接口地址写错了,导致出现问题。

全局配置:

errStatus: {
  isOpenErr: true,    // 是否开启错误搜集
  errURL: 'http://localhost:8072',    // 错误搜集地址
},
AI 代码解读

设计代码:

//监控ajax请求的错误日志
uploadAjaxError: function (obj) {
  // 过滤错误接口
  if (initParam.errStatus.isOpenErr) {
    if (obj.errUrl !== initParam.errStatus.errURL) {
      tempObj.post(initParam.errStatus.errURL, obj)
    }
  }
  // 记录错误信息,以便策略做判断
  if (selfData.errAjax[obj.errUrl] === undefined) {
    selfData.errAjax[obj.errUrl] = 1
  } else {
    selfData.errAjax[obj.errUrl] += 1
  }

  // 判断是否开启服务切换,以及验证策略切换
  if (initParam.serviceSwitching.isOpen){
    // 验证策略
    selfData.isNeedSwitching = initParam.serviceSwitching.strategies(selfData.errAjax)
  }

}
AI 代码解读

覆盖面以及数据:

请求的错误搜集,将覆盖4xx、5xx、0、onerror以及timeout状态

PS:在浏览器api中,只读属性 XMLHttpRequest.status 返回了XMLHttpRequest 响应中的数字状态码。status 的值是一个无符号短整型。在请求完成前,status的值为0。值得注意的是,如果 XMLHttpRequest 出错,浏览器返回的 status 也为0。

链接:XMLHttpRequest.status

数据上传格式:

/*
    * 请求错误搜集
    *   type:错误类型
    *   errInfo:错误的请求参数
    *   errLine:请求状态
    *   Browser:宿主环境(浏览器)
    */ 
  tool.uploadAjaxError({
      type: 'request',    
      errInfo: JSON.stringify(ajaxSetting.data),
      errLine: xhr.status,
      Browser: navigator.userAgent
  })
AI 代码解读

测试结果:

a. onerror错误:

onerror错误信息

b. 4XX错误、5XX错误、0错误

4XX、5XX、0错误

c. timeout错误

timeout错误

2. 前端负载均衡(将请求均衡打到不同的服务器上)

应用场景:

现在很多公司更多使用ngx做负载均衡,使用node第一层hold住所有流量,然后通过ngx进行分发到不同的服务器上做负载,避免在一台服务器上读写造成资源竞争等等,结构如下图:

但是,如果在超大流量的一种状况下,前端作为请求的发出方,完全有能力在发出阶段就将请求打到不同的负载服务器上,然后再通过ngx再进行二次负载均衡,结构如下如:

全局配置:

// 负载均衡配置
loadBalancing: {
  isOpen: false,   // 是否开启负载
  cluster: ['http://localhost:8076','http://localhost:8099']  // 配置地址
},
AI 代码解读

代码实现:

/*
 * 判断是否为其他域的请求
 *
 * 改方法中处理负载均衡方案
 *    1. 对于前后端分离,直接请求域名的方案  支持
 *    2. 对于直接请求本服务器的请求,暂时不做处理,让ngx做负载均衡  不支持
 *
 *
 */
checkRealUrl: function (param, that) {
  var temp;
  if (/http:\/\/|https:\/\//.test(param.url)) {
    temp = param.url;
    // 针对请求,负载均衡到配置域名  PS:负载均衡优先级 > 宕机切换优先级
    if (param.errStatus.errURL !== temp) { // 错误搜集接口都不走
      if (param.loadBalancing.isOpen) {  // 负载打开肯定走负载
        temp = param.url.replace(/^(http:\/\/|https:\/\/)/, '')
          .replace(/^.*?\//, param.loadBalancing.cluster[tool.random(param.loadBalancing.cluster.length - 1, 0)] + '/$`')
      } else {
        // 如果负载没开,宕机切换打开,则走介个
        if (param.serviceSwitching.isOpen && selfData.isNeedSwitching) {
          temp = param.url.replace(/^(http:\/\/|https:\/\/)/, '')
            .replace(/^.*?\//, param.serviceSwitching.backupUrl + '/$`')
        }
      }
    }
  } else {
    temp = param.baseURL + param.url
    if (param.errStatus.errURL !== temp) {
      if (param.loadBalancing.isOpen) {
        temp = param.loadBalancing.cluster[tool.random(param.loadBalancing.cluster.length - 1, 0)] + param.baseURL + param.url
      } else {
        // 如果负载没开,宕机切换打开,宕机策略成功则走介个
        if (param.serviceSwitching.isOpen && selfData.isNeedSwitching) {
          temp = param.serviceSwitching.backupUrl + param.baseURL + param.url
        }
      }
    }
  }
  that.currentUrl = temp
  return temp;
}
AI 代码解读

随机函数校验:

因为前端需要通过一个伪随机数随机获取一个数值,然后通过这个数值去取负载配置的域名,为了保证随机打点的均衡性,这里将测试在指数级增长下随机打点5次的状况

随机函数测试代码:

// 伪随机数函数
random(max, min) {
    return Math.floor(Math.random() * (max - min + 1) + min);
},
AI 代码解读

案例:

a. 随机5个,10次

a. 随机5个,100次

a. 随机5个,1000次

a. 随机5个,10000次

a. 随机5个,100000次

结果:在指数级增长的过程中,打点越来越均衡,相对伪随机数的分布取值也越来越均衡

负载均衡测试结果:


2. 宕机切换(支持策略)

应用场景:

在日常用户使用请求接口的时候,用户在点击一个按钮的时候,如果一次接口请求失败,在人性角度去看,用户肯定会再一次去点击触发请求,多次按了都没效果,才会确认这个功能是没用的。如果,在这个时候,这个场景下,用一个正确的策略在用户点击时候,如果本地请求失败,支持切换备用域名,这样可以有效的挽回流失用户。

全局配置:

// 宕机切换
serviceSwitching:{
  isOpen: false,    // 是否开启
  // 宕机策略(data为记录的错误请求以及数量,如果达到策略返回true,否则false)
  strategies:function (data) {
    let num = 0
      for (var key in data){
        num = data[key]
      }
      if (num === 5){
         return true
      }else{
         return false
      }
     },
  backupUrl:'http://localhost:8033'     // 备用域名
},
AI 代码解读

代码实现:

同负载均衡的那一大堆代码,可以向上看。

测试案例(在策略中我绑定了如果错误连续积累5次之后将切换备用接口):


总结:这一期的迭代需求中已经将ajax所能涉及的应用场景全部挖掘的快消耗殆尽了,如果还有什么使用场景,可以去github提个issues。

github地址:github.com/GerryIsWarr… 可以点个star,持续研究下去

原文发布时间:2018-07-02
本文来源 掘金如需转载请紧急联系作者
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
打赏
0
1
0
0
14291
分享
相关文章
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
61 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
33 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
前端解决axios请求的跨域问题【2步完成】
本文介绍如何通过前端配置解决跨域问题,主要针对Vue项目中的`vite.config.js`文件进行修改。作者在联调过程中遇到跨域报错
38 1
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
86 1
回顾前端页面发送ajax请求方式
回顾前端页面发送ajax请求方式
61 18
前端通信:ajax设计方案(二)---集成轮询技术
上一篇文章介绍了ajax技术核心方法,和跨域的问题(只要后台支持跨域默认post就可以),这篇文章讲解一下使用ajax实现的轮询技术,至于iframe,SSE服务器单向推送,以及webSocket双工通道暂时不涉及。
1401 0
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
利用Spring Boot处理JSON数据实战(包括jQuery,html,ajax)附源码 超详细
218 0
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤
❤❤❤【Vue.js最新版】sd.js基于jQuery Ajax最新原生完整版for凯哥API版本❤❤❤

热门文章

最新文章

  • 1
    【上云基础系列 02-01】通过SLB+1台ECS+ESS弹性伸缩,搭建一个精简版的上云标准弹性架构(含方案及教程)
    44
  • 2
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    11
  • 3
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    35
  • 4
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    3
  • 5
    详解智能编码在前端研发的创新应用
    14
  • 6
    巧用通义灵码,提升前端研发效率
    19
  • 7
    智能编码在前端研发的创新应用
    34
  • 8
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    7
  • 9
    硬件负载均衡设备的常见故障有哪些?
    15
  • 10
    部署硬件负载均衡时,如何评估设备的处理能力?
    12
  • 1
    开箱即用的GO后台管理系统 Kratos Admin - 前端权限
    3
  • 2
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    33
  • 3
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    61
  • 4
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    28
  • 5
    巧用通义灵码,提升前端研发效率
    94
  • 6
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    146
  • 7
    详解智能编码在前端研发的创新应用
    100
  • 8
    智能编码在前端研发的创新应用
    83
  • 9
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    40
  • 10
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    125
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等