Contenu connexe Similaire à 十二項架構設計原則 (20) Plus de Philip Zheng (20) 十二項架構設計原則3. Scalability Rules: Principles for Scaling Web Sites
● 準則 1 - 不要過度設計解決方案
● 準則 2 - 將設計擴展到解決方案(DID 過程)
● 準則 3 - 將解決方案簡化三倍
● 準則 4 - 減少 DNS 查找
● 準則 5 - 盡可能減少對象
● 準則 6 - 使用同構網絡
● 準則 7 - 克隆或複制事物的設計(X 軸)
● 準則 8 - 設計拆分不同的東西(Y 軸)
● 準則 9 - 拆分相似事物的設計(Z 軸)
● 準則 10 - 設計您的解決方案以橫向擴展,
而不僅僅是向上擴展
● 準則 11 - 使用商品系統(金魚不是純種)
● 準則 12 - 擴展您的託管解決方案
● 準則 13 - 利用雲的設計
● 準則 14 - 適當使用資料庫
● 準則 15 - 防火牆,防火牆無處不在!
● 準則 16 - 積極使用日誌文件
● 準則 17 - 不要檢查你的工作
● 準則 18 - 停止重定向流量
● 準則 19 - 放鬆時間約束
● 準則 20 - 利用內容交付網絡
● 準則 21 - 使用Expires標題
● 準則 22 - 緩存 Ajax 調用
● 準則 23 - 利用頁面緩存
● 準則 24 - 利用應用程序緩存
● 準則 25 - 利用對象暫存
● 準則 26 - 將對象暫存放在自己的“層”上
● 準則 27 - 積極學習
● 準則 28 - 不要依賴 QA 來發現錯誤
● 準則 29 - 不為回滾而設計就是為失敗而設計
● 準則 30 - 從事務處理中刪除商業智能
● 準則 31 - 注意代價高昂的關係
● 準則 32 - 使用正確類型的數據庫鎖
● 準則 33 - 使用多階段提交傳遞
● 準則 34 - 盡量不要使用Select for Update
● 準則 35 - 不要選擇一切
● 準則 36 - 使用故障隔離“泳道”進行設計
● 準則 37 - 永遠不要相信單點故障
● 準則 38 - 避免將系統串聯起來
● 準則 39 - 確保您可以連接和關閉功能
● 準則 40 - 爭取無國籍
剩下自己看吧~
總共50項可擴展準則
4. 50項 → 12 項架構設計原則
篩選重點,並以三維構面Scale
Cube來分類拆分,其中XYZ軸
分別表示:
◼ X軸,水平擴展,即將服務
和數據複製多份
◼ Y軸,根據功能或業務來對
應用進行拆分(比如微服務)
◼ Z軸,依據服務或是數據進
行Sharding分區
出處:https://akfpartners.com/growth-blog/scale-cube
16. 原則六:服務Z軸擴展
說明(What): 通常根據使用者的獨特屬性,例如省份、州、國籍、地理位置等進行服務分流。
場景(When):
◼ 全球性服務,因地理位置的網路物理距離成為系統效能瓶頸。
◼ 持續面對快速增長的使用者數量,建立高可用及備援機制。
方法(How):
◼ 基於HTTP,使用Global HTTP Load Balancer雲端服務,如AWS
Application Load Balancer、GCP External HTTP(S) Load Balancing和
Azure Public Load Balancer,或是網路設備商的解決方案,來達到
Content-based Routing,但只支援HTTP通訊協定。
◼ 基於DNS,使用支援動態DNS的負載平衡服務,在客戶端查詢DNS解析時,
根據客戶端IP回傳最近的服務位置(geoproximity routing),通常還會結合
CDN靜態網頁內容託管服務,如Amazon Route 53、Azure DNS、GCP
Cloud DNS和Cloudflare等。
◼ 前端靜態網頁的JavaScript程式配合後端Content-based Routing設計分流
邏輯判斷規則
原因(Why):
當X軸服務擴展已經無法解決客戶快速增長,而Y軸服務擴展需要人力和時間來拆
分服務;且需要針對目標客戶群進行必要的故障隔離,亦可避免單一區域的網路
中斷或災難停止服務後,影響到整體服務可用率,但multi-region active-active
architecture硬體及維運成本高,建議導入infrastructure as code方案來加速建
置並降低維運成本。
DM1
DM2
Batch
Jobs
GLB DM2
22. 原則八:善用公有雲服務
說明(What): 有計畫地善用雲端平台技術隨需擴展。
場景(When):
◼ 當業務需求是臨時性、突增的、偶發的,如搶購活動或預約搶票。
◼ 開發新型態業務面對未來需求的不確定性,可避免投入大量資金
建置機房採購硬體設備。
◼ 企業建置HA/DR資料中心
方法(How):
◼ 利用第三方雲端環境滿足臨時性需求,例如季節性業務增加、大
量批次作業或新系統開發DEV環境和測試驗收的QA環境。
◼ 配合原則六:服務Z軸擴展設計,將業務需求分流到雲端服務,
並在雲端架構規劃原則二:服務X軸擴展達到auto scaling,待業
務量下降減少運算資源,活動結束後移除雲端服務。
原因(Why):
在本地端建置臨時性需求的硬體設備和應用系統需要數周時間,在雲
端環境,利用自動化建置腳本(infrastructure as code),如
Terraform、Pulumi,卻只需要幾分鐘,雖然前期需要學習這些工具
並實驗,但這項投資卻是非常划算。
24. SQL vs. NoSQL Database:
When to Use, How to Choose
https://towardsdatascience.com/datastore-choices-sql-vs-nosql-database-ebec24d56106
27. 原則十一:設計分層快取機制
說明(What): 減少從入口WAF到底層資料庫的網頁請求量,可節省網路頻寬和設備資源。
場景(When):
◼ 當前端網頁傳輸佔據大量對外頻寬,影響到後端API資料傳輸。
◼ 思考如何減輕運算成本最高的核心系統負擔。
方法(How):
1. 把前端網頁靜態檔案放置到CDN服務,讓大量網頁內容請求從CDN機房讀取,節
省對外頻寬傳輸量。將異動頻率低的動態網頁內容轉換成靜態網頁內容,以便供
CDN託管。
2. 開啟網路設備快取機制,減少動態資料往後端讀取次數。
3. 使用Web、Reverse proxy反向代理或API Gateway快取機制。
4. 配合原則二:服務X軸擴展和原則四:服務Y軸擴展,設計應用伺服器的集中式快取
架構,如Redis、Hazelcast、Ignite等。
5. 使用存取資料庫程式的Object/Entity快取功能,如JPA cache或Hibernate cache
等。
6. 使用資料庫自身的快取解決方案,如memory table、IMDG等。
原因(Why):
如同CPU設計L1/L2/L3快取架構,若能充分使用快取和資料命中率,可提升整體運算能
力。
1. CDN是Web架構普遍用來紓解流量高峰,分攤靜態檔案傳輸量,是經濟且簡單的
方式,且可提供全球客戶來源監控。
2. 善用網路設備的快取機制,可加速應用程式或網站時的載入時間,以便提高應用系
統或網站的性能和效率。
3. 將每周或每天才更新的動態內容放置到Web快取,可減輕應用伺服器負擔。
4. 善用應用伺服器的集中式快取架構,才能無狀態橫向擴展(X軸),並提供跨業務
領域的資料共用和數據分析能力(Y軸)。
5. 當有大量且重複的資料庫查詢時,使用Object/Entity快取可減輕資料庫負擔。
6. 使用資料庫的快取方案是成本最高的,且可能會被廠商綁定。
28. Cache Everywhere
Client Tier Web Tier Gateway Tier Service Tier Storage Tier
In Memory
Replicate
API
Browser
Storage Cache
Edge/CDN
Cache
Gateway
Cache
Application
Cache
Storage
Cache
More expensive
29. 原則十二:適時採用非同步通訊方式
說明(What):
透過Message Broker(MQ或Kafka)設計非同步式通訊,或使用響應式(Reactive)
開發框架,來拆解服務溝通方式。
場景(When):
◼ 當採用同步式通訊的服務成為瓶頸,影響到整體效能。
◼ 當無法增加硬體設備來改善系統效能時,修改既有架構設計或改成非阻塞式的響應
式程式設計。
方法(How):
◼ 從業務流程分析或事件風暴(Event Stoming),了解現有流程能否用非同步方式
取代,如星巴克的兩階段交付,先結帳再叫名字取餐
(https://www.enterpriseintegrationpatterns.com/docs/IEEE_Software_Desi
gn_2PC.pdf)。
◼ 參考經典企業整合模式 (Enterprise Integration Patterns,
https://www.enterpriseintegrationpatterns.com/)一書來設計非同步整合架構。
◼ 將訊息(Message)分成需確認結果的命令(Command)和單純傳遞已發生的事
件(Event),命令使用支援Request-Reply的MQ,事件則使用Fire & Forget的
可擴展Event Bus方案,如Kafka等。
◼ 確保Event Bus不會成為瓶頸點,必需可隨業務量橫向擴展。
◼ 非同步通訊增加問題查找的困難度,務必導入分散式監控機制。
◼ 仿效敏捷宣言,亦有響應式宣言(https://www.reactivemanifesto.org/),屬於
新程式設計理念,目前支援Java的框架有Spring Webflux、Vert.x、RxJava等。
◼ 資料庫存取程式亦有響應式Client,如R2DBC和Reactive SQL Client等,避免過
多的資料庫連線造成資料庫效能問題。
原因(Why):
◼ 使用非同步通信技術確保每個服務和應用分階可各自獨立,而同步式則讓所有元件
緊密耦合,非同步方法可透過Message Broker讓系統順利擴展。
◼ 響應式開發框架內建了非阻塞、容錯高可用、Event Bus可伸縮等特性,在新系統
或高流量的服務中可導入響應式程式設計,改善執行效率避免服務壅塞。
30. Your Coffee Shop Doesn’t Use Two-Phase Commit
外部相依服務成為瓶頸時,可考慮使用非
同步方式:
Client使用結帳API
結帳API寫入Queue
透過topic訂閱的對外專用API收到通知
對外專用API呼叫Partner信用卡API
外部信用卡API回傳結果
對外專用API收到結果寫入資料庫
結帳API查詢交易結果
https://www.enterpriseintegrationpatterns.com/docs/IEEE_Software_Design_2PC.pdf
31. 前端效能優化方面
1. 缩短请求耗时
1.1 优化打包资源
1.2 CDN加速
1.3 浏览器缓存
1.4 更高版本的HTTP
1.5 Web Socket
1.6 服务器端渲染(SSR)
2. 减少重排重绘
2.1 减少渲染量
2.2 减少渲染次数
3. 改善JS性能
3.1 缓存复杂计算
3.2 Web Worker
3.3 Web Assembly
https://insights.thoughtworks.cn/web-frontend-performance-tuning/
32. IaaS
An Overview of Enterprise IT Technology Architecture
Enterprise API Management
Enterprise Gateway
Web/Mobile Services Partners
Traffic
Outer API
BFF Service
Application
Server
Application
Service
PaaS
Managed Container System
MeshProxy
Inner API
Miniservice
Proxy
Inner API
Miniservice
Proxy
Inner API
Miniservice
Proxy
Inner API
Miniservice
Administration
Portal
Consumers
Channel
Inner API
Service
Inner API
Service
Application
Service
Inner API
Service
Platform API Management
Microgateway
IoTs ChatBot
Enterprise Service Bus
ODS TMS BaNCS CardLink IFX Accounting G/L
DB
Pool
DB
Pool
VM Container