当前位置:首页 > 科技  > 软件

我们一起聊聊前端接口容灾

来源: 责编: 时间:2023-11-30 09:29:28 312观看
导读开篇你说,万一接口挂了会怎么样?还能咋样,白屏呗。有没有不白屏的方案?有啊,还挺简单的。容我细细细细分析。原因就是接口挂了,拿不到数据了。那把数据储存起来就可以解决问题。思考存哪里?第一时间反应浏览器本地存储,想起

开篇

你说,万一接口挂了会怎么样?kmC28资讯网——每日最新资讯28at.com

还能咋样,白屏呗。kmC28资讯网——每日最新资讯28at.com

有没有不白屏的方案?kmC28资讯网——每日最新资讯28at.com

有啊,还挺简单的。kmC28资讯网——每日最新资讯28at.com

容我细细细细分析。kmC28资讯网——每日最新资讯28at.com

原因就是接口挂了,拿不到数据了。那把数据储存起来就可以解决问题。kmC28资讯网——每日最新资讯28at.com

思考

存哪里?

第一时间反应浏览器本地存储,想起了四兄弟。kmC28资讯网——每日最新资讯28at.com

选型对比

特性
kmC28资讯网——每日最新资讯28at.com

cookie
kmC28资讯网——每日最新资讯28at.com

localStorage
kmC28资讯网——每日最新资讯28at.com

sessionStorage
kmC28资讯网——每日最新资讯28at.com

indexDB
kmC28资讯网——每日最新资讯28at.com

数据生命周期
kmC28资讯网——每日最新资讯28at.com

服务器或者客户端都可以设置、有过期时间
kmC28资讯网——每日最新资讯28at.com

一直存在
kmC28资讯网——每日最新资讯28at.com

关闭页面就清空
kmC28资讯网——每日最新资讯28at.com

一直存在
kmC28资讯网——每日最新资讯28at.com

数据储存大小
kmC28资讯网——每日最新资讯28at.com

4KB
kmC28资讯网——每日最新资讯28at.com

5MB
kmC28资讯网——每日最新资讯28at.com

5MB
kmC28资讯网——每日最新资讯28at.com

动态,很大
kmC28资讯网——每日最新资讯28at.com

大于250MB
kmC28资讯网——每日最新资讯28at.com

与服务器通信
kmC28资讯网——每日最新资讯28at.com

每次都带在header中
kmC28资讯网——每日最新资讯28at.com

不带
kmC28资讯网——每日最新资讯28at.com

不带
kmC28资讯网——每日最新资讯28at.com

不带
kmC28资讯网——每日最新资讯28at.com

兼容性
kmC28资讯网——每日最新资讯28at.com

都支持
kmC28资讯网——每日最新资讯28at.com

都支持
kmC28资讯网——每日最新资讯28at.com

都支持
kmC28资讯网——每日最新资讯28at.com

IE不支持,其他主流都支持
kmC28资讯网——每日最新资讯28at.com

考虑到需要存储的数据量,5MB 一定不够的,所以选择了 IndexDB。kmC28资讯网——每日最新资讯28at.com

考虑新用户或者长时间未访问老用户,会取不到缓存数据与陈旧的数据。kmC28资讯网——每日最新资讯28at.com

因此准备上云,用阿里云存储,用 CDN 来保障。kmC28资讯网——每日最新资讯28at.com

总结下:线上 CDN、线下 IndexDB。kmC28资讯网——每日最新资讯28at.com

整体方案

整体流程图

图片图片kmC28资讯网——每日最新资讯28at.com

CDN

先讲讲线上 CDN。kmC28资讯网——每日最新资讯28at.com

通常情况下可以让后端支撑,本质就是更新策略问题,这里不细说。kmC28资讯网——每日最新资讯28at.com

我们讲讲另外一种方案,单独启个 Node 服务更新 CDN 数据。kmC28资讯网——每日最新资讯28at.com

流程图

图片图片kmC28资讯网——每日最新资讯28at.com

劫持逻辑

劫持所有接口,判断接口状态与缓存标识。从而进行更新数据、获取数据、缓存策略三种操作kmC28资讯网——每日最新资讯28at.com

通过配置白名单来控制接口存与取kmC28资讯网——每日最新资讯28at.com

