最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Next.js服務端渲染超時導致生產(chǎn)事故的問題排查和解決辦法

 更新時間:2025年03月05日 10:29:34   作者:HyaCinth  
Next.js是一個基于React的開源框架,用于構建服務端渲染(SSR)的Web應用程序,它簡化了許多復雜的配置,讓開發(fā)者可以專注于編寫應用邏輯而不是基礎設施,前幾天公司平臺首頁崩潰了 504 Time-out,這里記錄一下問題排查和解決的過程,需要的朋友可以參考下

前言

前幾天公司平臺首頁崩潰了 504 Time-out,這里記錄一下問題排查和解決的過程。

排查和解決

排查過程

  • step 1:檢查測試環(huán)境、開發(fā)環(huán)境未出現(xiàn)問題;
  • step 2:檢查生產(chǎn)環(huán)境流水線,沒有最新部署,排除前端新部署代碼影響;
  • step 3:檢查生產(chǎn)環(huán)境其他頁面/about-us頁面展示正常,但是部分接口報錯超時。猜測是因為生產(chǎn)環(huán)境接口超時導致首頁的服務端請求返回超時,導致首頁返回超時;
  • step 4:本地開發(fā)調(diào)用生產(chǎn)環(huán)境接口,將所有在getServerSideProps中發(fā)起的請求全部注釋后,首頁可以正常加載。

問題定位

首頁開啟了SSR渲染,getServerSideProps中的請求使用了簡單的fetch請求,只對普通錯誤做了兜底,但沒有考慮到請求超時的問題,請求超時導致了頁面返回超時,首頁報了504錯誤。

解決方案

優(yōu)化方案

  • 放棄使用SSR渲染,全部采用客戶端請求渲染;
  • 修改現(xiàn)有fetch,通過AbortController、setTimeout手動添加超時處理;
  • getServerSideProps的請求方式從fetch遷移到axios,借助axios本身自帶的超時配置,添加接口超時處理。

方案比較

  • 放棄SSR不可取,因為客戶端并發(fā)請求返回順序的問題可能會導致首頁的入場動畫混亂,且失去了部分首屏性能優(yōu)化;
  • 修改fetch方法,需要手寫大量代碼,且AbortController是在Node.js 14.17.0+開始支持,當然也可以不去放棄掉請求,可以通過setTimeoutPromise.race提前reject,不過需要因為是自行實現(xiàn),風險大。
  • axios是十分成熟的請求庫,且項目中已經(jīng)引入,通過axios為請求添加超時處理十分方便。

實際解決方案

fetch遷移到axios,借助axios已有的超時處理配置解決當前問題,添加首頁對getServerSideProps中請求超時的兜底,服務端請求超時后,立即返回空數(shù)組。

首頁所有的數(shù)據(jù)消費組件繼續(xù)兜底,當從getServerSideProps中獲取的數(shù)據(jù)為空數(shù)組時,會在客戶端再發(fā)一次請求,嘗試從客戶端獲取數(shù)據(jù)。

import axios from 'axios';

const ssrAxios = axios.create({
  timeout: 3000,
  timeoutErrorMessage: 'Request timed out'
});

export default ssrAxios;
export const getServerSideProps = async () => {
  const addr = process.env.API_ADDR;

  // 使用 Promise.allSettled 獲取所有請求的結果
  const [
    list1Res,
    // ... ,
    list2Res,
  ] = await Promise.allSettled([
    ssrAxios.get(`${addr}/api/list1`),
    // ... ,
    ssrAxios.get(`${addr}/api/list2`),
  ]);

  // 處理每個請求的結果
  const list1 = handleFetchResult(list1Res, 'list1');
  // ... ;
  const list2 = handleFetchResult(list2Res, 'list2');

  return {
    props: {
      list1: list1 ?? [],
      // ... ,
      list2: list2 ?? []
    },
  };
};

// Helper function to handle fetch results
const handleFetchResult =  (result: PromiseSettledResult<any>, key: string) => {
  if (result.status === 'rejected') {
    console.error(`Failed to fetch ${key}:`, result.reason);
    return [];
  }

  const { data, success } = result.value.data;
  if (!success) {
    console.error(`Failed to fetch ${key}`);
    return [];
  }

  switch (key) {
    case 'list1':
      return data?.result || [];
	// ... ;
    case 'list2':
      return data?.result || [];
    default:
      return [];
  }
};

問題探究

問題猜測

  • 接口性能瓶頸:生產(chǎn)環(huán)境接口響應時間波動大,SSR并發(fā)請求存在短板
  • SSR 超時機制缺失:未設置合理的請求超時閾值,導致慢請求影響頁面的生成和響應
  • 錯誤處理不完善:前端錯誤處理考慮不全面,未區(qū)分超時錯誤與常規(guī)錯誤,只做了無返回或返回錯誤的處理,沒有對請求超時做兜底。

驗證猜想

本地模擬接口返回超時,首頁會無法成功加載。添加超時處理兜底后,首頁其他內(nèi)容可以正常展示。

