實現近乎無限可擴充套件性的7種設計模式
來源:coderidea
本篇主要總結了來自Pat Helland的令人印象深刻的論文《Life beyond Distributed Transactions: an Apostate's Opinion》中的設計模式。
實體唯一標識
在構建大規模分散式系統時,為了確保資料的唯一性和一致性,每個代表著獨立資料集的實體都應該具有唯一的標識。這意味著我們需要為每個實體定義一個獨一無二的鍵,以便能夠有效地對其進行區分和操作。
多個不相交範圍的事務可序列化
分散式系統中的事務管理是一個複雜而關鍵的問題。為了實現可伸縮性,我們需要確保事務的作用範圍是有限的,不涉及多個不相交的資料實體。這樣可以避免跨實體的原子事務,從而提高系統的併發性和效能。
至少一次訊息傳遞
在分散式系統中,訊息傳遞是組成不同元件之間通訊的重要方式。應用程式必須具備至少一次訊息傳遞的能力,即能夠容忍訊息的重複傳送和訊息到達的無序性。這是確保系統魯棒性的關鍵因素之一。
訊息定址到實體
為了實現可擴充套件性,我們需要明確定義訊息是如何定址到特定實體的。這意味著我們不能將實體的唯一鍵的存在抽象化,而是需要在業務邏輯中考慮這些唯一鍵,以確保訊息能夠準確地定位到目標實體。
實體按參與方管理會話狀態
為了保證系統的冪等性,每個實體需要能夠管理與參與方的會話狀態。這涉及到實體必須記住先前已經處理過的訊息,以及在沒有原子事務的情況下,使用某種工作流能力來“協商”處理結果。
替代索引不能存在於單一範圍內
在分散式環境中,不能假設對實體的索引或引用可以原子地更新。由於存在併發操作,不同索引可能會出現不同步的情況。因此,在設計中需要考慮到這一點,以確保系統的一致性。
實體之間的訊息傳遞是臨時的
在分散式系統中,實體之間的訊息傳遞必須能夠容忍一定程度的不確定性。傳送的訊息應該被視為提交請求,但也可能會被取消。這種容錯性是確保系統在面對各種異常情況時能夠繼續執行的關鍵。
與此同時,以上設計原則與構建Amazon S3時採用的設計原則相比較:
去中心化:採用完全去中心化的技術,消除系統的擴充套件瓶頸和單點故障,提高系統的可伸縮性。
非同步性:確保系統在任何情況下都能取得進展,即使在非同步的通訊模式下也能夠保持高效的執行。
自主性:每個元件都能夠基於本地資訊做出決策,實現系統的分散式自治,降低對全域性狀態的依賴。
本地責任:每個元件都負責自身一致性的維護,不依賴於其他同行的干預,從而提高系統的穩定性。
受控併發:透過設計操作,避免或最小化併發控制的需求,提高系統的併發效能。
容錯性:將元件故障看作是正常操作模式的一部分,系統能夠在元件失敗時繼續執行,保持高可用性。
受控並行性:使用精細的抽象粒度,使系統能夠利用並行性以提高效能和系統的健壯性。
分解成小而易理解的構建塊:避免設計一個單一服務嘗試做所有事情,而是構建小元件,它們可以作為其他服務的構建塊。
對稱性:確保系統中的節點在功能上是相同的,減少節點特定的配置需求,提高系統的可維護性。
簡單性:透過保持系統足夠簡單,但又不過於簡單,降低系統的複雜性,提高可理解性。
這些設計原則共同構建了一個強大而高效的分散式系統,旨在應對大規模和高複雜性的挑戰。透過理解和應用這些原則,開發者能夠更好地構建可靠、可伸縮、高效能的分散式應用。
來自 “ ITPUB部落格 ” ,連結:https://blog.itpub.net/70024922/viewspace-3001510/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 可擴充套件性套件
- MySQL 8.0:無鎖可擴充套件的 WAL 設計MySql套件
- dubbo是如何實現可擴充套件的?套件
- ETL的可擴充套件性和可維護性套件
- 設計師對可擴充套件設計工具的探索套件
- 可擴充套件性筆記一套件筆記
- dubbo是如何實現可擴充套件的?(二)套件
- 可擴充套件的使用者表設計套件
- kestra: 無限可擴充套件的開源編排和排程平臺套件
- MySQL Sharding可擴充套件設計YMMySql套件
- 回覆關鍵詞的無限擴充套件機制套件
- 用template實現的可擴充套件的平臺無關的 log Class (轉)套件
- 最容易懂的策略模式消除if-else分支,實現開閉原則,提高可擴充套件性模式套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- GTC24 | 面向無限可擴充套件的高效能 AI 網路會議套件AI
- 使用高階函式實現類的擴充套件設計函式套件
- 可動態擴充套件的資料庫模型設計套件資料庫模型
- SQL Story摘錄(三)————可擴充套件設計 (轉)SQL套件
- 實用的可選項(Optional)擴充套件套件
- 教你 4 步搭建彈性可擴充套件的 WebAPI套件WebAPI
- 【Kotlin】擴充套件屬性、擴充套件函式Kotlin套件函式
- 內容分類擴充套件性標籤設計套件
- 比原鏈設計思考: 擴充套件性UTXO模型套件模型
- 如何設計一門語言(十二)——設計可擴充套件的型別套件型別
- 擴充套件JAAS,XMLPolicyFile實現套件XML
- 無限級分類之Laravel-nestedset擴充套件包的使用Laravel套件
- 服務的擴充套件性套件
- 軟體定義資料中心設計應集中於可擴充套件性和整合性套件
- PHP7擴充套件PHP套件
- 可擴充套件的搜尋元件套件元件
- 如何權衡設計可擴充套件的有界上下文? (mathiasverraes)套件
- 可預測的效能和實際的可擴充套件性——SQL Server 2008套件SQLServer
- 【軟體架構篇】常見可擴充套件模式架構套件模式
- php7安裝redis擴充套件和memcache擴充套件PHPRedis套件
- linux下php實現C/C++擴充套件程式設計LinuxPHPC++套件程式設計
- 深入NGINX:我們如何設計它的效能和擴充套件性Nginx套件
- 3 條 sql 是實現知乎評論,7 條 sql 實現點贊 + 評論,且可擴充套件SQL套件
- 編寫可擴充套件程式套件