使用TLA +進行分散式系統的建模與除錯設計

banq發表於2018-12-26

這篇文章講述了為什麼要對系統進行建模,並使用TLA +框架詳盡地測試這些模型/設計。在第一部分中,我將討論為什麼建模您的設計是重要和有益的,在第二部分我將解釋為什麼TLA +是一個非常合適的建模框架,特別是對於分散式和併發系統。

建模很重要
如果您已經在大型軟體系統上工作,那麼您就知道它們容易出現轉彎情況失敗的假設競爭條件級聯故障
存在許多極端情況,因為存在許多引數,並且這些引數確實相互干擾了意料之外的方式。極端情況違反了關於系統元件和環境的看似合理的隱含假設,例如,“1跳比2跳更快”,“0跳比1跳更快”,並且“程式以相同的速率工作” ”。由於當今(隨著SOA,雲和微服務的興起)所有系統都是分散式系統,因此存在豐富的競爭條件。由於其他程式併發執行,所謂的“原子執行塊”程式碼失敗。最後,故障發生並且在部署之前幾乎總是低估它們的影響。故障會使您的系統進入意外狀態,並從那裡開始將恢復操作與正常系統操作互動。

大型軟體系統不可避免地是分散式系統,有許多未知數和無數種極不可能的方法可能會出錯。人類的大腦和推理無法擴充套件以處理所有這些可能性。為了緩解這些問題,該行業開發了更好的可觀察性工具,甚至在生產中進行測試以提高可用性。這些工具非常重要且不可或缺。但是當你弄清楚你的設計存在一些固有的問題時,解決問題可能會太困難和昂貴。您認為最後10%的專案最終將90%的時間用於生產和運營。

如果您首先對設計進行建模並詳盡地測試和除錯這些模型以確保對角落情況,失敗的假設,併發性和失敗的正確性,您可以在設計時捕獲錯誤並在它們發展成問題之前修復它們並且修復成本很高。

  • 建模首先不會延長您的開發時間,相反,它可以透過減少徒勞的開發嘗試來節省您的時間。採用有缺陷的設計進行開發幾乎總能確保實施存在缺陷。雖然擁有精確和正確的模型並不能保證您的模型實現是正確的,但它可以幫助您避免重大/複雜的問題,併為測試您的實現提供了一個很好的參考。
  • 構建一個精確的系統模型可以讓您清晰思考並極大地支援您的開發。透過建模,您可以發現問題的固有複雜性; 這有助於您集中注意力並忽略意外/副產品的複雜性。
  • 該模型還可以幫助您與您的團隊和其他人精確溝通,因為您可以避免自然語言的模糊性。
  • 最後,隨著手頭的模型,您還有機會逐步介紹設計決策,並看到實現設計的其他方法。 


TLA +非常適合建模
TLA +是用於描述和推理分散式和併發系統的形式語言。它由2013年圖靈獎得主Leslie Lamport博士開發。由於他的邏輯時鐘工作Paxos工作,Lamport是分散式系統中非常重要的人物。在過去十年中,他非常積極地參與改進TLA +框架,以幫助使分散式系統更易於管理。

TLA +使用基本數學來建模和推理演算法:實際邏輯,集合論和時態邏輯用於指定系統。最重要的是,該框架整合了一個模型檢查器,可以徹底地測試您的模型,以應對極端情況,失敗的假設,併發和失敗。模型檢查器嘗試為您的模型執行所有可能的執行,並告訴您哪些執行,您的不變數  和系統保證  中斷。

基於不變數的推理
TLA +框架促進了基於不變數的推理,以防止因操作推理而產生的問題。在操作推理中,你從一條“快樂的道路”開始,然後你試著找出“什麼可能出錯?” 以及如何防止它們。當然,在問題場景的列舉中,你總是會遇到不足,忽視極端情況,競爭條件和級聯故障。相比之下,基於不變數的推理主要關注“需要做什麼?” 以及如何在任何時候確保此屬性作為系統的不變數。基於不變數的推理採用原則的基於狀態而非基於操作/執行的系統檢視。

為了獲得基於不變的推理,我們為模型指定了安全性和活躍性。安全屬性指定“系統允許執行的操作”。例如,在任何時候,所有提交的資料都存在且正確。活動屬性指定“系統最終應該做什麼”。例如,每當系統收到請求時,它最終必須響應該請求。換句話說,安全屬性關注的是“沒有什麼不好的事情發生”,以及帶有“好事最終發生”的活躍屬性。

用TLA +建模
TLA +框架支援您構建模型並以兩種主要方式確定其不變屬性。首先,基於數學的形式語言可以幫助您在使用高階宣告性語句的同時實現精確性。其次,整合模型檢查器會徹底除錯您的模型以面對併發和失敗,並生成候選不變數失敗的反例。(經過多年與TLA +的合作,我仍然對模型檢查員為我的模型吐出的反例感到驚訝:很容易忽略一些情況,但模型檢查器會讓你直截了當。)你透過改進你的模型來解決這些問題或者有時透過放鬆你的候選不變數,並在經過多次迭代後收斂到一個詳盡除錯的模型,保證不變數。

即使對於已經實現和執行的系統,構建TLA +模型也是有益的。透過構建模型,您可以更好地瞭解您的系統,並找出一些潛在的故障模式,  並在生產之前糾正它們。最後,維護系統的TLA +模型為持續開發提供了重要的好處。雖然軟體系統需要經常使用新功能進行擴充套件,但這些擴充套件可能會以意外的方式干擾系統並導致停機。使用TLA +模型,您可以先將這些功能新增到模型中,然後使用模型檢查器在設計級別捕獲/除錯問題。這樣您就可以在問題出現之前解決它們。

TLA +很實用
由於使用TLA +實際上節省了構建大型軟體系統的時間,因此許多軟體公司都採用TLA +建模作為實踐。
亞馬遜還為他們的一些AWS產品使用了TLA +建模,並撰寫了一篇很好的體驗報告。 還有報告稱使用TLA +來建模硬體系統。

在過去的4年中,我一直在我的分散式系統類中加入TLA +。TLA +使學生能夠學習併發和基於不變的推理,併為他們提供分散式協議的實踐經驗。在我對新分散式演算法的研究中,我也詳盡地使用了TLA +。
根據我的經驗,可以在幾周內獲得TLA +。這首先是因為TLA +採用了一種非常簡單的狀態機方法來建模系統。系統包括:(1)定義系統狀態的一組變數,以及(2)用於將系統從一個狀態轉換到另一個狀態的一組有限的分配/動作。
此外,PlusCal為TLA +提供了一種糖的語法,它具有長時間的增長趨勢(由於其低階狀態轉換中心語法)並且對某些人來說看起來很神秘。PlusCal是一種用於在更高抽象級別編寫演算法的虛擬碼,它被轉換為模型檢查的基礎TLA +規範。

TLA+下載

影片:TLA+是一個狀態機建模工具

瞭解更多

Google網上論壇有一個非常活躍的TLA +論壇。Leslie Lamport在幾個主題中發出了聲音。

我的部落格包含許多分散式演算法/系統的TLA + / PlusCal建模示例。

LearnTLA提供了TLA + / PlusCal的使用者友好介紹。

Lamport的網站包括TLA + / PlusCal資源(影片/書籍/示例)和下載工具包的連結。


 

相關文章