天天看點

伺服器架構

1.常用伺服器模型

a.疊代伺服器

隻有一個程序/線程處理請求

設計方法:

一般為單程序,加上select多路複用,非阻塞socket

b.疊代/并發混合型伺服器

平時疊代處理,對消耗大的請求并發處理

平時是疊代型的伺服器

處理請求時設定一個逾時,當請求的處理時間逾時時,建立一個程序/線程,把處理轉給新的程序/線程處理,主程序/線程繼續處理其他請求

c.并發伺服器

多個程序/線程并發處理請求

設計方法: 多程序,多線程

2.以上三類的伺服器比較

疊代伺服器:最簡單,性能不高

并發伺服器:性能較高,但結構相對比較複雜,開發難度中等

疊代/并發混合型伺服器:性能不錯,但結構通常比單純的并發伺服器更複雜

3.多程序的并發伺服器

a.每個連接配接fork一個程序

主程序accpet連接配接,有新連接配接到來時fork一個程序,然後繼續accept,等待新的連接配接

資料傳輸由子程序處理,處理完後子程序exit

每個子程序隻處理一個連接配接

b.Prefork程序,各個子程序競争accept

主程序預先fork一些程序

各個子程序競争accept,然後處理資料傳輸

一個子程序可以處理一個連接配接,也可以同時處理多個連接配接(通過select等)

驚群現象

c.Prefork程序,由父程序accept請求,通過流管道轉發fd到子程序

主程序accept,通過流管道轉發fd到子程序

子程序收到fd後,處理資料傳輸,處理結束後通知父程序

父程序處理的事情比較簡單,容易監控子程序

以上3種方式性能比較:

a.每個連接配接fork一個程序:處理smtp等狀态較多,資料量比較大時比較簡單實用,總體性能不大好

b.Prefork程序,各個子程序競争accept:比較簡單,性能不錯

c.Prefork程序,由父程序accept請求,通過流管道轉發fd到子程序:代碼複雜,性能一般不如上一種

4.多線程的并發伺服器

每個連接配接一個線程

Prethread多個線程,各個線程互斥accept

Prethread多個線程,主線程accept并分發連接配接給子線程

5.多程序與多線程的比較

使用線程的模型:性能比使用程序要高,但代碼比較複雜,對代碼品質要求更高

線程出錯後可能會影響到所有線程,多程序的模式一個程序出錯一般不會影響其他程序

多線程模型共享資料比較簡單有效,多程序模型共享資料比較麻煩,效率也不如線程

6.一些流行的網絡伺服器采用的模型

Sendmail: 采用多程序,每個連接配接fork一個程序.

每個連接配接fork一個子程序

子程序隻處理一個連接配接

子程序fork一個localmail程序(可以由使用者自己編寫),通過管道把資料轉給localmail處理,把郵件處理業務邏輯獨立出來

優點:結構簡單,不用維護複雜的狀态機

Apache1.3:采用多程序, prefork程序,各個子程序競争accept

Prefork一些子程序

子程序競争accept,每次隻處理一個連接配接

主程序不accept,根據負載情況調整子程序數量

子程序運作一段時間後,主程序會讓它退出,然後建立一個新的程序,防止記憶體洩漏等

主程序通過shared memory監控子程序

7.Tencent自己的一些網絡伺服器采用的模型

移動QQ: Prefork多個程序,競争accept,

典型的一問一答TCP伺服器,結構簡單

Prefork多個程序,競争accept

每個程序通過select可以同時處理多個連接配接

采用這種結構的原因有:

每秒請求<1000,可以滿足要求

結構簡單,容易開發、維護

sylar MAIL: [email protected]