axios.interceptors.response.use(      async (resp) => {        const { config } = resp        const { url } = config        // 是否有缓存tag,用于更新CDN数据。目前是定时服务在跑,访问页面带上tag        if (this.hasCdnTag() && this.isWhiteApi(url)) {          this.updateCDN(config, resp)        }        return resp;      },      async (err) => {        const { config } = err        const { url } = config        // 是否命中缓存策略        if (this.isWhiteApi(url) && this.useCache()) {          return this.fetchCDN(config).then(res => {            pushLog(`cdn缓存数据已命中,请处理`, SentryTypeEnum.error)            return res          }).catch(()=>{           pushLog(`cdn缓存数据未同步,请处理`, SentryTypeEnum.error)          })        }      }    );

缓存策略

累计接口异常发生 maxCount 次,打开缓存开关,expiresSeconds 秒后关闭。kmC28资讯网——每日最新资讯28at.com

缓存开关用避免网络波动导致命中缓存,设置了阀值。kmC28资讯网——每日最新资讯28at.com

/** 缓存策略*/useCache = () => {  if (this.expiresStamp > +new Date()) {    const d = new Date(this.expiresStamp)    console.warn(`    ---------------------------------------    ---------------------------------------    启用缓存中    关闭时间:${d.getHours()}:${d.getMinutes()}:${d.getSeconds()}    ---------------------------------------    ---------------------------------------    `)    return true  }  this.errorCount += 1  localStorage.setItem(CACHE_ERROR_COUNT_KEY, `${this.errorCount}`)  if (this.errorCount > this.maxCount) {    this.expiresStamp = +new Date() + this.expiresSeconds * 1000    this.errorCount = 0    localStorage.setItem(CACHE_EXPIRES_KEY, `${this.expiresStamp}`)    localStorage.removeItem(CACHE_ERROR_COUNT_KEY)    return true  }  return false}

唯一标识

根据 method、url、data 三者来标识接口,保证接口的唯一性kmC28资讯网——每日最新资讯28at.com

带动态标识,譬如时间戳等可以手动过滤kmC28资讯网——每日最新资讯28at.com

/** * 生成接口唯一键值*/generateCacheKey = (config) => {  // 请求方式,参数,请求地址,  const { method, url, data, params } = config;  let rawData = ''  if (method === 'get') {    rawData = params  }  if (method === 'post') {    rawData = JSON.parse(data)  }  // 返回拼接key  return `${encodeURIComponent([method, url, stringify(rawData)].join('_'))}.json`;};

更新数据

/** * 更新cdn缓存数据*/updateCDN = (config, data) => {  const fileName = this.generateCacheKey(config)  const cdnUrl = `${this.prefix}/${fileName}`  axios.post(`${this.nodeDomain}/cdn/update`, {    cdnUrl,    data  })}

Node定时任务

构建定时任务,用 puppeteer 去访问、带上缓存标识,去更新 CDN 数据kmC28资讯网——每日最新资讯28at.com

import schedule from 'node-schedule';const scheduleJob = {};export const xxxJob = (ctx) => {  const { xxx } = ctx.config;  ctx.logger.info(xxx, 'xxx');  const { key, url, rule } = xxx;  if (scheduleJob[key]) {    scheduleJob[key].cancel();  }  scheduleJob[key] = schedule.scheduleJob(rule, async () => {    ctx.logger.info(url, new Date());    await browserIndex(ctx, url);  });};export const browserIndex = async (ctx, domain) => {  ctx.logger.info('browser --start', domain);  if (!domain) {    ctx.logger.error('domain为空');    return false;  }  const browser = await puppeteer.launch({    args: [      '--use-gl=egl',      '--disable-gpu',      '--no-sandbox',      '--disable-setuid-sandbox',    ],    executablePath: process.env.CHROMIUM_PATH,    headless: true,    timeout: 0,  });  const page = await browser.newPage();  await page.goto(`${domain}?${URL_CACHE_KEY}`);  await sleep(10000);  // 访问首页所有查询接口  const list = await page.$$('.po-tabs__item');  if (list?.length) {    for (let i = 0; i < list.length; i++) {      await list[i].click();    }  }  await browser.close();  ctx.logger.info('browser --finish', domain);  return true;};

效果

手动 block 整个 domain,整个页面正常展示kmC28资讯网——每日最新资讯28at.com

图片图片kmC28资讯网——每日最新资讯28at.com

IndexDB

线上有 CDN 保证了,线下就轮到 IndexDB 了,基于业务简单的增删改查,选用 localForage 三方库足矣。kmC28资讯网——每日最新资讯28at.com

axios.interceptors.response.use(      async (resp) => {        const { config } = resp        const { url } = config        // 是否有缓存tag,用于更新CDN数据。目前是定时服务在跑,访问页面带上tag        if (this.hasCdnTag() && this.isWhiteApi(url)) {          this.updateCDN(config, resp)        }        if(this.isIndexDBWhiteApi(url)){          this.updateIndexDB(config, resp)        }        return resp;      },      async (err) => {        const { config } = err        const { url } = config        // 是否命中缓存策略        if (this.isWhiteApi(url) && this.useCache()) {          return this.fetchCDN(config).then(res => {            pushLog(`cdn缓存数据已命中,请处理`, SentryTypeEnum.error)            return res          }).catch(()=>{           pushLog(`cdn缓存数据未同步,请处理`, SentryTypeEnum.error)           if(this.isIndexDBWhiteApi(url)){             return this.fetchIndexDB(config).then(res => {              pushLog(`IndexDB缓存数据已命中,请处理`, SentryTypeEnum.error)              return res            }).catch(()=>{             pushLog(`IndexDB缓存数据未同步,请处理`, SentryTypeEnum.error)            })           }          })        }      }    );

总结

总结下,优点包括不入侵业务代码,不影响现有业务,随上随用,尽可能避免前端纯白屏的场景,成本低。劣势包括使用局限,不适合对数据实效性比较高的业务场景,不支持 IE 浏览器。kmC28资讯网——每日最新资讯28at.com

接口容灾我们也是刚弄不久,有许多细节与不足,欢迎沟通交流。kmC28资讯网——每日最新资讯28at.com

接口容灾本意是预防发生接口服务挂了的场景,我们不会很被动。原来是P0的故障,能被它降低为 P2、P3,甚至在某些场景下都不会有用户反馈。kmC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-35314-0.html我们一起聊聊前端接口容灾

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Vue 3的Teleport特性详解,你了解几分?

下一篇: 2024 年 Vue 发展预测

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 摸鱼心法第一章——和配置文件说拜拜

    为了能摸鱼我们团队做了容器化,但是带来的问题是服务配置文件很麻烦,然后大家在群里进行了“亲切友好”的沟通图片图片图片图片对比就对比,简单对比下独立配置中心和k8s作为配
  • SpringBoot中使用Cache提升接口性能详解

    环境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架从 3.1 开始,对 Spring 应用程序提供了透明式添加缓存的支持。和事务支持一样,抽象缓存允许一致地使用各
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
Top