如何從0-1的建設云上穩定性?

一、系統架構

整個系統包含了私有云和公有云兩個節點。前端和服務端存在私有云和公有云兩套系統交互,公有云上的系統為三方黑盒系統。

圖片

帶著上面的五點風險和挑戰,我們從前后端的視角整體制定優化策略和方案。

二、前端策略

作為釘釘的合作產品,必然也是需要保障釘釘的體驗的,這就涉及到如何將三方前端子頁面進行一方化了,我們考慮了以下幾套方案。

圖片

基于穩定性優先的原則,為了能夠使得三方預訂頁面具備可監控、可灰度、可回滾的能力,我們采用方案二:前端微應用的方式進行接入。

2.1?微前端架構

在微前端的架構下,我們將三方前端子應用的打包資源地址配置到釘釘合作域名應用下,當用戶訪問n.dingtalk的域名鏈接時就會走到云上系統,進而訪問三方前端打包資源,這樣的話預訂子應用就具備了一方應用的基礎能力。

圖片

2.2?微前端效果

  1. 域名統一化:可以通過DBase平臺進行灰度放量,保障可灰度、可回滾的基礎能力。

  2. 隔離性:三方H5頁面資源部署在公有云的獨立環境中運行,避免其CSS或JS影響到主應用。

  3. 異常監控:接入Arms監控,建立異常監控機制,可以快速定位和解決接入過程中可能出現的問題,進而實現前端頁面的error監控。

  4. 版本控制:第三方H5的更新應與主應用保持良好的版本控制,避免因版本不一致帶來的問題,通過版本化的構建也可以更好的做到回滾管控。

  5. Jsapi調用:域名統一化后,可以使得三方預訂子頁面絲滑調用釘釘的Jsapi。

三、服務端策略

穩定性的容量預估也是遵循木桶理論的,構成整個系統的各個模塊都有各自的系統吞吐量,而系統最低的那塊木板,很可能就是整個系統的最終吞吐量。我們需要基于線上事件來真實評估最薄弱的一環,通過各模塊各節點的完整評估,我們決定從四個方向(發布前管控、發布中可用、發布后保障、機制&人員保障)挑選最重要的TOP事項快速落地,進而快速提升整個系統的穩定性。

節點

事項

發布前管控

  • 三方系分標準規范化。

  • 三方發布變更強管控。

發布中可用

  • 云上系統發布過程中系統100%可用。

發布后保障

  • 云上系統監控100%覆蓋。

  • 三方頁面白屏感知,自動化UI測試100%覆蓋。

  • 核心鏈路異常降級&預案演練。

  • 多方系統數據一致性保障。

機制&人員保障

  • 早值班機制

  • 穩定性周會機制

  • 保障機制

3.1?發布前管控

3.1.1?部署方案

我們采用公有云上的CI/CD能力,通過云效平臺搭建了一套構建部署的解決方案。

圖片

  1. 創建存儲Bucket:創建一個OSS bucket用來存儲部署物。

  2. 上傳部署物:將本地構建出的部署物(比如jar包、war包等)上傳到指定的OSS bucket,構建出的部署物文件名稱盡可能體現出部署物版本(比如加上版本號、代碼分支信息、commit id等)。

  3. 部署流水線:設定發布審批人,可以選擇或簽、會簽。整個審批環節包含,測試、產品、主管三個審批節點,保障發布環節可控流程化。

  4. 部署物下載:在云效里創建一條發布流水線,將源代碼編譯的環節替換為從OSS下載構建部署物(JAR、WAR等)。

  5. ECS分組部署:可以在ECS分組部署階段添加部署腳本、分組、部署方式等信息。

  6. 釘釘部署通知:部署完成后通過調用云效流水線的web hook自動觸發部署結果通知。

3.1.2?關鍵節點

通過云效的流水線能力,將整個系統的發布在線化,關鍵KP審核,將發布流程強管控,杜絕隨意變更引起的穩定性問題。

權限隔離

  • 三方同學可運行線上流水線,僅運行權限,不可編輯。

KP審批

  • 增加產品審批環節;

  • 增加測試驗收環節;

  • 增加技術負責人審批環節;

流水線部署

  • 可回滾

  • 可監控

  • 釘釘群通知

圖片

圖片

圖片

圖片

