天天看點

(七):C++分布式實時應用架構 2.0

C++分布式實時應用架構 2.0

技術交流合作QQ群:436466587 歡迎讨論交流

上一篇:

(六):大型項目容器化改造

版權聲明:本文版權及所用技術歸屬smartguys團隊所有,對于抄襲,非經同意轉載等行為保留法律追究的權利!

  在C++分布式實時應用架構(CDRAF)1.0版本釋出後,我們對整個架構做了大量的改進。在架構層面支援微服務架構、微服務編排。進一步厘清了CDRAF與業務代碼的耦合,所有的分布式功能均不再需要業務側關心,而統一由CDRFA内部實作。極緻簡化了業務側的配置檔案,也許下一步是做一個代碼自動生成功能,根據配置生成相應的業務代碼架構。重新實作如節點時延統計(CDRFA自動實作每個包的時延統計,業務無需關心),單号碼日志跟蹤(改成消息包染色的方案,CDRFA遇到染色包自動列印日志),應用指令功能(通過系統管理子產品的RESTful接口給節點内的應用程式下達指令)等等。提供接口全面展示叢集的節點實時拓撲圖,并支援對叢集節點微服務進行實時編排。增加了新的日志架構功能,提供高性能、多場景的日志輸出能力。應對這些改進同步增加了相應的單元測試。由此C++分布式實時應用架構2.0版本也應運而生!

  一、叢集實時拓撲圖

  實時拓撲圖展示了叢集的每個節點(容器執行個體),連線代表通訊方向,孤立的節點表示未并網的節點。界面實時展示TPS(流量),RTT(時延)兩個資料,點開節點可以進入容器節點的管理界面,做更多容器節點的管理工作。

  

(七):C++分布式實時應用架構 2.0

  二、微服務編排

   按第五篇《

微服務架構的演進

》的方案,我們增加了圖形界面支援微服務架構的編排。每個大圈表示一個類型的節點,小圈代表一個微服務端口。編排的時候從一個節點連線到另一個節點,并且選擇兩個節點要對接的微服務,即可完成編排。可以實時在叢集運作過程中進行編排,完成編排後,叢集狀态也會實時顯示在上面的拓撲圖當中。當然可以根據業務自身需要,增加新類型的節點,或者為節點增加新的微服務端口。可以看到每個節點都獨立非耦合,節點間的互動完全是通過微服務端口來進行,并且這些端口生效與否是通過微服務編排來進行控制的。

(七):C++分布式實時應用架構 2.0
(七):C++分布式實時應用架構 2.0

  三、時延統計功能

   時延統計功能是分布式架構的核心資料之一,用于實時檢測節點的性能,并依此采取相應的解決政策。原來這個功能是在業務側實作的,CDRAF2.0中,我們将這個功能提到架構中,可以計算所有節點的時延資料,并且業務無需關心(業務無需做任何事情即可獲得這個功能)。

  CDRAF2.0中我們統一了節點的通訊模型,所有的節點均由Dis(資料分發)和業務處理程序組成。在一個業務包到達Dis後,架構會在這個包的標頭打進當刻時間,在業務程序處理完消息回到Dis後,Dis會計算兩個時間差得到時延資料。并将每個包的資料進行平均計算,上報狀态中心,并且可以在實時拓撲圖中展現出來。所有這些工作都由架構來完成。

(七):C++分布式實時應用架構 2.0

  四、單号碼日志跟蹤(包染色方案)

  原來的日志跟蹤方案在收到号碼跟蹤指令後,會通知所有節點的所有程序都來關注這個号碼,遇到這個号碼的包後就把日志跟蹤打開。這個方案有幾大缺點:

  a) 所有的業務程序都需要實作一份号碼檢測、開日志跟蹤的功能,代碼會無比備援。

  b) 當打開這個功能的時候,叢集所有的節點,節點中所有的程序,都會處理監測是否有這個号碼的狀态中。整個叢集處于一個十分不穩定狀态中。

  c) 業務上可能不支援同時跟蹤多個号碼。

  為此我們調整了單号碼日志跟蹤的方案,采用包染色的方案。在消息入口的位置檢測号碼,一旦符合條件就将這個消息包進行標頭染色,後面的處理環節架構收到包後會先于業務檢測標頭,如果發現標頭被染色,就會将日志跟蹤打開,這個包處理完畢後再關閉。每個環節往下傳的時候,架構都會自動為下傳的包再次進行染色,以保證處理流程上的每個環節接收到的都是經過染色的包。新方案的優點如下:

  a) 業務上不再需要為這個功能實作相應的代碼,隻要在入口位置進行一次号碼監測,如果符合就調用架構進行染色,後續所有操作都由架構來完成。

  b) 打開這個功能的時候叢集不再處理不穩定狀态,業務層面甚至感覺不到這個功能的存在,架構處理了所有的問題。

  c) 當有新的業務節點加進來的時候,會自動獲得這個功能,而無需做任何改造。

  d) 除了單号碼日志跟蹤功能,這個方案還可以應用于其它的業務場景。

(七):C++分布式實時應用架構 2.0

  五、通用指令傳遞方案

  在CDRAF中,如果外界要給叢集中某個節點的某個程序下達一個指令,會通過系統管理子產品的RESTful接口,然後通過狀态中心,通訊平台最終傳遞到相應的程序。但在我們之前的方案中,每增加一個這樣的指令都需要給每個子產品(系統管理、狀态中心、通訊平台)增加相應的代碼來進行支援。

  新的方案中,我們設計了通用的消息通路,用來傳遞指令。

  通訊架構自動給SmartAgent 程序增加MonitorMsgInterface 端點,無需配置;SmartAgent 将業務控制消息從自身的MonitorMsgInterface 端點發出, SmartMonitor 從自身的MonitorMsgInterface 端點接收并處理;

  統一的指令格式

message MONITOR_MSG
{
    string dest = 1;
    bytes msg = 2;
}
      

  其中, dest 為控制消息想要發送的目的地,填具體目的地程序的程序名,如"OLCProxy","OCPro", "OCDis"等;如果需要将指令發送至所有程序,則dest 填成字元串all 。msg字段為具體的控制指令文本。

  架構自身提供了若幹公共的控制指令,枚舉如下:

調整日志級别

格式: log 日志級别

其中, 日志級别包含off , critical , err , warn , info , debug , trace

例子: log debug

停線程

格式: stop

重載通訊鍊路資訊

格式: reload

  除了以上架構提供的公共控制指令外, SmartMonitor 也可以接收任意消息并傳遞給指定程序,其不關心消息内容,消息内容完全由業務程序負責解析處理。 原則上SmartAgent 在填寫該字段值的時候,應該直接從ZK讀取;ZK上應該有該控制指令的文本。

   從上面這些調整可以看到,CDRAF2.0緻力于将分布式相關功能和業務徹底解耦。在我們的設計與實作中,業務和架構之間有一條明顯的分界線。所有可以在架構側做到的功能,業務側一行代碼也不用寫,便可自動獲得。我想這便是CDRAF2.0向通用型架構邁出的一大步!

繼續閱讀