線上多功能變數名稱實戰

来源:https://www.cnblogs.com/waynaqua/archive/2023/04/22/17344128.html
-Advertisement-
Play Games

本文博主給大家分享線上多功能變數名稱實戰,當線上主功能變數名稱不可用的情況下,啟用備用功能變數名稱完成網站高可用保障。 網站的高可用性一直是網站運維的重中之重。一旦網站宕機,不僅會造成巨大的經濟損失,也會嚴重影響用戶體驗。備份功能變數名稱就是一種實現網站高可用的重要手段。通過備份功能變數名稱,可以在主功能變數名稱不可訪問時快速切換功能變數名稱,保證網站正 ...


本文博主給大家分享線上多功能變數名稱實戰,當線上主功能變數名稱不可用的情況下,啟用備用功能變數名稱完成網站高可用保障。

網站的高可用性一直是網站運維的重中之重。一旦網站宕機,不僅會造成巨大的經濟損失,也會嚴重影響用戶體驗。備份功能變數名稱就是一種實現網站高可用的重要手段。通過備份功能變數名稱,可以在主功能變數名稱不可訪問時快速切換功能變數名稱,保證網站正常運行。

一、前情回顧

博主上個星期,線上項目突然出現了少量用戶無法打開項目網站,技術支持聯繫技術人員(也就是博主我)在用戶電腦上復現了這一情況。

經過博主排查,發現在客戶電腦訪問主功能變數名稱時,會出現連接超時,通過 curl 進一步分析連接詳情,舉例如下:

C:\Users\16697>curl -v www.wayn.com

* Uses proxy env variable http_proxy == 'http://11.22.11.22:4780'
*   Trying 11.22.11.22:4780...

發現線上主功能變數名稱在用戶電腦上返回的 CDN 節點 11.22.11.22 存在訪問不通的情況。博主便跟運維溝通 CDN 節點不通的問題,運維回覆是 CDN 節點不通是無法避免的,要看 CDN 廠商對於用戶的覆蓋情況,建議線上項目使用多功能變數名稱,並且每個功能變數名稱使用不同的 CDN 廠商,最大限度避免主備功能變數名稱都不可用。

OK,得到的運維的意見,我們開始著手做多功能變數名稱實現方案。

二、購買備用功能變數名稱

實現功能變數名稱高可用解決方案,首先需要準備一到兩條與主功能變數名稱功能和形式相似的備份功能變數名稱。如下

主功能變數名稱
www.wayn.com

備用功能變數名稱一
bak1.wayn.com

備用功能變數名稱二
bak2.wayn.com

購買備份功能變數名稱後,需要註意一下兩點:

  1. 需要在功能變數名稱服務商那設置DNS記錄,將主功能變數名稱和備份功能變數名稱指向同一個IP地址。同時也需要為兩個功能變數名稱設置相同的CDN加速和安全證書,保證用戶訪問體驗一致。
  2. 將備份功能變數名稱的網站配置(nginx配置文件)與主功能變數名稱保持一致。確保使用備份功能變數名稱也可以訪問我們的網站。

三、主備功能變數名稱切換實戰

這裡我們介紹一下通過 JavaScript 代碼來實現網站的主備功能變數名稱如何進行切換。

JavaScript 實現功能變數名稱切換的流程如下:

  1. 在頁面啟動時,首先發起對主功能變數名稱的請求,判斷其是否能夠正常響應。如果啟動時主功能變數名稱不可訪問,就會訪問備份功能變數名稱。針對每個備用功能變數名稱每隔一秒發送三次請求,如果都能訪問成功則認為備用功能變數名稱可用。代碼如下:
// ES6 的模塊引入方式
import fetch from 'node-fetch'

const domain = 'https://www.wayn111.com'
const bakDomains = ['http://bak1.wayn.com', 'http://baidu.com']

masterDomainCheck()

// 主功能變數名稱檢測,如果不可用會檢查備用功能變數名稱是否可用
async function masterDomainCheck() {
  try {
    await fetch(domain)
    console.log('主功能變數名稱啟用成功')
  } catch (e) {
    // console.log(e)
    try {
      await getBakDomain()
      console.log('備用功能變數名稱可用')
    } catch (e) {
      console.log('備用功能變數名稱也不可用')
    }
  }
}

// 訪問備用功能變數名稱,返回其中可用的一個功能變數名稱
async function getBakDomain() {
  const apiPromiseList = []
  for (let i = 0; i < bakDomains.length; i++) {
    apiPromiseList.push(
      new Promise((resolve, reject) => {
        bakDomainCheck(bakDomains[i], 3, resolve, reject)
      })
    )
  }
  return await Promise.any([...apiPromiseList])
}

// 功能變數名稱檢測邏輯
async function bakDomainCheck(url, count, resolve, reject) {
  console.log(count)
  if (count > 0) {
    try {
      await fetch(url)
      bakDomainCheck(url, --count, resolve, reject)
    } catch (e) {
      console.log('e')
      reject(e)
    }
  } else {
    console.log(`bak domain:${url} access success`)
    resolve({ url, count })
  }
}

