簡單網絡應用平臺設計

    網絡通信應用中,要開發一個穩定的、高效的、伸縮性好、可擴展性強、單機承載數千甚至上萬用戶同時在線的網絡應用系統是一項比較複雜的工程,其涉及到很多方面的專業知識,像TCP協議、UDP協議、Socket開發、多線程編程、線程池、併發架構、分佈式架構、完成端口(IOCP)模型、異步編程模型、設計模式等等。最近研究了一下網上各種對網絡編程方面的介紹,於是有了以下一些思路。

    多數網絡應用都如以下框架

wKiom1QgyYSywjr7AAIUXtrBKNU739.jpg

    

    網絡應用平臺分爲4層:設備層(客戶端、終端設備)、平臺層(一級應用服務器、二級應用服務器)、業務層(功能服務器、功能插件)、數據層(網絡數據庫)。

    FS(Function Server)功能服務器,處理並且僅處理所有的功能性請求,不參與用戶管理、狀態保持等,提供最純粹的功能服務。上圖中的功能服務器FS的個數可能是0到N(N>0)個。在某種意義上可以認爲,每個功能服務器FS是可以互換的。由於FS僅提供最純粹的功能服務,不需要進行用戶管理、狀態保持,這種功能服務器在運行時的無狀態性,使得功能服務器很容易實現負載均衡集羣。

    AS(Appliction Server)應用服務器,主要功能包括:管理各種外部設備(CU、PU)、維持外部設備狀態、設備權限認證、系統消息路由、提供“ 框架+插件”結構管理業務功能插件(Addins)、管理功能服務器(FS)等。

    AS可以支持 “區域分佈式”的體系結構。上面的4層架構已經是一種分佈式架構了,但是這種分佈式架構是一種“縱向”的架構,“區域分佈式”則側重於“橫向”,在“區域分佈式”體系結構中,每一個具體的“4層架構的實現”只是其中的一個組成元素。


AS應用服務器

    AS應用服務器主要實現服務器功能,包括管理各種外部設備(CU、PU、FS)、維持外部設備狀態、設備權限認證、系統消息路由、提供“框架+插件”結構管理業務功能插件(Addins)。AS應用服務器提供了底層網絡通信框架,用戶只需要把注意力放到具體業務處理上,不用關係底層網絡通信如何實現。對於具體的業務,用戶可以通過兩種方式處理,一種是直接開發對應的業務處理插件,通過插件框架加載到AS應用服務器插件管理器中。另一種是開發相應的FS功能服務器接入到AS應用服務器上,由AS應用服務器轉發業務數據給FS功能服務器,再由FS功能服務器處理。前者比較適合功能簡單、處理器負荷較輕的業務,後者比較適合功能複雜、IO吞吐量大、處理器負荷較重的業務(如圖片、視頻處理等)。


AS應用服務器模塊框圖:

wKiom1Qgy1jxX7d3AAKhHK4E36o467.jpg


AS應用服務器主要模塊包括:

1.  異步網絡模塊。

2.  網絡流解析模塊。

3.  消息管道模塊。

4.  消息訂閱發佈模塊。

5.  設備模塊。

6.  業務池插件模塊。

7.  應用服務器模塊。


半同步-半異步並行模式

wKioL1Qgy76gQxDoAAFB-llD7Qk739.jpg



網絡應用平臺使用半同步-半異步模式解決併發性。組成單元如下描述:

l        同步任務層(用戶級)

    本層的任務是完成對消息數據的處理操作,使用同步模型,通過隊列層的隊列中傳輸數據。和異步層不同,同步層的任務使用活動對象執行,這些活動對象有自己運行線程。當執行同步任務的時候,他們可能會被阻塞。


l        隊列層

    這個層在同步任務層和異步任務層之間,提供了同步控制和緩存的功能。異步任務的I/O事件被緩存到消息隊列中,同步任務層在隊列中提取這些事件。


l        異步IO

    處理低層的事件,這些事件由多個外部的事件源產生(例如網卡,終端)。和同步任務不同,此層的實體是被動對象,沒有自己的運行線程,要求不能被阻塞。

 

當外部事件到達後,半同步-半異步模式的各個組成單元協作和處理。把協作的過程分成下面三個階段:

    1.異步階段:通過異步事件通知,外部的事件源和異步任務層完成交互。

    2.排隊階段:隊列層的隊列提供了一個同步控制機制,響應輸入事件,緩存同步層和異步層之間的消息。

    3.同步階段:同步任務層從隊列層提取消息。注意,同步層和異步層傳遞數據的協議是獨立的,和隊列層具體處理通信的方式無關。

    

    同步層和異步層之間的通信使用生產者/消費者模型。理解這個模型的關鍵是:完成同步任務的是活動對象。他們可以在任意時刻阻塞調用read或在write。如果數據沒有準備好,這些活動對象可以一直等待。相反的,異步任務層的實體是被動對象。他們不能被阻塞。這些對象被通知或外部對象觸發。


異步網絡模塊

    異步網絡模塊主要是爲上層提供基本的網絡操作功能,包括建立服務器監聽、接受外來連接、主動連接遠程主機等。所有的網絡操作都是異步進行,提高併發性。


設備模塊

    設備模塊主要功能是接入管理網絡中的設備,維護設備操作權限等。


消息解析模塊

    網絡層收到消息流後,需要對消息流進行解析,並把解析出來的一條條消息打包成系統中約定的消息結構體。


消息管道模塊