3.2?發布中可用

云上系統存在發布過程中的不可用問題,比如系統在發布過程中,會導致用戶以及服務商的系統頁面不可用,是最為急迫解決的問題。

服務商視角

客戶視角

圖片

圖片

目前的部署階段不可用問題是由于nginx不具備高可用能力引起的,云上系統的后端服務器是采用輪詢方式來進行通信的,在發布階段由于輪詢到部署機器導致系統異常。所以根本原因在于nginx不具備健康檢查的能力,導致系統發布階段的不可用問題。

 
server {        location / {            proxy_set_header Host $host;            proxy_set_header   X-Real-IP        $remote_addr;            proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;            proxy_set_header X-Forwarded-Proto $scheme;            proxy_pass http://proxy-pro;  // `proxy_pass` 用于指定一個反向代理的后端服務器        }}
// 對于location指定的后端服務器配置,nginx的默認配置,默認為輪詢通信。upstream api-pro{        server xxx.xx.xx.x:001;}

3.2.1?解決方案

在看清楚問題背后的原因后,理論上是有以下兩種解決方案的。

圖片

基于擴展性及系統高可用的考慮,決定采用方案二。

3.2.2?關鍵節點

步驟一:SLB轉發

首先需要做SLB層的域名路由轉發,需要調整SLB層的監聽配置:

Before

After

圖片

圖片

圖片

圖片

After:HTTP請求之所以強制轉發到HTTPS,原因是期望用戶側的訪問都通過HTTPS的方式進行訪問,安全性更高一些。

基于SLB的轉發策略,對于云上系統進行分發配置,如下:

域名

路徑

端口

服務器

A-test.com

/

10201

192.168.1.1

B-test.com

/

10204

192.168.1.2

C-test.com

/

10202

192.168.1.3

域名路徑轉發邏輯,如下圖所示:

圖片

  • 方式一:前端請求中存在域名,則根據域名匹配轉發策略。

  • 存在匹配該域名的轉發策略,則繼續匹配URL路徑部分。若URL路徑部分也能匹配,則將請求轉發至對應的虛擬服務器組;若URL路徑部分未能命中該域名下的任何規則,則將請求轉發給域名根路徑轉發策略(轉發策略中只配置了域名,沒有配置URL路徑)。

    當用戶沒有為該域名配置根路徑轉發策略時,將向客戶端返回404錯誤。

  • 不存在匹配該域名的轉發策略,則按照方式二匹配轉發策略。

  • 方式二:前端請求中不存在域名或者轉發策略中不存在與之相匹配的域名,則直接匹配無域名轉發策略(轉發策略中只配置了URL,沒有配置域名)。

  • 成功匹配到轉發策略時,將請求轉發至對應的虛擬服務器組;未能匹配到任何轉發策略時,將請求轉發至此監聽配置的服務器組。

步驟二:健康檢查

目前SLB轉發為后端服務器后,可以配置健康檢查策略,如下:

健康檢查配置

圖片

圖片

健康檢查方式

  • 目前通過HTTP HEAD請求的方式進行健康檢查。

  • curl?-Iv?-X?HEAD?http://192.168.1.1:101/

  • 后端服務器組必須在同一個VPC內才可做健康檢查。

圖片

  1. 七層集群中的服務器根據監聽的健康檢查配置,向后端服務器的內網IP+【健康檢查端口】+【檢查路徑】發送HTTP HEAD請求(包含設置的【域名】)。

  2. 后端服務器收到請求后,根據相應服務的運行情況,返回HTTP狀態碼。

  3. 如果在【響應超時時間】之內,七層集群中的服務器沒有收到后端服務器返回的信息,則認為服務無響應,判定健康檢查失敗。

  4. 如果在【響應超時時間】之內,七層集群中的服務器成功接收到后端服務器返回的信息,則將該返回信息與配置的狀態碼進行比對。如果匹配則判定健康檢查成功,反之則判定健康檢查失敗。

圖片

3.2.3?治理效果

基于super后臺做了一輪測試驗證,結果符合預期。

Before

通過nginx進行路由且無健康檢查時,部署過程中會有頁面訪問失敗的情況。

圖片

圖片

After

部署過程中可以根據健康檢查情況路由分發流量,保障部署階段的可用性。

圖片

圖片

3.3?發布后保障

3.3.1?云上核心監控

大盤監控

?ECS機器監控大盤

數據庫監控大盤

圖片

圖片

圖片

釘釘群監控報警:

圖片

圖片

3.3.2?數據離線核對

由于平臺涉及到和三方的數據流入流出,如果數據不一致會導致用戶月度結算、購票等鏈路的使用及體驗問題,所以我們建立了和三方的對賬能力,通過該基礎能力可以在T+1的時效內發現三方的系統問題,進而規避系統風險。

圖片

  1. 向各個服務商提供sFTP服務器賬戶密碼,分配不同的文件bucket。

  2. 服務商定時上傳對賬文件到oss文件服務器。

  3. ODPS創建明細對賬表、總賬對賬表。

  4. ODPS上針對各個服務商單獨創建同步任務,從oss服務器同步文件數據至對應的離線表。

  5. 通過MAC核對平臺,針對各個服務商部署單獨的核對任務。

3.3.3?UI自動化測試

平臺接入了10余家專業的行業頭部ISV,這更加劇了平臺可用性的隱患,在三方頁面不可用的情況下,便會導致用戶投訴反饋。

圖片

基礎監控

在梳理了核心場景之后,我們通過UI自動化測試每天定時掃描三方頁面的可用性,通過斷言的方式發現核對三方頁面的有效性。

 
def test_Platform_model_trip_business_travel_ticket_booking(self):        # 輪詢是否有判斷頁面是否加載完成        mobile.loop_exist_pic("xx_xxx",subfolder="smart_pic/platform_mode/isv")        # 點擊選擇第一個票務        x = mobile.get_screenshot_resolution()[0] / 2.0 / mobile.get_scale()        y = mobile.get_screenshot_resolution()[1] / 5.0 * 2 / mobile.get_scale()        mobile.get_driver().click(x, y)        #  斷言查詢是否有預定按鈕,否則就提示服務商沒有可預訂的訂單        assert mobile.loop_exist_text('預訂')[0], '服務商沒有可預訂的訂單'
 

當預期的斷言失敗后就會推送到群內報警,并可以通過詳情查看到具體的異常頁面,如下所示:

圖片

針對異常的case,可以通過查看詳情明確具體的異常節點,對于快速定位問題很有幫助。

圖片

3.4?機制保障

  • 早值班機制:每天釘釘和三方生態伙伴同學需要發早值班日志,針對發現的問題在排期優化解決。

  • 穩定性周會機制:通過穩定性周會的方式同步風險和治理進展。

  • 人員地圖:建立每個服務商的系統保障人員地圖,發現線上非預期問題,可以快速聯系到相關同學及時解決,保障1分鐘發現、5分鐘定位、10分鐘恢復。

四、治理成果

總體來說合作產品模式遇到了以下幾個風險和挑戰:

  1. 方案無感知:純黑盒模式下對系統細節感知弱,變更風險高。

  2. 無發布管控:云上系統部署不可控,三方部署內容感知弱、部署頻率不可控。

  3. 無灰度能力:云上系統部署無灰度能力,部署即全量。

  4. 無監控能力:云上系統監控感知弱,三方日志規范不標準,監控成本高。

  5. 安穩意識弱:三方人員安穩意識薄弱,三方故障等于釘釘故障。

整個治理過程,沉淀了通用的公有云CI/CD能力,實現了公有云發布三板斧的能力建設,并建立了平臺持續、穩定、可靠的穩定性保障機制。

  1. 完善公有云發布管控能力:建立完整的云上系統CI/CD能力,保障無任何由于線上變更操作失誤導致的線上問題。

  2. 建立發布三板斧基礎能力:具備可灰度、可回滾、可監控的基礎能力。在一個月的治理過程中,通過系統監控、UI自動化測試提前發現并規避了6起線上問題,通過離線核對發現并解決服務商及平臺系統8例缺陷。

  3. 優化高可用的運維能力:通過負載均衡健康檢查路由的方案解決三方系統發布過程中,由于流量切換導致部分請求不可用的問題,治理完成后無任何由于部署過程導致用戶體驗中斷或完全不可用的問題。

  4. 建立穩定性保障機制:建立同三方的穩定性周會、早值班等機制,通過階段性的宣講和總結提升三方同學對于共建系統的穩定性意識。

治理前

治理后

可監控

?

?

可灰度

?

?

可回滾

?

?

發布管控

?

?

事件數

5/月

0

五、未來展望

目前平臺業務在快速發展中,如何在快速的業務發展和夯實底座之間保持平衡,未來我們會繼續鞏固建設平臺的穩定性基座。總之穩定性是一個持久的戰役、關注細節的戰役,基礎不穩,地動山搖,穩定性是技術人的底線和生命線!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75245.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75245.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75245.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【學Rust寫CAD】17 通用2D仿射變換矩陣結構體(matrix/generic.rs)

源代碼 // matrix.rs use std::ops::{Add, Mul};use std::ops::{Add, Mul};/// 通用2D仿射變換矩陣&#xff08;元素僅需Copy&#xff09; #[derive(Clone, Copy, Debug, PartialEq)] pub struct Matrix<X, Y, Xx, Xy, Yx, Yy> {pub x: X, pub y: Y,pub xx: Xx, pub xy:…

Spring Boot @RequestParam 解析參數時的常見問題及解決方案

1&#xff0c;遇到的問題&#xff1a;將后端接口寫完后我想通過PostMan進行簡單的測試一下&#xff0c;一不小心就遇到了這樣的情況&#xff1a; org.springframework.web.bind.MissingServletRequestParameterException: Required Integer parameter contractId is not prese…

Golang中間件的原理與實現

一. 什么是 Middleware&#xff1f; 中間件&#xff08;Middleware&#xff09; 是一種 高階函數&#xff0c;它接受一個函數作為輸入&#xff0c;并返回一個經過增強的函數。它的核心思想是通過函數的遞歸嵌套&#xff0c;動態地為函數添加功能。在 Golang 中&#xff0c;中間…

算法設計學習3

實驗目的及要求&#xff1a; 1.加強對結構體的應用。 2.熟悉字符計數排序。 實驗設備環境&#xff1a; 1.微型計算機 2.DEV C(或其他編譯軟件) 實驗步驟&#xff1a; 任務&#xff1a;要求使用自定義函數來實現 輸入一段文本&#xff0c;統計每個字符出現的次數&#xff0c;按…

Vue2和3的vue-router:生命周期、懶加載

Vue2 vue-router 在 Vue 2 中使用 vue-router 可以方便地管理單頁面應用&#xff08;SPA&#xff09;中的路由。理解 vue-router 的生命周期和懶加載機制對于構建高效的 Vue 應用至關重要。以下是一些關鍵點和示例代碼來幫助你理解這些概念。 Vue Router 的生命周期 vue-rou…

【408--考研復習筆記】計算機網絡----知識點速覽

目錄 一、計算機網絡體系結構 1.計算機網絡的定義與功能&#xff1a; 2.網絡體系結構相關概念&#xff1a; 3.OSI 七層模型與 TCP/IP 模型&#xff1a; 4.通信方式與交換技術&#xff1a; 電路交換 報文交換 分組交換 5.端到端通信和點到點通信&#xff1a; 6.計算機…

MySQL-- 多表查詢的分類,SQL92與SQL99,7種JOIN的實現,SQL99語法的新特性

目錄 一&#xff0c;多表查詢的分類 角度1&#xff1a;等值連接 vs 非等值連接 角度2&#xff1a;自連接 vs 非自連接 角度3&#xff1a;內連接 vs 外連接 二&#xff0c;SQL92語法實現內連接&#xff1a;見上&#xff0c;略SQL92語法實現外連接&#xff1a;使用 -…

時間輪算法:原理、演進與應用實踐指南

目錄 1. 時間輪算法基礎 1.1 什么是時間輪算法&#xff1f; 1.2 核心組成部分 2. 基本時間輪的實現機制 2.1 時間輪的構成要素 2.2 工作原理詳解 3. 基本時間輪的局限性 3.1 時間范圍限制問題 3.2 簡單解決方案及其缺陷 4. 時間輪算法的演進 4.1 Round機制&#xff…

Unity 常見報錯 定位和查找方法

1.控制臺 直接看報錯信息 2.打log 例子&#xff1a; for(int i 0;i < 8;i) {Debug.Log(i);//這是打的log,看看到底i是幾的時候出問題gameObject.name strs[i];} 3.斷點調試 &#xff08;1&#xff09;在你想打斷點的行&#xff0c;左邊空白處點擊可以打斷點&#xff…

第十八章:Python實戰專題:北京市水資源數據可視化與圖書館書籍管理應用開發

今天我要和大家分享兩個非常有趣的Python實戰項目&#xff1a;一個是北京市2001-2017年水資源數據的可視化分析&#xff0c;另一個是圖書館書籍管理應用程序的開發。這兩個項目都使用了Python的主流庫&#xff0c;比如Pandas、Matplotlib和Tkinter&#xff0c;非常適合初學者學…

音視頻基礎(音視頻的錄制和播放原理)

文章目錄 一、錄制原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 二、播放原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 一、錄制原理 這張圖展示…

Nginx多域名HTTPS配置全攻略:從證書生成到客戶端安裝

一、業務背景 在現代Web開發中&#xff0c;HTTPS已成為保障數據傳輸安全的標準協議。特別是對于地圖類API服務&#xff08;如高德地圖&#xff09;&#xff0c;往往需要同時支持多個子域名&#xff08;如webapi.amap.com、restapi.amap.com等&#xff09;的HTTPS訪問。傳統方式…

Redis原理:rename命令

RENAME key newkey 將一個key重命名為新key&#xff0c;如果key不存在&#xff0c;則會返回異常。如果newKey已經存在&#xff0c;則會被覆蓋&#xff0c;其實newKey會被顯示的刪除&#xff0c;所以如果newKey是一個大key&#xff0c;則會引起延遲。 源碼 void renameCommand…

k8s污點與容忍

k8s污點與容忍 k8s污點管理常用命令effect標記值查看污點添加污點刪除污點 node污點與容忍污點容忍yaml示例容忍放大基于污點的驅逐驅逐時排除指定服務 設置master調度設置master盡量不調度允許master節點調度pod恢復Master Only狀態將node標記為不可調度狀態(節點警戒)設置nod…

(BFS)題解:P9425 [藍橋杯 2023 國 B] AB 路線

題解&#xff1a;P9425 [藍橋杯 2023 國 B] AB 路線 題目傳送門 P9425 [藍橋杯 2023 國 B] AB 路線 一、題目描述 給定一個NM的迷宮&#xff0c;每個格子標記為A或B。從左上角(1,1)出發&#xff0c;需要移動到右下角(N,M)。移動規則是&#xff1a;必須交替走K個A格子和K個B…

python-leetcode 62.搜索插入位置

題目&#xff1a; 給定一個排序數組和一個目標值&#xff0c;在數組中找到目標值&#xff0c;并返回其索引。如果目標值不存在于數組中&#xff0c;返回它將會被按順序插入的位置 方法一&#xff1a;二分查找 假設題意是在排序數組中尋找是否存在一個目標值&#xff0c;則可以…

【計網速通】計算機網絡核心知識點和高頻考點——數據鏈路層(一)

數據鏈路層核心知識點&#xff08;一&#xff09; 一、數據鏈路層概述 1.1 基本概念 數據鏈路層位于OSI模型的第二層&#xff0c;介于物理層和網絡層之間&#xff0c;主要負責在相鄰節點之間傳輸和識別數據幀。 1.2 主要功能 幀同步&#xff1a;識別幀的開始和結束差錯控制…

模型部署與調用

目錄 部署 ollama下載 模型版本選擇 ?編輯 對照表 控制臺執行 調用 部署 大模型部署我使用的是Ollama&#xff0c;點擊跳轉 接下來我將在本地使用ollama就行模型部署的演示 ollama下載 模型版本選擇 對照表 大家可以根據自己的顯卡配置選擇對應的模型版本 控制臺執…

Rstudio如何使用Conda環境配置的R

前言 Rstudio作為一款流行的R語言集成開發環境&#xff08;IDE&#xff09;&#xff0c;為用戶提供了便捷的編程體驗。然而&#xff0c;不同項目可能需要不同版本的R&#xff0c;這就需要我們靈活切換R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定義 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;即資源獲取即初始化&#xff0c;是C中用于管理資源生命周期的一種重要編程模式。其核心在于將資源的獲取和釋放操作與對象的生命周期緊密綁定。當對象被創建時&#xff0c;資源…