日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2023-11-30 09:29:28 217觀看
導讀開篇你說,萬一接口掛了會怎么樣?還能咋樣,白屏唄。有沒有不白屏的方案?有啊,還挺簡單的。容我細細細細分析。原因就是接口掛了,拿不到數據了。那把數據儲存起來就可以解決問題。思考存哪里?第一時間反應瀏覽器本地存儲,想起

開篇

你說,萬一接口掛了會怎么樣?X3v28資訊網——每日最新資訊28at.com

還能咋樣,白屏唄。X3v28資訊網——每日最新資訊28at.com

有沒有不白屏的方案?X3v28資訊網——每日最新資訊28at.com

有啊,還挺簡單的。X3v28資訊網——每日最新資訊28at.com

容我細細細細分析。X3v28資訊網——每日最新資訊28at.com

原因就是接口掛了,拿不到數據了。那把數據儲存起來就可以解決問題。X3v28資訊網——每日最新資訊28at.com

思考

存哪里?

第一時間反應瀏覽器本地存儲,想起了四兄弟。X3v28資訊網——每日最新資訊28at.com

選型對比

特性
X3v28資訊網——每日最新資訊28at.com

cookie
X3v28資訊網——每日最新資訊28at.com

localStorage
X3v28資訊網——每日最新資訊28at.com

sessionStorage
X3v28資訊網——每日最新資訊28at.com

indexDB
X3v28資訊網——每日最新資訊28at.com

數據生命周期
X3v28資訊網——每日最新資訊28at.com

服務器或者客戶端都可以設置、有過期時間
X3v28資訊網——每日最新資訊28at.com

一直存在
X3v28資訊網——每日最新資訊28at.com

關閉頁面就清空
X3v28資訊網——每日最新資訊28at.com

一直存在
X3v28資訊網——每日最新資訊28at.com

數據儲存大小
X3v28資訊網——每日最新資訊28at.com

4KB
X3v28資訊網——每日最新資訊28at.com

5MB
X3v28資訊網——每日最新資訊28at.com

5MB
X3v28資訊網——每日最新資訊28at.com

動態,很大
X3v28資訊網——每日最新資訊28at.com

大于250MB
X3v28資訊網——每日最新資訊28at.com

與服務器通信
X3v28資訊網——每日最新資訊28at.com

每次都帶在header中
X3v28資訊網——每日最新資訊28at.com

不帶
X3v28資訊網——每日最新資訊28at.com

不帶
X3v28資訊網——每日最新資訊28at.com

不帶
X3v28資訊網——每日最新資訊28at.com

兼容性
X3v28資訊網——每日最新資訊28at.com

都支持
X3v28資訊網——每日最新資訊28at.com

都支持
X3v28資訊網——每日最新資訊28at.com

都支持
X3v28資訊網——每日最新資訊28at.com

IE不支持,其他主流都支持
X3v28資訊網——每日最新資訊28at.com

考慮到需要存儲的數據量,5MB 一定不夠的,所以選擇了 IndexDB。X3v28資訊網——每日最新資訊28at.com

考慮新用戶或者長時間未訪問老用戶,會取不到緩存數據與陳舊的數據。X3v28資訊網——每日最新資訊28at.com

因此準備上云,用阿里云存儲,用 CDN 來保障。X3v28資訊網——每日最新資訊28at.com

總結下:線上 CDN、線下 IndexDB。X3v28資訊網——每日最新資訊28at.com

整體方案

整體流程圖

圖片圖片X3v28資訊網——每日最新資訊28at.com

CDN

先講講線上 CDN。X3v28資訊網——每日最新資訊28at.com

通常情況下可以讓后端支撐,本質就是更新策略問題,這里不細說。X3v28資訊網——每日最新資訊28at.com

我們講講另外一種方案,單獨啟個 Node 服務更新 CDN 數據。X3v28資訊網——每日最新資訊28at.com

流程圖

圖片圖片X3v28資訊網——每日最新資訊28at.com

劫持邏輯

劫持所有接口,判斷接口狀態與緩存標識。從而進行更新數據、獲取數據、緩存策略三種操作X3v28資訊網——每日最新資訊28at.com

通過配置白名單來控制接口存與取X3v28資訊網——每日最新資訊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 秒后關閉。X3v28資訊網——每日最新資訊28at.com

緩存開關用避免網絡波動導致命中緩存,設置了閥值。X3v28資訊網——每日最新資訊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 三者來標識接口,保證接口的唯一性X3v28資訊網——每日最新資訊28at.com

帶動態標識,譬如時間戳等可以手動過濾X3v28資訊網——每日最新資訊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 數據X3v28資訊網——每日最新資訊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,整個頁面正常展示X3v28資訊網——每日最新資訊28at.com

圖片圖片X3v28資訊網——每日最新資訊28at.com

IndexDB

線上有 CDN 保證了,線下就輪到 IndexDB 了,基于業務簡單的增刪改查,選用 localForage 三方庫足矣。X3v28資訊網——每日最新資訊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 瀏覽器。X3v28資訊網——每日最新資訊28at.com

接口容災我們也是剛弄不久,有許多細節與不足,歡迎溝通交流。X3v28資訊網——每日最新資訊28at.com

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

本文鏈接:http://www.www897cc.com/showinfo-26-35314-0.html我們一起聊聊前端接口容災

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

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

下一篇: 2024 年 Vue 發展預測

標簽:
  • 熱門焦點
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 跑分安卓第一!Redmi K60至尊版8月發布!盧偉冰:目標年度性能之王

    8月5日消息,Redmi K60至尊版將于8月發布,在此前舉行的戰略發布會上,官方該機將搭載搭載天璣9200+處理器,安兔兔V10跑分超177萬分,是目前安卓陣營最高的分數
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • 把LangChain跑起來的三個方法

    使用LangChain開發LLM應用時,需要機器進行GLM部署,好多同學第一步就被勸退了,那么如何繞過這個步驟先學習LLM模型的應用,對Langchain進行快速上手?本片講解3個把LangChain跑起來
  • 如何通過Python線程池實現異步編程?

    線程池的概念和基本原理線程池是一種并發處理機制,它可以在程序啟動時創建一組線程,并將它們置于等待任務的狀態。當任務到達時,線程池中的某個線程會被喚醒并執行任務,執行完任
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內容創建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準備。請在進入步驟2之前進行解壓。圖
  • 華為Mate 60保護殼曝光:碩大后置相機模組 凸起程度有驚喜

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 三星電子Q2營收60萬億韓元 存儲業務營收同比仍下滑超過50%

    7月27日消息,據外媒報道,從三星電子所發布的財報來看,他們主要利潤來源的存儲芯片業務在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設備解決方案
Top 主站蜘蛛池模板: 浮山县| 蓬莱市| 伊金霍洛旗| 富锦市| 巴彦淖尔市| 丹巴县| 科技| 太原市| 朔州市| 兴隆县| 兴安盟| 雷山县| 阿拉善右旗| 吴江市| 海口市| 屏南县| 阿拉尔市| 兰溪市| 马龙县| 灵寿县| 交口县| 凤凰县| 纳雍县| 平塘县| 水富县| 平谷区| 新闻| 镇雄县| 奉新县| 进贤县| 富蕴县| 安乡县| 响水县| 满洲里市| 米泉市| 南丹县| 侯马市| 绿春县| 买车| 正定县| 达拉特旗|