網絡中收到數據後經過解析器解析,得到的消息體直接進入系統消息管道框架進行處理,消息管道處理框架如下:

wKioL1Qgz7ay6XOqAAG29agdmjc812.jpg

   

    消息管道框架涉及多個模塊,包括異步網絡模塊、消息管道模塊、消息訂閱-發佈模塊等,消息管道框架是系統消息處理流程的“橋樑”,系統通過消息管道框架對網絡層和應用層解耦。

    消息管道MessagePipe可以看做是GatewayMessageSpy以及MessageTransformer和 InnerMessageSpy的“封裝“。消息進入消息管道的處理順序是GatewayMessageSpy,MessageTransformer,InnerMessageSpy。消息流出消息管道的處理順序是InnerMessageSpy,MessageTransformer,GatewayMessageSpy。


消息訂閱發佈

    當平臺收到消息並打算傳遞給業務邏輯層處理時,有多種方式可以實現,我們使用消息訂閱發佈模式實現平臺到業務邏輯的消息“傳遞”。每個業務邏輯充當訂閱者角色,向發佈者訂閱自己關心的消息。當有消息到發佈者時,發佈者會調用訂閱者對應的函數處理。消息訂閱發佈模式降低了平臺和業務邏輯的耦合,使用統一的消息訂閱接口,減少了依賴。

wKiom1QgzWeSBwN0AAF-wbjb7dI496.jpg

整個網絡平臺在並行模式上使用的是半同步-半異步模式,異步層就是異步網絡模塊,網絡模塊收到數據後不停的把數據放入到消息訂閱發佈模塊中,而隊列層和同步層由消息訂閱發佈模塊實現。消息訂閱發佈模塊中消息處理器堆起着緩存異步層傳來的消息數據,同時處理器堆中的消息處理組件作爲活動對象不停的從消息隊列中取出消息並調用對應的消息訂閱者函數。

消息處理模塊包括消息訂閱-發佈模塊和消息執行模塊,其中消息訂閱-發佈模塊主要實現系統消息訂閱-發佈框架,消息執行模塊主要實現緩存網絡層傳來的消息數據、從消息隊列中取消息並作爲活動對象同步處理消息。


應用服務器模塊

    功能服務器模塊是網絡應用平臺的核心模塊之一,其主要功能是融合其他功能模塊,搭建一個統一的網絡管理平臺。

wKioL1QgzgfDg4QTAAHTJe-_IaA478.jpg

    對於最多幾千個設備同時在線的通信應用,通常使用單臺服務器就可以支撐。但是,當同時在線的設備數達到幾萬、幾十萬、甚至百萬的時候,我們就需要很多的服務器來分擔負載。但是,依據什麼規則和結構來組織這些服務器,並使它們能相互協調合作,是最關鍵的問題。網絡應用平臺旨在協助快速構建大型的基於網絡的通信應用。網絡應用平臺也是通過應用服務器羣集來解決巨大併發。

    網絡平臺採用基於域的分佈式架構,分爲一級平臺和二級平臺,每個域中包含一個二級應用服務器和若干功能服務器、終端設備、客戶端設備、數據庫。二級應用服務器管理本域中所有接入設備。域和域之間是相對獨立的,域間節點不能直接訪問。每個域中的二級應用服務器由一級應用服務器統一管理,域間訪問都是通過一級應用服務器來交換數據。


全網統一設備編碼

    爲了識別接入網絡平臺中的所有設備,整個網絡平臺中的設備都需要賦予一個唯一的編碼作爲身份標識。

編碼如下:

XXXX | XXXX 32位,前16位表示區域編碼,後16位表示本區域中的節點編碼。

    應用服務器編碼格式爲XXXX0000,其他設備編碼爲XXXXXXXX。其中應用服務器和本域內的所有設備的區域編碼是一樣的,因此可以通過區域編碼來判斷設備和應用服務器是不是在同一個域中。

 

全網消息路由

    網絡中的消息,都有發送端和目的端,那麼怎麼讓消息在整個網絡平臺中流通呢?當某個終端需要向另外個終端發送消息或是當終端處理了別的終端發來的消息需要回復時怎麼處理呢?這都需要考慮網絡中消息怎麼路由到目的地。

 

消息體路由標識

    每個網絡中的消息體均有如下結構:

<?xml version=”1.0” encoding=”UTF-8”?>    
<Message version=”1.0”>
    <Header Message_Type=”協議類型” SessionId=”會話ID” Seq=”包序號”  From=”協議發送端” To="協議目的端”/>
    <!-- 具體協議內容 -->
    <parameters></parameters>
</Message>

其中FromTo字段就表明了消息源和消息目的地。不管是主動向終端發送消息還是終端回覆消息,都必須正確填寫FromTo字段。


消息路由器(ASMsgGatewaySpy)

    本域內二級應用服務器收到網絡消息後,首先需要判斷當前的消息是不是發送給本域的設備,如果消息目的地是本域設備,則把消息通過二級應用服務器投遞給對應的設備,如果消息目的地不是本域內的設備,則需要把消息通過本域的二級應用服務器投遞給一級應用服務器,讓一級應用服務器去把消息投遞給對應域的二級應用服務器,再由二級應用服務器轉發消息給對應的目的設備。

    消息管道處理機制解決了網絡消息剛到應用服務器時就進行相應的路由處理。我們可以實現一個IGatewayMessageSpy接口,在spyMessageReceived函數中實現消息路由。









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章