成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們一起聊聊前端接口容災

開發 前端
總結下,優點包括不入侵業務代碼,不影響現有業務,隨上隨用,盡可能避免前端純白屏的場景,成本低。劣勢包括使用局限,不適合對數據實效性比較高的業務場景,不支持 IE 瀏覽器。

開篇

你說,萬一接口掛了會怎么樣?

還能咋樣,白屏唄。

有沒有不白屏的方案?

有啊,還挺簡單的。

容我細細細細分析。

原因就是接口掛了,拿不到數據了。那把數據儲存起來就可以解決問題。

思考

存哪里?

第一時間反應瀏覽器本地存儲,想起了四兄弟。

選型對比

特性

cookie

localStorage

sessionStorage

indexDB

數據生命周期

服務器或者客戶端都可以設置、有過期時間

一直存在

關閉頁面就清空

一直存在

數據儲存大小

4KB

5MB

5MB

動態,很大

大于250MB

與服務器通信

每次都帶在header中

不帶

不帶

不帶

兼容性

都支持

都支持

都支持

IE不支持,其他主流都支持

考慮到需要存儲的數據量,5MB 一定不夠的,所以選擇了 IndexDB。

考慮新用戶或者長時間未訪問老用戶,會取不到緩存數據與陳舊的數據。

因此準備上云,用阿里云存儲,用 CDN 來保障。

總結下:線上 CDN、線下 IndexDB。

整體方案

整體流程圖

圖片圖片

CDN

先講講線上 CDN。

通常情況下可以讓后端支撐,本質就是更新策略問題,這里不細說。

我們講講另外一種方案,單獨啟個 Node 服務更新 CDN 數據。

流程圖

圖片圖片

劫持邏輯

劫持所有接口,判斷接口狀態與緩存標識。從而進行更新數據、獲取數據、緩存策略三種操作

通過配置白名單來控制接口存與取

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 秒后關閉。

緩存開關用避免網絡波動導致命中緩存,設置了閥值。

/*
* 緩存策略
*/
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 三者來標識接口,保證接口的唯一性

帶動態標識,譬如時間戳等可以手動過濾

/**
 * 生成接口唯一鍵值
*/
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 數據

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,整個頁面正常展示

圖片圖片

IndexDB

線上有 CDN 保證了,線下就輪到 IndexDB 了,基于業務簡單的增刪改查,選用 localForage 三方庫足矣。

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 瀏覽器。

接口容災我們也是剛弄不久,有許多細節與不足,歡迎溝通交流。

接口容災本意是預防發生接口服務掛了的場景,我們不會很被動。原來是P0的故障,能被它降低為 P2、P3,甚至在某些場景下都不會有用戶反饋。

責任編輯:武曉燕 來源: 政采云技術
相關推薦

2023-08-10 08:28:46

網絡編程通信

2023-08-04 08:20:56

DockerfileDocker工具

2023-06-30 08:18:51

敏捷開發模式

2022-05-24 08:21:16

數據安全API

2023-09-10 21:42:31

2025-05-26 03:15:00

接口高可用框架

2024-11-27 08:47:12

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2025-03-13 05:00:00

2023-03-26 23:47:32

Go內存模型

2024-07-26 09:47:28

2022-10-08 00:00:05

SQL機制結構

2023-07-24 09:41:08

自動駕駛技術交通

2022-02-23 08:41:58

NATIPv4IPv6

2022-09-22 08:06:29

計算機平板微信

2024-11-28 09:57:50

C#事件發布器

2021-08-12 07:49:24

mysql

2022-10-28 07:27:17

Netty異步Future

2022-11-12 12:33:38

CSS預處理器Sass
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲九色 | 国产传媒视频在线观看 | 国产伦一区二区三区 | 欧美极品在线观看 | 欧美精品乱码99久久影院 | 国产日韩精品一区二区三区 | 国产成人免费视频网站视频社区 | 蜜桃视频在线观看免费视频网站www | 热久久免费视频 | 成人做爰69片免费观看 | 精品毛片视频 | 久久久国产一区 | 夜夜摸夜夜操 | 亚洲综合中文字幕在线观看 | 韩国欧洲一级毛片 | 午夜精品久久久久久久久久久久久 | 欧美一区免费 | 精品一区国产 | 全免费a级毛片免费看视频免 | 亚洲国产aⅴ精品一区二区 免费观看av | 91视频在线观看 | av片免费| 天天操夜夜操 | 国产精品揄拍一区二区 | 亚洲高清在线 | 精品久久影院 | 一级全黄视频 | 国产视频中文字幕 | 一区二区手机在线 | 紧缚调教一区二区三区视频 | 国产一区二区三区久久久久久久久 | 电影在线 | 美女午夜影院 | 日韩精品一区二区三区中文字幕 | 成人av激情 | 老外几下就让我高潮了 | 久久久久久高潮国产精品视 | 在线观看国产精品一区二区 | 色婷婷一区二区三区四区 | 欧美a在线看| 国产一级一级国产 |