分類  >  伺服器 >

設計與開發應用伺服器-常見形式

tags:    時間:2013-12-25 17:20:03
設計與開發應用伺服器--常見模式

設計與開發伺服器算是一個技術含量比較高的領域,需要涉及到網路編程、IO、多線程、分散式、性能和可擴展性等較為複雜的技術細節,比起JSP/servlet或SSH框架開發業務系統來說,開發伺服器比較偏重於技術一些,許多開發人員會有些束手無措,但卻無法避免,比如基於HTTP協議的服務不適用時,或需要提供某種協議的容器時。

其實伺服器的設計與開發也是有模式可借鑒,只不過沒有框架或是書籍來這麼一些模式,但通過學習一些優秀伺服器的源碼和架構我們可以找到一些感覺,我挑選了幾個自己較為熟悉的伺服器,通過它們的架構來找一些可以借鑒的模式:

  • Tomcat
  • Apache perfork
  • Amoeba
  • Mysql
  • 統一通信
  • Darkstar

1)Tomcat

Tomcat根據處理一個請求的不同階段分為多個層次,所有層次通過pipeline-valve的結構連接起來,每個層次通過Valve處理相應維度的事情。

2)Apache perfork

此架構模式中存在一個主進程和多個子進程。每個子進程都會為所進行的請求偵聽一個套接字。當接受到請求之後,子進程就會接受它並且提供響應。父進程會監控所有的子進程以確保總是可以使用最少數量的進程來處理請求,並且確保等候請求到達的閑置進程不能過少。如果沒有足夠的空閑進程來處理潛在的請求高峰,那麼父進程就會啟動新的子進程。如果存在過多的進程,那麼父進程會每次終止一個空閑進程,直到伺服器回到最大空閑子進程數量之下。通過保持一定數量的空閑子進程來接受所引入的請求,伺服器就可以避免在接受到請求時再去啟動新進程的開銷。 父進程和子進程之間通過記分板進行通信。對於每一個產生的子進程,它的狀態信息都寫入到記分板中,父進程通過讀取記分板可以了解子進程的狀態。當需要關閉子進程的時候它將通過終止管道發送終止信息給子進程,另外的一種通知方法就是通過信號。

3)Amoeba

Amoeba是夾在client和DB之間的Proxy,並且復用了mysql connector的協議,因此它必須維持好它與client端和DB端的連接,保持高速的數據流轉。另外,它為了能做到sql路由就必須得解析mysql connector的協議,只有掌握去來的數據才能做好路由和結果合併等工作

4)Mysql

Mysql是一個將SQL處理和存儲引擎相分離的兩層結構,把上圖簡化來看如下圖所示:

SQL Layer屬於比較業務性的模塊,也是根據SQL的種類和處理階段的不同,分為多個層次和模塊來逐層處理。Storage Engine Layer是一個數據存儲的抽象層,它可以根據預定的標準和協議把不同結構和原理的存儲引擎統一起來,並和SQL Layer無縫對接起來,如此設計能很好把其他在存儲做得非常好的第三方給納入進來,使得Mysql成為一個開放系統。

5)統一通信

融合通信的目的是要通過原生態的Socket協議把多種客戶端和後端各服務連接起來,算是client端和服務提供方之間的Proxy。因此它為了提高它處理的吞吐量,把每次請求分成段,每段都通過獨立的線程池來處理

6)Darkstar

 

Darkstar是個為了提供高可用的網路遊戲框架,它把服務模塊分為Tasking Service、Data Service、Channel與Session Service。其中Tasking Service是每次客戶端請求的處理模塊,Data Service用於持久化客戶端的數據,Channel與Session Service用於保持客戶端與服務端或客戶端之間的通信和會話。網路遊戲的性質決定了需要高併發、狀態持久性和橫向可擴展性,因此Tasking Service的特性是在任何機器和環境下都能獨立運行,並且得到同樣的結果,可以通過增加機器增強任務的處理能力,而Data Service和Channel Service保證了這一特性的可行性。

 

通過以上幾個開源伺服器的架構,大致可以總結出一個伺服器需要以下模塊:

  • 連接模塊
  • 配置模塊
  • 線程管理模塊
  • 數據解析和轉化模塊
  • 任務處理模塊
  • 監控和管理模塊

並且都需關注一下問題:

  • 高速連接和數據通信
  • 可配置化的管理
  • 多線程的管理策略
  • 分散式和橫向擴展策略
  • 不同階段處理的分層結構

因此通過對一些架構的解析,對如何構架一個伺服器應該有些宏觀性的把控,接下來就需要對這個框框里需要的各項技術的掌握,這也是一個從宏觀到微觀的過程

推薦閱讀文章

Bookmark the permalink ,來源:互聯網