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

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

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

开篇

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

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

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

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

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

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

思考

存哪里?

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

选型对比

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

整体方案

整体流程图

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

CDN

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

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

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

流程图

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

劫持逻辑

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

通过配置白名单来控制接口存与取O8D28资讯网——每日最新资讯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 秒后关闭。O8D28资讯网——每日最新资讯28at.com

缓存开关用避免网络波动导致命中缓存,设置了阀值。O8D28资讯网——每日最新资讯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 三者来标识接口,保证接口的唯一性O8D28资讯网——每日最新资讯28at.com

带动态标识,譬如时间戳等可以手动过滤O8D28资讯网——每日最新资讯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 数据O8D28资讯网——每日最新资讯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,整个页面正常展示O8D28资讯网——每日最新资讯28at.com

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

IndexDB

线上有 CDN 保证了,线下就轮到 IndexDB 了,基于业务简单的增删改查,选用 localForage 三方库足矣。O8D28资讯网——每日最新资讯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 浏览器。O8D28资讯网——每日最新资讯28at.com

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

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

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

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

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

下一篇: 2024 年 Vue 发展预测

标签:
  • 热门焦点
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 女孩租房开2小时空调用完100元电费引热议:5级能耗惹不起 月薪过万电费也交不起

    近日,江苏苏州一女孩租房当天充值了100元电费,开着空调不到2小时发现电费已用完。对于为什么这个快,房东表示,电表坏了这种情况很多,之前也遇到过,给租客换
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 一文搞定Java NIO,以及各种奇葩流

    大家好,我是哪吒。很多朋友问我,如何才能学好IO流,对各种流的概念,云里雾里的,不求甚解。用到的时候,现百度,功能虽然实现了,但是为什么用这个?不知道。更别说效率问题了~下次再遇到,
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
  • iQOO Neo8系列今日官宣:首发天玑9200+ 全球安卓最强芯!

    在昨日举行的的联发科新一代旗舰芯片天玑9200+的发布会上,iQOO官方也正式宣布,全新的iQOO Neo8系列新品将全球首发搭载这款当前性能最强大的移动平台
Top