首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

ATS 代理伺服器:源站故障時透過過期快取暫時服務用戶請求的兩種實現方案

     編輯:Java 綜合教學

業務場景

當源站發生超時、宕機、返回 502/504 等錯誤時,ATS (Apache Traffic Server) 預設會將錯誤直接回傳給用戶,造成體驗中斷。期望行為:若 ATS 本地存在**已過期**的快取內容,暫時回傳舊內容(HTTP 200),待源站恢復後再更新快取。

方案一:開發 ATS 外掛擴充功能

攔截源站回應,判斷狀態碼為 502/504 且本地存在過期快取時,直接服務過期內容並修改回應碼為 200。優點:邏輯可控、可自定義降級策略;缺點:開發維護成本高、需 C/C++ 語言編寫、升級 ATS 版本可能需適配。

方案二:利用 ATS 內建 proxy.config.http.cache.max_stale_age 參數(零代碼、推薦)

核心配置

# records.config
CONFIG proxy.config.http.cache.max_stale_age INT 604800

含義:當無法從源站獲取新鮮內容時,允許繼續服務過期快取的最大秒數(預設 604800 秒 = 7 天)。

行為流程圖解

  1. 源站正常:回應 TCP_HIT/200,Proxy-Connection: keep-alive。
  2. 源站剛停機,首次請求:回應 TCP_REFRESH_FAIL_HIT/200,標頭含 Warning: 111 DLC-3.0、Proxy-Connection: close,表示正在服務過期快取且關閉連線。
  3. 源站仍停機,後續請求(在 max_stale_age 內):回應 TCP_HIT/200,含 Warning: 111 DLC-3.0、Proxy-Connection: keep-alive,持續服務過期內容。
  4. 超過 max_stale_age 後再請求:回應 TCP_REFRESH_FAIL_HIT/502,不再服務過期快取,回傳真實錯誤。

前置條件

ATS 必須**已快取該資源且快取已過期**。若從未快取或快取尚未過期,則不觸發此機制。

實測回應標頭對比

場景關鍵標頭特徵
正常服務Proxy-Connection: keep-alive
源站停機首請Proxy-Connection: close
Warning: 111 DLC-3.0
源站停機後續請Proxy-Connection: keep-alive
Warning: 111 DLC-3.0
超過容忍時間HTTP/1.1 502 Connection refused

運維建議

  • 根據業務對資料時效性容忍度調整 max_stale_age(如新聞類可縮短至 1 小時,靜態資源可延長至 1 週)。
  • 監控 TCP_REFRESH_FAIL_HIT 比例,作為源站健康度告警指標。
  • 搭配 proxy.config.http.cache.required_headers 確保關鍵資源可被快取。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved