當前位置:
首頁 > 知識 > 使用LMAX/Disruptor構建高擴展性的交易引擎的經驗分享

使用LMAX/Disruptor構建高擴展性的交易引擎的經驗分享

Koinex的貿易引擎使用LMAX架構的許多原則設計。這使我們能夠在高峰時段承受大量負荷。

在快速增長的財務系統中,清潔和可擴展架構的重要性對於更好的可擴展性和更快的執行非常重要。LMAX架構幫助我在Koinex設計多個實時應用程序,這些應用程序並不具有顯著的事務性。

雖然不可能深入總結整個架構,但我列出了一些關鍵知識,可以提高我們為產品設計的可擴展架構的質量。讓我們開始吧!

LMAX架構組成部分:

  • 輸入Disruptor:負責網路的I / O操作,解組,複製和日誌記錄。
  • 輸出Disruptor:幫助編組處理後收到的消息和響應。
  • 業務邏輯處理器:處理應用程序中的所有業務邏輯。

如何設計業務邏輯處理器?

業務邏輯處理器是來自輸入Disruptor的事件的狀態機。它們有助於處理輸入和產生輸出。

內存中邏輯處理:從輸入中斷器讀取後的處理數據應存儲在內存數據結構中。這減少了輸出中斷器執行的I / O操作的延遲。沒有資料庫,不需要持久存儲。

順序輸入流:從輸入中斷器讀取的輸入必須遵循順序路徑,例如,它應該是FIFO,LIFO或其他一些序列。

集群業務處理器:由於系統內存很多,因此應將輸入數據流饋送到多個業務處理器中,這樣,如果任何處理器出現故障或不一致,則可以將流量切換到其他工作流量。但是,在任何給定的時間點,只有一個處理器鏈接到輸出中斷器。

輸入源資料庫:輸入流事件應存儲在事件系統中,如Kafka,ActiveMQ,它有助於恢復故障處理器並降低系統停機風險。

更好的編程模型:更好的錯誤處理和非同步定義與外部服務的更好交互是在設計這樣的實時架構時應該遵循的關鍵編程模型。

設計輸出和輸入Disruptor的關鍵點

輸入和輸出Disruptor會處理消息,因此需要以持久的方式存儲它們並按照集群業務處理器進行複製。由於數據由業務處理器獨立存儲,複製和使用,這導致分散式系統中的生產者 - 消費者問題,因為業務處理器不應該讀取正在複製的數據。

例如,如果數據複製失敗並且同時業務處理器處理了數據,那麼這將導致集群業務處理器之間的不一致。

並行數據結構來拯救

Martin提出了「環形緩衝區」的概念,這是一種並發數據結構。環形緩衝區的設計基於共享序列計數器,生產者和使用者使用它來處理並發。對於您的體系結構,您可以使用或設計任何此類並發數據結構來處理生產者 - 消費者問題。

什麼是Concurrent Ring Buffer及其工作原理?

Ring Buffer是隊列數據結構的組播網路。它被稱為多播網路,因為每當生產者放置一個對象時,所有消費者都會在下游隊列的幫助下被通知並行消費。

生產者和消費者都在序列計數器的幫助下處理並發。每個生產者會編寫自己的序列計數器,但在寫入之前,它會讀取消費者和生產者的所有其他序列計數器,以避免並行寫入並保持一致性。序列計數器可以被視為鎖定變數。類似地,消費者在消費之前也會在序列計數器上觀察,以確保他們讀取一致的數據。

使用LMAX/Disruptor構建高擴展性的交易引擎的經驗分享

打開今日頭條,查看更多圖片

在上面的場景中,Journaler日記記錄,replicators複製器和業務邏輯處理器充當消費者,而unmarshaller充當生產者。

Journaling日記記錄:為了恢復有故障的業務處理器,需要具有存儲的數據事件。日記功能有助於將實時流式內存數據中的數據存儲到磁碟,同時保留數據序列。

災難恢復

在考慮任何架構的全部使用時,我們還必須分析系統如何輕鬆快速地從災難中恢復。LMAX架構可幫助我們降低由於其獨立組件而產生的風險。

有什麼風險?

  • 如果運行業務處理器的數據由於與輸入中斷器的通信問題而損壞。
  • 如果流數據的日記記錄操作失敗並影響數據複製。

使用LMAX進行風險緩解

如上所述,Ring Buffer是一種並發數據結構,通過解決生產者 - 消費者問題,確保減少業務處理器之間數據損壞的風險。

正在運行的業務處理器是集群的,因此多個處理器與輸入數據保持同步,如果任何業務處理器發生故障,另一個可以被視為主伺服器,停機時間為零。

日誌數據通過流式傳輸已記錄的事件來幫助恢復損壞的處理器,並且還複製導致處理器故障的情況。

你何時應該使用這種架構?

總結以上幾點,您可以在架構中使用LMAX模式來設計可擴展且快速的系統,在下面情況滿足的條件下:

  • 圍繞事務資料庫的傳統並發會話模型變得難以管理。
  • 您正在解決的業務問題並非嚴重的事務性問題。由於事務彼此更加獨立,因此協調的需求較少,因此使用並行運行的單獨處理器變得更具吸引力。
  • 後端系統不與用戶交互,並且可以使用如上所述的非同步通信和編程模型。
  • 您需要很好地分離關注點,允許人們專註於領域驅動設計,並且還希望將大部分平台複雜性完全分開。

PS:Koinex的貿易引擎使用上面提到的許多原則設計。這使我們能夠在高峰時段承受大量負荷。

Koinex和LMAX的貿易引擎

如前所述,LMAX架構幫助我們為Koinex設計穩定且高吞吐量的Trade Engine。我們通過在內存中開發業務處理器來實現LMAX的一些原則,從而將輸入和輸出流的設計問題分開。但是,我們沒有遵循集群業務處理器的基礎,這限制了我們在恢復過程中沒有停機時間。雖然引擎的事件流性質幫助我們以更快的方式恢復系統。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 程序員小新人學習 的精彩文章:

一次生產 CPU 100% 排查優化實踐
後台date轉換json字元串時,返回前台頁面是long類型時間問題解決

TAG:程序員小新人學習 |