詢問deepseek后,得知Next.jsgetServerSideProps沒有內(nèi)置超時處理機制,因此長時間運行的getServerSideProps可能導致頁面無法及時返回,甚至觸發(fā)部署平臺(如Vercel)的超時錯誤。

結論

首頁開啟了SSR渲染,Next.js 必須在完成getServerSideProps中的所有操作后才能生成頁面并返回給客戶端。 需要在得到所有需要的props后,才會返回整個頁面。因為生產(chǎn)環(huán)境某個接口請求超時,并且沒有正確處理,可能會導致整個getServerSideProps的執(zhí)行時間延長,超過服務器的響應時間限制,從而使得頁面無法及時返回,出現(xiàn)超時錯誤。

思考改進

思考

雖然是因為后端服務崩了,接口請求超時導致的問題,但是因為部分服務崩掉導致整個前端首頁無法成功加載,作為前端開發(fā)人員的我還是有很大責任的。開發(fā)時我在對可能出現(xiàn)的錯誤進行兜底時,需要盡可能地考慮全面。

改進

服務端請求優(yōu)化,錯誤處理添加對請求超時的處理。

① 首次訪問使用SSR獲取最新數(shù)據(jù);

② 當SSR超時時自動降級到 CSR版本 ;

③ 保持首屏加載性能的同時提升可用性。

以上就是Next.js服務端渲染超時導致生產(chǎn)事故的排查和解決辦法的詳細內(nèi)容,更多關于Next.js服務端渲染超時的資料請關注腳本之家其它相關文章!

相關文章

  • IE6 fixed的完美解決方案

    IE6 fixed的完美解決方案

    IE7已經(jīng)支持position:fixed了,而我們的IE6呢?還繼續(xù)使用js事件?消耗資源,破壞結構,畫面閃耀。
    2011-03-03
  • 移動端界面的適配

    移動端界面的適配

    本文主要介紹了移動端頁面適配相關知識,用于解決在所有手機上看到字體的大小都一樣問題。下面跟著小編一起來看下吧
    2017-01-01
  • 實現(xiàn)局部遮罩與關閉原理及代碼

    實現(xiàn)局部遮罩與關閉原理及代碼

    實現(xiàn)局部遮罩,或許對某些朋友有著特殊的意義。局部遮罩的原理很簡單另外加上關閉就有著另一番的效果,本文將介紹實現(xiàn)方法,感興趣的朋友可以了解下,或許對你有所幫助
    2013-02-02
  • js/jquery解析json和數(shù)組格式的方法詳解

    js/jquery解析json和數(shù)組格式的方法詳解

    本篇文章主要是對js/jquery解析json和數(shù)組格式的方法進行了詳細的介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-01-01
  • JavaScript中的數(shù)組遍歷forEach()與map()方法以及兼容寫法介紹

    JavaScript中的數(shù)組遍歷forEach()與map()方法以及兼容寫法介紹

    下面小編就為大家?guī)硪黄狫avaScript中的數(shù)組遍歷forEach()與map()方法以及兼容寫法介紹。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • javascript addLoadEvent函數(shù)說明

    javascript addLoadEvent函數(shù)說明

    網(wǎng)頁加載完整后會觸發(fā)一個onload事件,默認地一個事件只能和一個函數(shù)綁定。
    2010-01-01
  • 瀏覽器兼容的JS寫法總結

    瀏覽器兼容的JS寫法總結

    瀏覽器兼容的JS寫法總結,涵蓋的內(nèi)容很全面,感興趣的小伙伴們可以參考一下
    2016-04-04
  • js判斷是否為空和typeof的用法(詳解)

    js判斷是否為空和typeof的用法(詳解)

    下面小編就為大家?guī)硪黄猨s判斷是否為空和typeof的用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-10-10
  • mui上拉加載更多下拉刷新數(shù)據(jù)的封裝過程

    mui上拉加載更多下拉刷新數(shù)據(jù)的封裝過程

    mui的上拉加載和下拉刷新類似,都屬于pullRefresh插件。今天小編抽空給大家分享mui上拉加載更多下拉刷新數(shù)據(jù)的封裝過程,需要的朋友參考下吧
    2017-11-11
  • uniapp禁止遮罩層下頁面滾動的解決方法

    uniapp禁止遮罩層下頁面滾動的解決方法

    在uniapp的開發(fā)中用過彈窗的都知道有個bug就是滑動彈窗的內(nèi)容底部頁面也會跟著滑動,所以這篇文章主要給大家介紹了關于uniapp禁止遮罩層下頁面滾動的解決方法,需要的朋友可以參考下
    2023-09-09

最新評論

平遥县| 长泰县| 漯河市| 类乌齐县| 错那县| 绥棱县| 通化市| 阿鲁科尔沁旗| 南岸区| 阿克苏市| 佛山市| 安义县| 长葛市| 宁海县| 台中市| 潞城市| 蛟河市| 邢台县| 扎赉特旗| 壶关县| 博罗县| 三都| 额尔古纳市| 临澧县| 马公市| 汪清县| 灌云县| 河池市| 鄂温| 渭源县| 泰兴市| 辛集市| 信丰县| 克东县| 大石桥市| 新邵县| 木里| 新丰县| 云霄县| 双江| 丹阳市|