A.業務降級的背景知識:
淘寶就雙十一課題曾經講過:
『所謂業務降級,就是犧牲非核心的業務功能,保證核心功能的穩定運行。簡單來說,要實現優雅的業務降級,需要將功能實現拆分到相對獨立的不同代碼單元,分優先級進行隔離。 在后台通過開關控制,降級部分非主流程的業務功能,減輕系統依賴和性能損耗,從而提升集群的整體吞吐率。』
主動關閉系統功能的場景:
B.窩窩業務降級的實操:
與之前窩窩實現的業務降級不同,研發1部的明駿把 降級功能配置 與 降級項目配置 分開,如下圖1所示:
圖1 業務降級配置管理的菜單項
即:
一,降級的最小單位是 功能
我可以單獨針對“(首頁右側欄)熱門專賣店(列表)”功能。如下圖2所示,配置狀態為“未過濾”代表該功能未被攔截。
圖2 功能配置實例
1.1.可以獲知該(URL/class攔截)功能在哪些項目里生效。如上圖2中的“所含項目配置”列所示。
1.2.可以配置跳轉地址,如下圖3所示。第一,如果功能過濾啟用了,當攔截到目標后,需要引導瀏覽器跳轉到哪一個頁面,譬如跳到停服公告頁上。第二,可以定義啟用時間,比如明天凌晨1點。
圖3 功能配置詳情頁
1.3.如果一個功能被多個項目包含,比如“(通欄)廣告”功能被 aether 和 mars 包含,那么當這個功能處於“已過濾”時,aether 和 mars 上的通欄廣告就會都消失,即使這兩個項目的配置狀態為“未過濾”。
1.4.過濾某個功能,點擊配置狀態列的按鈕即可,啟用狀態如下圖4所示。
圖4 功能處於已過濾
二,功能 之上是 項目
2.1.項目 的出現,是為了更靈活多樣地降級。
2.2.你既可以過濾橫跨多個項目的一個功能,一關全關。你也可以只關某個項目里的功能集合,比如你可以只關閉 aether 工程里的通欄廣告和推薦列表。
2.3.當 項目 處於“已過濾”狀態時,不想過濾某個功能,那就勾掉它,如下圖5所示。
圖5 項目配置詳情頁
2.4.在 被動關閉系統功能場景 里,由於目前還沒有開發 預案級降級,所以最快的辦法是,到 降級功能配置管理 里,把相關功能的開關全部打開。
2.5.有了基於 功能和項目 的降級配置管理,下一步就可以基於(遠端)服務質量做自動降級了。
三,項目 之上是 預案
3.1.舉例,紅色預警預案將關閉所有 下單、支付、充值 等功能,橙色預警預案將關閉所有 推薦、評價、積分 等功能。
3.2.預案 級別的降級控制目前還沒有實現。
C.持久化配置中心的背景知識:
diamond是淘寶內部使用的一個管理持久配置的系統,它的特點是簡單、可靠、易用,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理。
diamond為應用系統提供了獲取配置的服務,應用不僅可以在啟動時從diamond獲取相關的配置,而且可以在運行中對配置數據的變化進行感知並獲取變化后的配置數據。
持久配置是指配置數據會持久化到磁盤和數據庫中。
diamond的特點是簡單、可靠、易用:
簡單:整體結構非常簡單,從而減少了出錯的可能性。
可靠:應用方在任何情況下都可以啟動,在承載淘寶核心系統並正常運行一年多以來,沒有出現過任何重大故障。
易用:客戶端使用只需要兩行代碼,暴露的接口都非常簡單,易於理解。
值得一提的是 diamond 的容災機制,這也是阿里系不少開源中間件的容災通用思路。
C.1.diamond的容災機制
diamond之所以表現的穩定可靠,除了架構簡單之外,另一個重要原因是diamond具有一套完備的容災機制,容災機制涉及到client和server兩部分,主要包括以下幾個方面:
c.1.1.server存儲數據的方式
server存儲數據是“數據庫 + 本地文件”的方式,集群間的數據同步我們在之前的文章中講過(請參考專題二的原理部分),client訂閱數據時,訪問的是本地文件,不查詢數據庫,這樣即使數據庫出問題了,仍然不影響client的訂閱。
c.1.2.server是一個集群
這是一個基本的容災機制,集群中的一台server不可用了,client發現后可以自動切換到其他server上進行訪問,自動切換在client內部實現。
c.1.3.client保存snapshot
client每次從server獲取到數據后,都會將數據保存在本地文件系統,diamond稱之為snapshot,即數據快照。當client下次啟動發現在超時時間內所有server均不可用(可能是網絡故障),它會使用snapshot中的數據快照進行啟動。
c.1.4.client校驗MD5
client每次從server獲取到數據后,都會進行MD5校驗(數據保存在response body,MD5保存在response header),以防止因網絡故障造成的數據不完整,MD5校驗不通過直接拋出異常。
c.1.5.client與server分離
client可以和server完全分離,單獨使用,diamond定義了一個“容災目錄”的概念.
client在啟動時會創建這個目錄,每次主動獲取數據(即調用getAvailableConfigInfomation()方法),都會優先從“容災目錄”獲取數據,如果client按照一個固定的規則,在“容災目錄”下配置了需要的數據,那么client直接獲取到數據返回,不再通過網絡從diamond-server獲取數據。
同樣的,在每次輪詢時,都會優先輪詢“容災目錄”,如果發現配置還存在於其中,則不再向server發出輪詢請求。 以上的情形, 會持續到“容災目錄”的配置數據被刪除為止。
根據以上的容災機制,我們可以總結一下diamond整個系統完全不可用的條件:
- 數據庫不可用。
- 所有server均不可用。
- client主動刪除了snapshot。
- client沒有備份配置數據,導致其不能配置“容災目錄”。
同時滿足以上4個條件的概率,在生產環境中是極小的。
D.窩窩配置持久化的實操:
窩窩把各種業務限流、各種白名單放在 diamond 里了。其實就是 key/value 存儲。如下圖6所示.
圖6 放入 diamond 統一管理的各種配置項
-over-
窩窩的解決方案介紹列表:
#研發解決方案#基於StatsD+Graphite的智能監控解決方案
#研發解決方案介紹#Recsys-Evaluate(推薦評測)
#數據技術選型#即席查詢Shib+Presto,集群任務調度HUE+Oozie
