基于單元的架構(gòu)綜合指南
譯文譯者 | 李睿
審校 | 重樓
基于單元的架構(gòu)起源
在快速發(fā)展的數(shù)字服務(wù)領(lǐng)域,對可擴展和彈性架構(gòu)(系統(tǒng)從故障中快速恢復的能力)的需求已經(jīng)達到頂峰?;趩卧募軜?gòu)的引入標志著一個關(guān)鍵的轉(zhuǎn)變,這種轉(zhuǎn)變旨在滿足超大規(guī)模(架構(gòu)響應(yīng)波動需求的快速擴展能力)的激增需求。這種方法對于快速擴展以響應(yīng)波動的需求至關(guān)重要,并且已經(jīng)成為數(shù)字化成功的基礎(chǔ)。這種策略讓亞馬遜公司和Facebook公司等科技巨頭以及DoorDash公司等服務(wù)平臺能夠在需求高峰期間巧妙地駕馭數(shù)字流量的浪潮,確保為全球用戶提供服務(wù)。
想象一下亞馬遜公司在“黃金會員日”的流量激增,或者Facebook公司在重大活動期間遭遇的全球高峰流量。同樣,DoorDash公司對完美處理大量訂單的追求展現(xiàn)了一個主題:對垂直擴展和水平擴展的架構(gòu)的迫切需求——在不犧牲系統(tǒng)完整性或用戶體驗的情況下擴展容量。
在當前的形勢下,很多初創(chuàng)公司的業(yè)務(wù)得到前所未有的增長,快速擴展規(guī)模的夢想可能會成為可擴展性問題的噩夢。超高速增長(超出預(yù)期的快速擴張)是一項艱巨的挑戰(zhàn),如果不能有效地擴大規(guī)模,就有可能導致公司倒閉。這一挑戰(zhàn)催生了超大規(guī)模的概念,強調(diào)了架構(gòu)在適應(yīng)和發(fā)展以滿足動態(tài)需求方面的靈活性。這一策略的關(guān)鍵是廣泛的并行化和嚴格的故障隔離,確保公司能夠在不陷入過度增長陷阱的情況下進行擴展。
基于單元的架構(gòu)成為無法停機的應(yīng)用程序和服務(wù)的信標。在宕機每一秒都意味著重大聲譽或財務(wù)損失的場景中,這種架構(gòu)范例被證明是無價的。它對以下方面尤其重要:
- 需要不間斷運行的應(yīng)用程序,以確??蛻魸M意度和保持業(yè)務(wù)連續(xù)性。
- 對于維持經(jīng)濟穩(wěn)定至關(guān)重要的金融服務(wù)。
- 確保最低故障率的超大規(guī)模系統(tǒng)。
- 需要為特定客戶端隔離資源的多租戶服務(wù)。
這種架構(gòu)創(chuàng)新是為了直接響應(yīng)對快速擴展的數(shù)字服務(wù)日益增長的需求而開發(fā)的。它提供了一個可擴展、有彈性的框架,以支持持續(xù)的服務(wù)交付和運營優(yōu)勢。
理解基于單元的架構(gòu)
1.什么是基于單元的架構(gòu)?
基于單元的架構(gòu)是一種現(xiàn)代的方法,可以根據(jù)分布式系統(tǒng)和微服務(wù)設(shè)計模式的原理創(chuàng)建既可擴展又有彈性的數(shù)字服務(wù)。這種架構(gòu)將一個龐大的系統(tǒng)分解成更小的、獨立的部分,稱之為單元(Cell)。每個單元都是自立的,包含系統(tǒng)功能、數(shù)據(jù)存儲、計算、應(yīng)用程序邏輯和依賴項的特定部分。這種模塊化設(shè)置允許每個單元獨立擴展、部署和管理,從而增強了系統(tǒng)從故障中恢復的能力,而不會引起廣泛的問題。
如果以城市規(guī)劃進行類比,可以認為基于單元的架構(gòu)類似于一座精心設(shè)計的大都市,每個社區(qū)都自主運營,配備了自己的服務(wù)和設(shè)施,并為城市的繁榮發(fā)展做出貢獻。在停電或水管破裂等時期,只有受到影響的社區(qū)運營會中斷,而城市的其他社區(qū)則正常運營。正如一個社區(qū)經(jīng)歷中斷而不會使整個城市癱瘓一樣,在這個架構(gòu)中遇到問題的單元不會引發(fā)整體系統(tǒng)的故障。這確保了數(shù)字服務(wù)保持健壯和可靠,保持更高的正常運行時間和彈性。
基于單元的架構(gòu)通過將一個龐大的系統(tǒng)分解成更小的、獨立的單元來構(gòu)建可擴展的、健壯的數(shù)字服務(wù)。每個單元都有自己的數(shù)據(jù)存儲和計算能力,類似于城市中社區(qū)的運營方式。它們可以獨立運行,所以如果一個單元出現(xiàn)問題,不會影響系統(tǒng)的其他部分。這種設(shè)計有助于提高系統(tǒng)的穩(wěn)定性和容量增長,而不會引發(fā)更多的問題。
圖1基于單元的架構(gòu)
2.關(guān)鍵組件
(1)單元:類似于社區(qū),單元是這個架構(gòu)的基本組成部分。每個單元都是一個自治的微服務(wù)集群,擁有能夠處理服務(wù)職責子集的資源。單元是應(yīng)用程序的獨立版本,具有自己的計算能力、負載平衡器和數(shù)據(jù)庫。這種設(shè)置允許每個單元獨立運營,從而可以分別部署、監(jiān)視和維護。這種獨立性意味著,如果一個單元遇到問題,并不會影響其他單元,這有助于系統(tǒng)有效地擴展,并保持健壯性。
(2)單元路由器:單元路由器起著類似于城市交通管理系統(tǒng)的關(guān)鍵作用。它們根據(jù)負載、地理位置或特定服務(wù)需求等因素動態(tài)地將請求路由到最合適的單元。通過有效地平衡各個單元之間的負載,單元路由器確保每個請求都由最適合處理它的單元處理,優(yōu)化系統(tǒng)性能和用戶體驗,就像交通燈和標志引導車輛通行以確保城市交通順暢一樣。
(3)單元之間通信層:盡管每個單元具有自治性,但它們之間的合作對于處理跨系統(tǒng)的任務(wù)至關(guān)重要。單元之間通信層促進單元之間安全有效的信息交換。這一層就像城市的公共交通系統(tǒng),連接不同的社區(qū)(單元),以確保整個架構(gòu)的無縫協(xié)作和統(tǒng)一的服務(wù)交付。它確保了即使單元獨立運營仍然可以有效地協(xié)同工作,這反映了城市的不同部分是如何相互聯(lián)系的,同時又具有凝聚力。
(4)控制平臺:控制平臺是基于單元的架構(gòu)的關(guān)鍵組件,充當管理運營的中心樞紐。它監(jiān)督諸如設(shè)置新的單元(供應(yīng))、關(guān)閉現(xiàn)有單元(取消供應(yīng))以及在單元之間移動客戶(遷移)等任務(wù)。這確保了基礎(chǔ)設(shè)施對系統(tǒng)及其用戶的需求保持響應(yīng),允許動態(tài)資源分配和無縫的服務(wù)連續(xù)性。
3.為什么以及何時使用基于單元的架構(gòu)?
為什么要使用單元的架構(gòu)?
基于單元的架構(gòu)為有效擴展數(shù)字服務(wù)提供了一個健壯的框架,保證了它們在擴展期間的彈性和適應(yīng)性。以下是它的優(yōu)點:
(1)更高的可擴展性:通過定義和管理每個單元的容量,可以添加更多單元以進行擴展(通過添加數(shù)據(jù)庫和服務(wù)器等系統(tǒng)組件)并平均分配工作負載來處理增長。這避免了由于擴展(通過增加數(shù)據(jù)庫、服務(wù)器或子系統(tǒng)等系統(tǒng)組件的大小來適應(yīng)增長)而導致的資源限制。隨著需求的增長,可以添加更多的單元,每個單元都包含已知容量,從而使系統(tǒng)具有固有的可擴展性。
(2)更安全的部署:使用單元可以使部署和回滾更順暢。可以一次將更改部署到一個單元,從而最大限度地減少問題帶來的影響。金絲雀單元可以在實際條件下以最小的風險測試新的部署,為更廣泛的部署提供安全性。
(3)易于測試:測試大型且分散的系統(tǒng)可能具有挑戰(zhàn)性,特別是當它們變得更大時。然而,使用基于單元的架構(gòu),每個單元都保持在一個可管理的大小,使得測試它們在最大容量下的行為變得更加簡單。測試整個大型服務(wù)可能過于昂貴和復雜。但是,只測試一個單元是可行的,因為可以模擬單元可以處理的最重要的工作量,類似于單個客戶可能給應(yīng)用程序提供的最重要的工作。這使得確保每個單元順利運行變得實用且具有成本效益。
(4)更低的“爆炸半徑”:基于單元的架構(gòu)通過將問題隔離在單個單元內(nèi)來限制故障的傳播,就像城市中的社區(qū)一樣。這種劃分確保一個單元中的問題不會影響整個系統(tǒng),從而保持整體功能。每個單元獨立運行,最大限度地減少任何單一事件的影響區(qū)域或“爆炸半徑”,類似于大規(guī)模服務(wù)中的區(qū)域隔離。這種設(shè)置通過控制中斷和防止大范圍中斷來增強系統(tǒng)彈性。
圖2與傳統(tǒng)服務(wù)相比,基于單元的架構(gòu)服務(wù)具有更強的故障恢復能力,并且具有更小的爆炸半徑
(5)提高可靠性和恢復能力
①更高的平均故障間隔時間(MTBF):基于單元的架構(gòu)通過減少問題發(fā)生的頻率來提高系統(tǒng)的可靠性。這種設(shè)計使每個單元都很小且易于管理,允許定期檢查和維護,使運營更加平滑,并使其更可預(yù)測。由于客戶分布在不同的單元中,任何問題都只影響有限的一組請求和用戶。每次只在幾個單元上測試更改,使其易于恢復而不會產(chǎn)生廣泛的影響。如果將客戶劃分為十個單元,則一個單元中的問題只影響10%的客戶。這種管理變更和快速解決問題的受控方法意味著系統(tǒng)經(jīng)歷更少的中斷,從而獲得更加穩(wěn)定和可靠的服務(wù)。
②更低的平均恢復時間(MTTR):使用單元恢復更快、更直接,因為處理的是更小的、更可控的問題,而不是整個系統(tǒng)的問題。
(6)更高的可用性:基于單元的體系結(jié)構(gòu)可以導致更少、更短的故障,從而提高服務(wù)的整體正常運行時間。盡管可能存在更多潛在的故障點(理論上每個單元都可能失敗),但每個故障的影響都會大幅降低,并且更容易修復。
何時使用單元的架構(gòu)?
以下是一個簡短的指南,可以幫助人們理解何時使用這種架構(gòu)策略是有利的:
(1)高風險應(yīng)用程序:如果停機可能嚴重影響客戶的業(yè)務(wù),損害企業(yè)的聲譽,或?qū)е麓罅康呢攧?wù)損失,那么基于單元的方法可以防止大范圍的中斷。
(2)關(guān)鍵經(jīng)濟基礎(chǔ)設(shè)施:基于單元的架構(gòu)確保金融服務(wù)行業(yè)(FSI)的持續(xù)運營,其中工作負載對經(jīng)濟穩(wěn)定至關(guān)重要。
(3)超大規(guī)模系統(tǒng):太大或太關(guān)鍵而不能發(fā)生故障的系統(tǒng)(幾乎在任何情況下都必須保持運行的系統(tǒng))是基于單元的設(shè)計的主要候選者。
(4)嚴格的恢復目標:基于單元的架構(gòu)為需要小于5秒的恢復點目標(RPO)和小于30秒的恢復時間目標(RTO)的工作負載提供了快速恢復能力。
(5)具有專用需求的多租戶服務(wù):對于租戶需要完全專用資源的服務(wù),為其分配計算單元可確保隔離和專用性能。
盡管基于單元的架構(gòu)在處理關(guān)鍵工作負載方面帶來了相當大的好處,但它也有自己的障礙,例如復雜性增加、成本上漲、需要專門的工具和實踐,以及需要在路由層上進行投資。
實現(xiàn)基于單元的架構(gòu)
本節(jié)重點介紹在設(shè)計和實現(xiàn)基于單元的架構(gòu)時發(fā)揮作用的關(guān)鍵設(shè)計因素。
1.單元設(shè)計
單元設(shè)計是基于單元的架構(gòu)的一個基本方面,在這種架構(gòu)中,其中系統(tǒng)被劃分為更小的、獨立的單元。每個單元使用其資源獨立運行,使整個系統(tǒng)更具可擴展性和彈性。
在開始單元設(shè)計之前,需要確定系統(tǒng)中可以分離到一個單元的不同功能。這可能涉及根據(jù)服務(wù)的運營需求或用戶基礎(chǔ)對服務(wù)進行分組。一旦定義了這些邊界,就要為每個單元配備必要的資源,例如數(shù)據(jù)庫和應(yīng)用程序邏輯,以確保它能夠自主運行。這種設(shè)置有助于有針對性的擴展和恢復,并最大限度地減少故障的影響,因為一個單元中的問題不會波及到其他單元。
在單元之間建立有效的溝通渠道和建立全面的監(jiān)測是保持系統(tǒng)內(nèi)聚和監(jiān)督單元表現(xiàn)的關(guān)鍵步驟。通過系統(tǒng)地將其架構(gòu)組織到單元中,企業(yè)可以創(chuàng)建一個健壯的框架,增強系統(tǒng)的可管理性和適應(yīng)性。
以下是一些有關(guān)單元設(shè)計的設(shè)想,可以用來增強系統(tǒng)的彈性:
(1)跨可用性區(qū)域分布單元:通過在不同的可用性區(qū)域(AZ)中定位單元,可以保護系統(tǒng)免受單一數(shù)據(jù)中心或地理位置故障的影響。這種地理分布確保了即使一個可用性區(qū)域(AZ)遇到問題,其他可用性區(qū)域(AZ)中的其他單元也可以繼續(xù)運行,從而保持總體系統(tǒng)可用性,并降低完全服務(wù)停機的風險。
(2)實現(xiàn)冗余單元配置:在可用性區(qū)域(AZ)內(nèi)部或之間創(chuàng)建單元的冗余副本可以進一步增強彈性。這種冗余意味著,如果一個單元發(fā)生故障,其職責可以立即由一個重復的單元接管,從而最大限度地減少服務(wù)中斷。這種方法需要仔細地在單元之間同步,以確保數(shù)據(jù)一致性,但可以顯著提高容錯性。
(3)為自主運營設(shè)計單元:確保每個單元可以獨立運營,并使用自己的一組資源、數(shù)據(jù)庫和應(yīng)用程序邏輯,這一點至關(guān)重要。這種獨立性允許單元與系統(tǒng)中其他地方的故障隔離。即使一個單元出現(xiàn)問題,也不會擴散到其他單元,并使識別和糾正問題變得更容易。
(4)策略性地使用負載平衡器和單元路由器:集成能夠感知單元位置和健康狀態(tài)的負載平衡器和單元路由器可以有效地將流量從有問題的單元或可用性區(qū)域(AZ)重定向。這種動態(tài)路由功能允許實時調(diào)整流量,將用戶引導到健康的可用單元,并平衡負載,以防止任何一個單元或可用性區(qū)域(AZ)負擔過重。
(5)簡化單元復制和部署:在設(shè)計單元時考慮到復制和重新部署。在單元或可用性區(qū)域(AZ)出現(xiàn)故障的情況下,擁有在替代位置快速啟動新單元的機制是非常寶貴的。用于單元部署的自動化工具和模板可以加快這一過程,減少恢復時間并增強整體系統(tǒng)彈性。
(6)定期測試故障轉(zhuǎn)移過程:定期測試單元故障轉(zhuǎn)移過程,包括模擬故障和恢復演練,可以確保系統(tǒng)在實際停機期間按預(yù)期響應(yīng)。這些測試可以揭示單元設(shè)計和故障轉(zhuǎn)移策略中的潛在弱點,從而不斷提高系統(tǒng)彈性。
通過將這些想法融入到單元設(shè)計中,可以創(chuàng)建一個更具彈性的系統(tǒng),能夠承受各種故障場景,同時最大限度地減少對服務(wù)可用性和性能的影響。
2.單元劃分
單元劃分是基于單元的架構(gòu)中的一項關(guān)鍵技術(shù)。它側(cè)重于將系統(tǒng)工作負載劃分為不同的單元,以優(yōu)化性能、可擴展性和彈性。它涉及根據(jù)預(yù)定義的標準對用戶請求或數(shù)據(jù)進行分類和定向到特定的單元。這一過程確保單元不會不堪重負,提高了系統(tǒng)的可靠性和效率。
如何進行單元劃分:
(1)確定劃分標準:確定在單元之間分配工作負載的基礎(chǔ)。其典型的標準包括地理位置、用戶ID、請求類型或日期范圍。這一步驟對于定義系統(tǒng)如何對請求進行分類并將請求路由到適當?shù)膯卧陵P(guān)重要。
(2)實現(xiàn)路由邏輯:在單元路由器或API網(wǎng)關(guān)內(nèi)開發(fā)一種路由機制,該機制使用已識別的標準將傳入請求定向到正確的單元。這可能涉及考慮當前單元負載和可用性的動態(tài)決策算法。
(3)持續(xù)監(jiān)測和調(diào)整:定期監(jiān)測各個單元的性能和負載分布。使用這些數(shù)據(jù)調(diào)整分區(qū)標準和路由邏輯,以保持最佳的系統(tǒng)性能和可伸縮性。
劃分算法:
有幾種算法可以用于有效的單元劃分,每種算法都有其優(yōu)勢,并針對不同類型的工作負載和系統(tǒng)需求進行了定制:
(1)一致性哈希:請求是基于分區(qū)鍵(例如用戶ID)的哈希值進行分配的,從而確保在添加或刪除單元時工作負載分布均勻,并且進行最小的重組。
(2)基于范圍的劃分:將數(shù)據(jù)劃分為范圍(例如字母或數(shù)字),并將每個范圍分配給特定的單元。這是有序數(shù)據(jù)的理想選擇,允許高效的查詢操作。
(3)輪詢:這種方法以循環(huán)的方式在所有可用的單元中均勻地分配請求。它在實現(xiàn)基本級別的負載平衡方面非常簡單和有用。
(4)分片:與基于范圍的分區(qū)類似,但更復雜,分片涉及將大型數(shù)據(jù)庫拆分成更小、更快、更易于管理的部分或“分片”,每個部分由單獨的一個單元處理。
(5)動態(tài)劃分:根據(jù)工作負載特征或系統(tǒng)性能指標實時調(diào)整劃分。這種方法需要能夠分析系統(tǒng)狀態(tài),并立即進行調(diào)整的先進算法。
通過深思熟慮地實現(xiàn)單元劃分并選擇適當?shù)乃惴?,可以顯著增強基于單元的架構(gòu)的性能、可擴展性和彈性。定期檢查和調(diào)整分區(qū)策略,確保它繼續(xù)滿足系統(tǒng)不斷變化的需求。
3.單元路由器的實現(xiàn)
在基于單元的架構(gòu)中,單元路由器對于將流量引導到正確的單元、確保高效的工作負載管理和可擴展性至關(guān)重要。一個有效的單元路由器取決于兩個關(guān)鍵要素:流量路由邏輯和故障轉(zhuǎn)移策略,它們保持系統(tǒng)可靠性并優(yōu)化性能。
(1)實現(xiàn)流量路由邏輯:首先定義如何將請求定向到各種單元的標準,包括用戶的地理位置、請求類型和所需的特定服務(wù)。其目的是減少延遲并均勻分配負載。采用實時適應(yīng)計算單元可用性和工作負載變化的動態(tài)路由,可能通過與監(jiān)視每個計算單元狀態(tài)和位置的服務(wù)發(fā)現(xiàn)工具集成來實現(xiàn)。
(2)建立故障轉(zhuǎn)移策略:可靠的故障轉(zhuǎn)移過程對于單元路由器確保系統(tǒng)的可靠性至關(guān)重要。如果任何單元變得無法訪問,路由器必須自動將流量重路由到下一個可用的單元,這需要最少的人工干預(yù)。這可以通過跨計算單元實施運行狀況檢查來實現(xiàn),以快速識別和響應(yīng)故障,從而保持用戶體驗的流暢性和服務(wù)的高可用性,即使在計算單元中斷期間也是如此。
圖3單元路由器通過在中斷期間將流量重定向到健康的單元來確保良好的用戶體驗,從而保持不間斷的服務(wù)可用性
對于單元路由器的實際實現(xiàn),可以采用以下方法之一:
(1)負載均衡器:使用基于云的負載均衡器,根據(jù)設(shè)置的規(guī)則、特定的請求屬性(例如URL路徑或標頭)動態(tài)引導流量。
(2)API網(wǎng)關(guān):API網(wǎng)關(guān)可以作為所有傳入請求的主入口,并根據(jù)配置的邏輯將它們路由到適當?shù)膯卧?/span>
(3)服務(wù)網(wǎng)格:服務(wù)網(wǎng)格提供了一個網(wǎng)絡(luò)層,可根據(jù)策略、服務(wù)發(fā)現(xiàn)和運行狀況促進高效的服務(wù)到服務(wù)通信和路由請求。
(4)自定義路由器服務(wù):開發(fā)自定義服務(wù)允許基于詳細請求內(nèi)容、當前單元負載或定制業(yè)務(wù)邏輯做出路由決策,從而提供對流量管理的定制控制。
為單元路由器選擇正確的實現(xiàn)策略取決于特定的需求,例如路由決策的粒度、與現(xiàn)有系統(tǒng)的集成能力以及管理的簡單性。每種方法提供不同程度的控制、復雜性和適應(yīng)性,以滿足不同的架構(gòu)需求。
4.單元大小
單元大小是指確定每個單元的最佳大小和容量,以確保它能夠有效地處理其指定的工作負載,而不會造成過重的負擔。適當?shù)膯卧笮≈陵P(guān)重要,原因如下:
(1)均衡負載分布:正確大小的計算單元有助于在整個系統(tǒng)中實現(xiàn)工作負載的均衡分布,防止任何一個單元成為瓶頸。
(2)可擴展性:大小合適的單元可以更有效地擴展。隨著需求的增加,系統(tǒng)可以增加更多的單元或調(diào)整現(xiàn)有單元內(nèi)的資源以適應(yīng)增長。
(3)彈性和恢復:定義明確的更小單元可以更有效地隔離故障,限制任何單點故障的影響。這使系統(tǒng)更具彈性,并簡化了恢復過程。
(4)成本效率:優(yōu)化單元大小有助于更有效地利用資源,避免在未充分利用的容量上花費不必要的費用。
單元大小是如何確定的?
單元大小需要仔細分析幾個因素:
- 工作負載分析:了解每個單元工作負載的性質(zhì)和數(shù)量。這包括峰值需求時間、數(shù)據(jù)吞吐量和處理需求。
- 資源需求:基于工作負載分析,估計每個單元在各種條件下有效運行所需的資源(CPU、內(nèi)存、存儲設(shè)備)。
- 性能指標:考慮定義成功單元運營的關(guān)鍵性能指標(KPI)。這可能包括響應(yīng)時間、錯誤率和吞吐量。
- 可擴展性目標:定義系統(tǒng)應(yīng)如何擴展以響應(yīng)增加的需求。這將影響將單元設(shè)計為向上擴展(增加單元中的資源)還是向外擴展(添加更多單元)。
- 測試和調(diào)整:通過模擬工作負載條件下的測試來驗證單元大小假設(shè)。監(jiān)視真實的性能并根據(jù)需要進行調(diào)整是計算單元大小的一個連續(xù)部分。
有效的單元大小分級通常涉及理論分析和經(jīng)驗測試的結(jié)合。從基于工作負載特征的最佳猜測估計開始,并根據(jù)觀察到的性能進行調(diào)整,以確保單元在系統(tǒng)發(fā)展時保持高效、響應(yīng)性和成本效益。
5.單元部署
基于單元的架構(gòu)中的單元部署是在多個獨立單元之間分配和管理應(yīng)用程序工作負載的過程。這一策略確保了可擴展性、彈性和高效的資源使用。有一個簡要的指南介紹了它通常是如何完成的,以及有效實施所需的技術(shù)選擇。
單元部署是如何完成的?
(1)自動部署管道:首先設(shè)置自動部署管道。這些管道處理應(yīng)用程序的打包、測試和部署到各個單元。自動化確保一致性,減少錯誤,并支持跨單元的快速部署。
(2)藍/綠部署:使用藍/綠的部署策略來最大限度地減少停機時間并降低風險。通過將應(yīng)用程序的新版本部署到一個單獨的環(huán)境(綠),同時保持當前版本(藍)的運行,可以在最新版本完全準備好并經(jīng)過測試后將流量切換到最新版本。
(3)金絲雀版發(fā)布:在使更新在系統(tǒng)范圍內(nèi)可用之前,逐步向一小部分單元或向用戶發(fā)布更新。這允許監(jiān)視更改的影響,并在必要時回滾更改,而不會影響所有用戶。
單元部署的技術(shù)選擇:
- 容器編排工具:Kubernetes、AWS ECS和Docker Swarm等工具對于編排單元部署至關(guān)重要,可以將應(yīng)用程序封裝到容器中,從而簡化跨各種單元的部署、擴展和管理。
- CI/CD工具:持續(xù)集成和持續(xù)部署(CI/CD)工具,例如Jenkins、GitLab CI、CircleCI和AWS Pipeline,有助于測試和部署過程的自動化,確??梢杂行У赝瞥鲂碌拇a更改。
- 基礎(chǔ)設(shè)施即代碼(IaC):像Terraform和AWS CloudFormation這樣的工具允許在代碼中定義基礎(chǔ)設(shè)施,從而更容易在不同的環(huán)境或云計算提供商之間復制和部署單元。
- 服務(wù)網(wǎng)格:像Istio或Linkerd這樣的服務(wù)網(wǎng)格提供了先進的流量管理功能,包括金絲雀部署和服務(wù)發(fā)現(xiàn),這對于管理通信和單元更新至關(guān)重要。
通過利用這些部署策略和技術(shù),可以在單元部署中實現(xiàn)高度的自動化和控制,從而確保應(yīng)用程序保持可擴展性、可靠性和易于管理。
6.單元可觀察性
在基于單元的架構(gòu)中,單元的可觀察性至關(guān)重要,它可以確保全面了解每個單元的運行狀況、性能和運營指標。它允許有效地監(jiān)控、排除故障和優(yōu)化系統(tǒng),從而增強整體可靠性和用戶體驗。
實現(xiàn)單元可觀察性:
為了實現(xiàn)徹底的單元可觀察性,需要關(guān)注三個關(guān)鍵領(lǐng)域:日志記錄、監(jiān)視和跟蹤。日志記錄捕獲每個單元中的詳細事件和操作。監(jiān)視實時跟蹤關(guān)鍵性能指標和運行狀況度量。跟蹤跟蹤在單元中移動的請求,確定工作流中的瓶頸或故障。
單元可觀察性的技術(shù)選擇:
(1)日志工具:像Elasticsearch、Logstash、Kibana (ELK Stack)或Splunk這樣的解決方案提供了強大的日志記錄功能,允許集中匯總和分析來自所有單元的日志。
(2)監(jiān)控解決方案:Prometheus與Grafana相結(jié)合,提供了強大的監(jiān)控功能,并支持自定義指標。Amazon Cloud Watch或Google Operations(前身為Stackdriver)等云原生服務(wù)為部署在各自云平臺上的應(yīng)用程序提供量身定制的集成監(jiān)控解決方案。
(3)分布式跟蹤系統(tǒng):Jaeger、Zipkin和AWS XRay等工具支持分布式跟蹤,幫助了解單元之間的請求流,并識別微服務(wù)交互中的延遲問題或故障。
(4)服務(wù)網(wǎng)格:Istio或Linkerd等服務(wù)網(wǎng)格本質(zhì)上提供了可觀察性功能,包括監(jiān)視、日志記錄和跟蹤單元之間的請求,而無需更改應(yīng)用程序代碼。
通過利用這些工具并專注于全面的可觀察性,可以確?;趩卧募軜?gòu)保持高性能、彈性,并能夠支持應(yīng)用程序的動態(tài)需求。
單元架構(gòu)的好處與挑戰(zhàn)
采用基于單元的架構(gòu)改變了數(shù)字服務(wù)的結(jié)構(gòu)和運營動態(tài)。將服務(wù)分解為獨立可擴展且具有彈性的單元,為管理復雜性和確保系統(tǒng)可用性提供了一個健壯的框架。然而,這種架構(gòu)范例也引入了新的挑戰(zhàn)和復雜性。以下將深入介紹技術(shù)優(yōu)勢和注意事項。
1.好處
- 水平擴展:與傳統(tǒng)的擴展方法不同,基于單元的架構(gòu)可以通過添加更多的單元來實現(xiàn)水平擴展。這種方法緩解了與集中式數(shù)據(jù)庫或共享資源相關(guān)的常見瓶頸,允許隨著用戶需求的增加而實現(xiàn)線性可擴展性。
- 故障隔離和恢復能力:該架構(gòu)的分區(qū)設(shè)計確保故障被包含在單個單元中,顯著降低了系統(tǒng)的整體爆炸半徑。這種隔離增強了系統(tǒng)的彈性,因為可以在不影響整個服務(wù)的情況下減輕或修復一個單元中的問題。
- 部署靈活性:利用單元允許增量部署和功能部署,類似于實現(xiàn)跨微服務(wù)的滾動更新。部署策略中的這種粒度可以最大限度地減少停機時間,并支持對市場或用戶需求的更靈活的響應(yīng)。
- 簡化運營復雜性:雖然初始設(shè)置很復雜,但單元的持續(xù)運營和管理可能比單片架構(gòu)更簡單。每個單元的自主性簡化了監(jiān)視、故障排除和擴展工作,因為運營任務(wù)可以跨單元并行執(zhí)行。
2.挑戰(zhàn)(注意事項)
- 架構(gòu)復雜性:過渡到或?qū)崿F(xiàn)基于單元的架構(gòu)需要細致的設(shè)計階段,重點是定義單元邊界,數(shù)據(jù)劃分策略和單元之間通信協(xié)議。這種復雜性需要對分布式系統(tǒng)原理有深刻的理解,并且可能需要對開發(fā)和運營實踐進行轉(zhuǎn)變。
- 資源和基礎(chǔ)設(shè)施開銷(更高的成本):與共享資源模型相比,每個單元都有自己的資源和基礎(chǔ)設(shè)施集,這可能會導致開銷增加。特別是隨著單元數(shù)量的增長,優(yōu)化資源利用率和成本效率變得至關(guān)重要。
- 單元之間通信管理:在不引入緊密耦合或顯著延遲的情況下,確保單元之間的連貫和有效通信是一個關(guān)鍵挑戰(zhàn)。開發(fā)人員必須設(shè)計一個支持必要交互的通信層,同時保持單元的獨立性并避免性能瓶頸。
- 數(shù)據(jù)一致性和同步:保持跨單元的數(shù)據(jù)一致性,特別是在需要全局狀態(tài)或?qū)崟r數(shù)據(jù)同步的情況下,將會增加復雜性。為了應(yīng)對這些挑戰(zhàn),可能需要實施事件溯源、CQRS(命令查詢責任分離)或分布式SAGA等策略。
- 專門的工具和實踐:操作基于單元的架構(gòu)需要專門的運營工具和實踐來有效地管理多個工作負載實例。
- 路由層投資:強大的單元路由層對于在單元之間適當?shù)匾龑Я髁恐陵P(guān)重要,因此需要在技術(shù)和專業(yè)知識方面進行額外投資。
3.權(quán)衡利弊
選擇基于單元的架構(gòu)需要進行這些權(quán)衡,并評估可擴展性、彈性和運營靈活性的好處是否超過了實現(xiàn)和管理的復雜性。它最適用于需要高可用性的服務(wù)、正在快速擴展的服務(wù)或模塊化擴展和故障隔離至關(guān)重要的系統(tǒng)。
最佳實踐和陷阱
1.最佳實踐
采用基于單元的架構(gòu)可以顯著增強應(yīng)用程序的可擴展性和彈性。以下是有效實施此方法的精簡最佳實踐:
(1)從堅實的基礎(chǔ)開始
- 將當前設(shè)置視為初始單元:將現(xiàn)有系統(tǒng)視為初始單元,逐步引入新單元之間的流量路由和分布。
- 啟動多個單元:從一開始就實施多個單元,以快速學習和適應(yīng)基于單元的運營動態(tài)環(huán)境。
(2)為靈活性和增長制定計劃
- 盡早實施單元遷移機制:為需要在單元之間遷移客戶做好準備,確保可以在不中斷的情況下進行擴展和調(diào)整。
(3)關(guān)注可靠性
- 進行故障模式分析:識別和評估每個單元的潛在故障及其影響,制定策略以確保穩(wěn)健性并最大限度地減少單元之間的影響。
(4)確保獨立性和安全性
- 保持單元自主性:設(shè)計單元使其自主,有專門的資源和明確的所有權(quán),可能由一個團隊完成。
- 安全通信:使用版本化的、定義良好的API進行單元交互,并在API網(wǎng)關(guān)級別強制執(zhí)行安全策略。
- 最小化依賴關(guān)系:保持低單元間依賴關(guān)系以保持架構(gòu)的優(yōu)勢,例如故障隔離。
(5)優(yōu)化部署和運營
- 避免共享資源:每個單元都應(yīng)該有自己的數(shù)據(jù)存儲,以消除全局狀態(tài)依賴。
- 分階段部署:跨單元分階段引入更新和部署,以實現(xiàn)更好的變更管理和快速回滾功能。
通過遵循這些實踐,可以利用基于單元的架構(gòu)來創(chuàng)建可擴展的、有彈性的、可管理的和安全的系統(tǒng),以應(yīng)對現(xiàn)代數(shù)字需求的挑戰(zhàn)。
2.常見陷阱
雖然基于單元的架構(gòu)為可擴展性和彈性提供了顯著的優(yōu)勢,但它也引入了組織在采用這種方法時需要注意的特定挑戰(zhàn)和陷阱:
(1)管理和運營的復雜性
- 增加的運營開銷:管理多個單元可能會在部署、監(jiān)控和操作中引入復雜性,需要強大的自動化和編排工具來保持效率。
- 一致性管理:確??鐔卧臄?shù)據(jù)一致性,特別是在有狀態(tài)應(yīng)用程序中,可能具有挑戰(zhàn)性,并且可能需要復雜的同步機制。
(2)初始設(shè)置和遷移挑戰(zhàn)
- 復雜的遷移過程:從傳統(tǒng)設(shè)置過渡到基于單元的架構(gòu)可能很復雜,需要仔細規(guī)劃以避免服務(wù)中斷和數(shù)據(jù)丟失。
- 陡峭的學習曲線:工作團隊在理解基于單元的概念和最佳實踐時可能會面臨學習曲線,這需要進行培訓,并且可能減緩初始的進展。
(3)設(shè)計和架構(gòu)考慮
- 單元隔離:正確隔離單元以防止故障傳播需要精心設(shè)計,否則系統(tǒng)可能無法充分實現(xiàn)故障隔離的好處。
- 最佳單元大?。捍_定單元的最佳大小可能很棘手,因為過小的單元可能導致效率低下,而巨大的單元可能會損害可擴展性和彈性。
(4)資源利用及成本影響
- 潛在的成本增加:如果不仔細管理,跨單元的資源重復可能導致運營成本增加。
- 資源利用不足:平衡資源分配以防止利用不足,同時避免資源調(diào)配過度,需要持續(xù)監(jiān)測和調(diào)整。
(5)網(wǎng)絡(luò)和通信開銷
- 網(wǎng)絡(luò)復雜性:基于單元的架構(gòu)可能會引入額外的網(wǎng)絡(luò)復雜性,包括需要復雜的路由和負載平衡策略。
- 單元之間通信:確保單元之間高效安全的通信,特別是在地理分布的設(shè)置中,可能會引入延遲,需要安全可靠的網(wǎng)絡(luò)解決方案。
(6)安全性和合規(guī)性
- 安全配置:每個單元對單獨安全配置的需求可能會使跨架構(gòu)執(zhí)行一致的安全策略變得復雜。
- 合規(guī)性驗證:在分布式架構(gòu)中,驗證每個單元是否符合法規(guī)要求可能更具挑戰(zhàn)性,需要強大的審計機制。
(7)可擴展性vs. 內(nèi)聚的權(quán)衡
- 依賴關(guān)系管理:在最大限度地減少單元之間的依賴關(guān)系提高容錯能力的同時,它也可能導致維護應(yīng)用程序內(nèi)聚性和一致性方面的挑戰(zhàn)。
- 數(shù)據(jù)重復:避免共享資源可能會導致數(shù)據(jù)重復和同步問題,影響系統(tǒng)性能和一致性。
組織應(yīng)該投資于穩(wěn)健的計劃,采用全面的自動化和監(jiān)控工具,并確保團隊進行持續(xù)的培訓,以減少這些陷阱。提前了解這些挑戰(zhàn)可以幫助設(shè)計一個更具彈性、可擴展和高效的基于單元的架構(gòu)。
單元的架構(gòu)在現(xiàn)實世界中的成功應(yīng)用
從業(yè)務(wù)快速增長的初創(chuàng)公司到亞馬遜和Facebook等科技巨頭,基于單元的架構(gòu)已經(jīng)成為管理可擴展性和確保系統(tǒng)彈性的關(guān)鍵。這種架構(gòu)模型已被許多行業(yè)采用,反映了它在處理大規(guī)模關(guān)鍵工作負載方面的有效性。以下是DoorDash、Slack和Roblox如何實現(xiàn)基于單元的架構(gòu)來應(yīng)對其獨特挑戰(zhàn)的簡要介紹。
1.DoorDash公司向基于單元的架構(gòu)的遷移
面對高速增長的需求,DoorDash公司從單片系統(tǒng)遷移到基于單元的架構(gòu),這標志著其運營策略的關(guān)鍵轉(zhuǎn)變。這一轉(zhuǎn)變被稱為“Project SuperCell”,其驅(qū)動因素是有效管理波動的需求,并在不同市場中保持一致的服務(wù)可靠性。通過利用AWS公司的云計算基礎(chǔ)設(shè)施,DoorDash公司能夠隔離單個單元內(nèi)的故障,防止大范圍的系統(tǒng)中斷。它極大地增強了該公司擴展資源和維持服務(wù)可靠性的能力,即使在需求高峰期間也是如此,展示了采用基于單元的方法的變革潛力。
2.Slack公司向基于單元的架構(gòu)的遷移
Slack公司經(jīng)歷了向基于單元的架構(gòu)的重大轉(zhuǎn)變,以減少故障的影響并提高服務(wù)冗余度。由于對網(wǎng)絡(luò)中斷的審查,這一舉措揭示了僅依賴單一可用性區(qū)域的風險。新的單元架構(gòu)旨在更有效地限制故障,并最大限度地減少潛在中斷的程度。通過在每個可用性區(qū)域采用隔離服務(wù),Slack公司使其內(nèi)部服務(wù)能夠在每個可用性區(qū)域獨立運行,從而減少了中斷的影響,加快了恢復過程。這一重新設(shè)計顯著提高了Slack公司的系統(tǒng)彈性,強調(diào)了基于單元的架構(gòu)在確保高服務(wù)可用性和質(zhì)量方面的作用。
3.Roblox公司向單元基礎(chǔ)設(shè)施的戰(zhàn)略轉(zhuǎn)變
Roblox公司向基于單元的架構(gòu)的轉(zhuǎn)變顯示了它對快速增長的響應(yīng),以及為7000多萬日活躍用戶提供可靠、低延遲體驗的需求。Roblox公司通過采用單元基礎(chǔ)設(shè)施在其數(shù)據(jù)中心內(nèi)創(chuàng)建隔離的集群,通過跨單元的服務(wù)復制增強系統(tǒng)彈性。這種設(shè)置允許在不中斷服務(wù)的情況下停用非功能單元,有效地控制故障。單元基礎(chǔ)設(shè)施極大地提高了Roblox的系統(tǒng)可靠性,使該平臺能夠在全球范圍內(nèi)提供始終在線的沉浸式體驗。該策略強調(diào)了基于單元的架構(gòu)在管理大規(guī)模動態(tài)工作負載和在平臺擴展時保持高服務(wù)質(zhì)量方面的有效性。
DoorDash、Slack和Roblox的這些例子說明了基于單元的架構(gòu)在解決規(guī)模和可靠性挑戰(zhàn)方面的戰(zhàn)略價值。通過將工作負載隔離到獨立的單元中,這些公司實現(xiàn)了更高的可擴展性、容錯性和運營效率,展示了這種方法在支持動態(tài)、高需求服務(wù)方面的有效性。
關(guān)鍵要點
基于單元的架構(gòu)代表了一種在數(shù)字時代實現(xiàn)超可擴展性和彈性的組織的變革性方法。亞馬遜、Facebook、DoorDash和Slack等公司已經(jīng)證明了它們通過將系統(tǒng)分割成獨立、自給自足的單元,在管理過度增長和確保不間斷服務(wù)方面的有效性。
這種架構(gòu)策略促進了動態(tài)擴展和健壯的故障隔離,并要求仔細考慮增加的復雜性、資源分配和對專用運營工具的需求。隨著企業(yè)不斷滿足數(shù)字增長的需求,采用基于單元的架構(gòu)成為一種戰(zhàn)略解決方案,可以在不斷發(fā)展的數(shù)字環(huán)境中保持運營完整性,并提供一致的用戶體驗。
本文借鑒了行業(yè)領(lǐng)導者和實踐者的集體知識和經(jīng)驗,包括來自技術(shù)博客的見解,來自亞馬遜、Slack和Doordash等公司的案例研究,以及來自更廣泛的技術(shù)社區(qū)的貢獻。
參考文獻
- https//docs.aws.amazon.com/wellarchitected/latest/reducing-scope-of-impact-with-cell-based-architecture/reducing-scope-of-impact-with-cell-based-architecture.html
- https//github.com/wso2/reference-architecture/blob/master/reference-architecture-cell-based.md
- https://newsletter.systemdesign.one/p/cell-based-architecture
- https://highscalability.com/cell-architectures/
- https://www.youtube.com/watch?v=ReRrhU-yRjg
- https://slack.engineering/slacks-migration-to-a-cellular-architecture/
- https://blog.roblox.com/2023/12/making-robloxs-infrastructure-efficient-resilient/
原文標題:Cell-Based Architecture:Comprehensive Guide,作者:Shantanu Kumar