1. 程式人生 > >實時交易系統中引數實時更新解決方案

實時交易系統中引數實時更新解決方案

好久沒有寫技術方面的東西了,今天有時間寫點實時交易系統方面的東東!

一. 問題提出

    在實時交易系統中,引數的更新管理是整個系統穩定與高效的基礎。當然,如果你的系統中的引數不需要實時的更新,那麼就沒必要看下去了,你可以隨便從檔案中、從資料庫中讀取引數,甚至於把引數寫在程式程式碼中。

     實時更新引數可分為兩類需求:

  • 多程序的引數沒有依賴關係:這種情況下,這些引數都是獨立的,一個引數的變化的影響範圍只侷限在一個程序中;
  • 多程序的引數相互依賴:這種情況下,某個引數的變化,可能影響多個程序,並且改變的先後順序要對結果產生影響,那麼就必須實現程序的同步。

二. 解決方案

    我這裡假設的實時交易系統的模式如下:

  1. 初始化環境;
  2. 進入主迴圈;
  3. 阻塞在某處(比如等待埠的資料),或者輪詢的處理業務(一般不用此方式,太消耗系統資源);
  4. 處理業務;
  5. 回到第3步。

    對於第一種情況,可以按以下思路來實現,在進入主迴圈後,根據一個標誌來讀取引數(直接從檔案或者資料庫中讀取),這個標誌可以用共享記憶體來實現,再簡單一點,甚至可以通過讀取一個檔案中的值來實現。

    這是最簡便的實現方式。

    對於第二種(這也是常見的情況),可以採用 “共享記憶體 + 訊號 + 版本策略” 的方式來實現:

  1. 把所有引數讀取到共享記憶體中,為了實現程序同步,每個引數資訊中要帶上版本資訊;
  2. 當外部管理程式更新引數後,觸發一個主機中一個引數更新服務,把引數更新到一個新的版本,同時,保留舊版本的引數資訊;
  3. 引數更新服務給所有註冊的程序傳送更新訊號;
  4. 程序在收到更新訊號時,應該處於兩種狀態中:一是阻塞在某處,一是正在處理業務。那麼,如果是第一種情況,則先進入訊號函式,進行引數的更新;如果是第二種情況,則應該設定一個標誌位(表示下一次需要更新引數),然後繼續進行業務處理;
  5. 版本策略用來同步程序的行為:
  • 當一個程序的引數已經更新,這時它把處理結果轉發到下一個程序,而下一個程序的引數有可能並沒有來的及更新,那麼根據策略,有兩種行為:一是該程序等待引數的更新,二是報錯,或者直接丟棄該筆業務;
  • 當上一個程序的引數沒有更新,而轉發到的下一個程序已經更新了,那麼根據策略,有兩種行為:一是報錯,或者直接丟棄該筆業務;二是下個程序也使用同上個程序同版本的引數來進行業務處理。

    在這種機制下,可以做到引數的實時更新,把對實時業務的影響降到最低,整個實時業務都不會有任何中斷和阻塞。

    當然,這種機制也要求必須管理好共享記憶體和各種訊號,不然,反而會帶來程式的黑洞!^_^