以上代碼經過博主實測,大家感興趣可以將代碼拷貝在本地跑一遍。

  1. 如果主功能變數名稱啟動時正常,則開始定時監測主功能變數名稱的可訪問性。每30秒發起一次請求,判斷主功能變數名稱的HTTP狀態碼是否為200。
// 主功能變數名稱正常,開始定時監測
setInterval(() => {
  fetch('https://www.wayn111.com')
    .then(res => {
      if (res.status !== 200) {
        switchDomain() 
      }
    })  
}, 30000)
  1. 一旦監測到主功能變數名稱故障,開始調用 JavaScript 函數,找到頁面所有包含主功能變數名稱的鏈接,並將其替換為備份功能變數名稱。
// 開始替換頁面內功能變數名稱為備份功能變數名稱
function switchDomain() {
  let links = document.querySelectorAll('a')
  for (let i=0; i<links.length; i++) {
    if (links[i].href.indexOf('https://www.wayn111.com') > -1) {
      links[i].href = links[i].href.replace('https://www.wayn111.com'
              , 'https://bak1.wayn.com')
    }
  }
}
  1. 繼續定時監測主功能變數名稱,在主功能變數名稱恢復正常時,調用 JavaScript 函數將備份功能變數名稱的鏈接替換回主功能變數名稱。
// 定時檢查主功能變數名稱故障恢復,一旦恢復再切回主功能變數名稱  
setInterval(() => {
  fetch('https://www.wayn111.com')
    .then(res => {
      if (res.status === 200) { 
        switchDomainBack()
      }
    })  
}, 5000)

function switchDomainBack() {
  let links = document.querySelectorAll('a')
  for (let i=0; i<links.length; i++) {
    if (links[i].href.indexOf('https://bak1.wayn.com') > -1) {
      links[i].href = links[i].href.replace('https://bak1.wayn.com'
              , 'https://www.wayn111.com')
    }
  }
}
  1. 這樣通過 JavaScript 檢測功能變數名稱狀態與自動切換,可以最大限度減少功能變數名稱切換造成的訪問中斷時間,確保網站高可用。

希望大家通過這個案例,能對線上用多功能變數名稱來實現高可用網站有一個較為全面的認知。網站過於依賴某單一功能變數名稱存在潛在風險,備份功能變數名稱的引入主要是解決少數場景下用戶訪問不通我們網站的問題。

最後感謝大家閱讀,喜歡的朋友可以點贊加關註,你的支持將是我的更新動力

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 下載CentOS6.5系統源 http://mirror.nsc.liu.se/centos-store/6.5/isos/x86_64/CentOS-6.5-x86_64-bin-DVD1.iso 下載CentOS6.5系統的yum組件 http://mirror.nsc.liu.se/cento ...
  • Linux核心命令系列文章目錄 快速上手Linux核心命令(一):核心命令簡介 快速上手Linux核心命令(二):關機、重啟 快速上手Linux核心命令(三):文件和目錄操作命令 快速上手Linux核心命令(四):文件內容相關命令 快速上手Linux核心命令(五):文本處理三劍客 快速上手Linux ...
  • 平臺 windows 需 求 由於我近期有一個比賽,而我的主機又是x86架構的,人家要求使用arm架構的主機,我這窮屌絲,不可 能去買一臺吧,而且隨著國產系統的推進,採用arm架構的主機也越來越多,作為運維我們該怎麼利用x86 來運行arm架構的主機成為了一個問題 需 要的軟體和程式 以下軟體版本皆 ...
  • 1.硬體 GD32F103C8T6最小系統板 ST-LINK V2下載器 2.GPIO說明 每個通用I/O埠都可以通過兩個32位的控制寄存器(GPIOx_CTL0/ GPIOx_CTL1)和兩個32位 的數據寄存器(GPIOx_ISTAT, GPIOx_OCTL)配置為8種模式:模擬輸入,浮空輸入 ...
  • 首先,我準備了兩台linux,一臺準備當作master,ip是192.168.241.128,另一臺是當作slave,ip是192.168.241.129。 1. 安裝redis docker pull redis 2. 下載對應版本的redis.conf 可以從github上下載。新建配置環境目錄 ...
  • 錄音需求中,往往有兩種常規操作。 長按基本實現流程: 監聽觸摸事件,按下時錄製,抬起時停止。 點擊基本流程: 點擊開始錄製,在次點擊停止錄製 但是凡事有絕對,如果需要同時支持長按錄製抬起結束跟點擊錄製在次點擊結束呢?面對如此無理的需求,從技術層面上怎麼如絲滑般去相容呢。 需要兩者相容,只能從觸摸事件 ...
  • 為什麼要使用Composition API? 根據官方的說法,vue3.0的變化包括性能上的改進、更小的 bundle 體積、對 TypeScript 更好的支持、用於處理大規模用例的全新 API,全新的api指的就是本文主要要說的組合式api。 在 vue3 版本之前,我們復用組件(或者提取和重用 ...
  • WebSocket與Sock.js介紹今天先到這兒,希望對雲原生,技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管管,團隊建設 有參考作用 , 您可能感興趣的文章: 領導人怎樣帶領好團隊構建創業公司突擊小團隊國際化環境下系統架構演化微服務架構設計視頻直播平臺的系統架構演化微 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...