構建可擴充套件的架構 - Koinex Crunch
Koinex的貿易引擎使用LMAX架構的許多原則設計。這使我們能夠在高峰時段承受大量負荷。
在快速增長的財務系統中,清潔和可擴充套件架構的重要性對於更好的可擴充套件性和更快的執行非常重要。LMAX架構幫助我在Koinex設計多個實時應用程式,這些應用程式並不具有顯著的事務性。
雖然不可能深入總結整個架構,但我列出了一些關鍵知識,可以提高我們為產品設計的可擴充套件架構的質量。讓我們開始吧!
LMAX架構組成部分:
- 輸入Disruptor:負責網路的I / O操作,解組,複製和日誌記錄。
- 輸出Disruptor:幫助編組處理後收到的訊息和響應。
- 業務邏輯處理器:處理應用程式中的所有業務邏輯。
如何設計業務邏輯處理器?
業務邏輯處理器是來自輸入Disruptor的事件的狀態機。它們有助於處理輸入和產生輸出。
記憶體中邏輯處理:從輸入中斷器讀取後的處理資料應儲存在記憶體資料結構中。這減少了輸出中斷器執行的I / O操作的延遲。沒有資料庫,不需要持久儲存。
順序輸入流:從輸入中斷器讀取的輸入必須遵循順序路徑,例如,它應該是FIFO,LIFO或其他一些序列。
叢集業務處理器:由於系統記憶體很多,因此應將輸入資料流饋送到多個業務處理器中,這樣,如果任何處理器出現故障或不一致,則可以將流量切換到其他工作流量。但是,在任何給定的時間點,只有一個處理器連結到輸出中斷器。
輸入源資料庫:輸入流事件應儲存在事件系統中,如Kafka,ActiveMQ,它有助於恢復故障處理器並降低系統停機風險。
更好的程式設計模型:更好的錯誤處理和非同步定義與外部服務的更好互動是在設計這樣的實時架構時應該遵循的關鍵程式設計模型。
設計輸出和輸入Disruptor的關鍵點
輸入和輸出Disruptor會處理訊息,因此需要以持久的方式儲存它們並按照叢集業務處理器進行復制。由於資料由業務處理器獨立儲存,複製和使用,這導致分散式系統中的生產者 - 消費者問題,因為業務處理器不應該讀取正在複製的資料。
例如,如果資料複製失敗並且同時業務處理器處理了資料,那麼這將導致叢集業務處理器之間的不一致。
並行資料結構來拯救
Martin提出了“環形緩衝區”的概念,這是一種併發資料結構。環形緩衝區的設計基於共享序列計數器,生產者和使用者使用它來處理併發。對於您的體系結構,您可以使用或設計任何此類併發資料結構來處理生產者 - 消費者問題。
什麼是Concurrent Ring Buffer及其工作原理?
Ring Buffer是佇列資料結構的組播網路。它被稱為多播網路,因為每當生產者放置一個物件時,所有消費者都會在下游佇列的幫助下被通知並行消費。
生產者和消費者都在序列計數器的幫助下處理併發。每個生產者會編寫自己的序列計數器,但在寫入之前,它會讀取消費者和生產者的所有其他序列計數器,以避免並行寫入並保持一致性。序列計數器可以被視為鎖定變數。類似地,消費者在消費之前也會在序列計數器上觀察,以確保他們讀取一致的資料。
在上面的場景中,Journaler日記記錄,replicators複製器和業務邏輯處理器充當消費者,而unmarshaller充當生產者。
Journaling日記記錄:為了恢復有故障的業務處理器,需要具有儲存的資料事件。日記功能有助於將實時流式記憶體資料中的資料儲存到磁碟,同時保留資料序列。
災難恢復
在考慮任何架構的全部使用時,我們還必須分析系統如何輕鬆快速地從災難中恢復。LMAX架構可幫助我們降低由於其獨立元件而產生的風險。
有什麼風險?
- 如果執行業務處理器的資料由於與輸入中斷器的通訊問題而損壞。
- 如果流資料的日記記錄操作失敗並影響資料複製。
使用LMAX進行風險緩解
如上所述,Ring Buffer是一種併發資料結構,通過解決生產者 - 消費者問題,確保減少業務處理器之間資料損壞的風險。
正在執行的業務處理器是叢集的,因此多個處理器與輸入資料保持同步,如果任何業務處理器發生故障,另一個可以被視為主伺服器,停機時間為零。
日誌資料通過流式傳輸已記錄的事件來幫助恢復損壞的處理器,並且還複製導致處理器故障的情況。
你何時應該使用這種架構?
總結以上幾點,您可以在架構中使用LMAX模式來設計可擴充套件且快速的系統,在下面情況滿足的條件下:
- 圍繞事務資料庫的傳統併發會話模型變得難以管理。
- 您正在解決的業務問題並非嚴重的事務性問題。由於事務彼此更加獨立,因此協調的需求較少,因此使用並行執行的單獨處理器變得更具吸引力。
- 後端系統不與使用者互動,並且可以使用如上所述的非同步通訊和程式設計模型。
- 您需要很好地分離關注點,允許人們專注於領域驅動設計,並且還希望將大部分平臺複雜性完全分開。
PS:Koinex的貿易引擎使用上面提到的許多原則設計。這使我們能夠在高峰時段承受大量負荷。
Koinex和LMAX的貿易引擎
如前所述,LMAX架構幫助我們為Koinex設計穩定且高吞吐量的Trade Engine。我們通過在記憶體中開發業務處理器來實現LMAX的一些原則,從而將輸入和輸出流的設計問題分開。但是,我們沒有遵循叢集業務處理器的基礎,這限制了我們在恢復過程中沒有停機時間。雖然引擎的事件流性質幫助我們以更快的方式恢復系統。
點選標題見原文