伺服器設計和開發的體會

2021-05-28 00:18:04 字數 1298 閱讀 5224

做伺服器有一段時間了,想記錄下自己的體會。

依我的看法,伺服器可以看做是4個部分組合起來的, 底層的網路框架, 通用的資料結構和庫, 整個伺服器的架構設計,伺服器的上層業務邏輯。

底層的網路框架,目前可以說技術基本都是公開的了, 可以自己從頭寫,採用iocp,epoll。也可以直接使用ace, libevent 或者asio,

如果是linux下,我覺得libevent是個非常好的選擇,效率足夠,而且可移植。**也簡單。ace的缺點,就是比較大,用他來開發,沒有什麼問題,遇到問題需要查詢維護,就比較棘手了,asio看過一點,proactor模式的。口碑也不錯。

如果直接用這些庫來支撐上層邏輯,那麼上層的開發還是比較麻煩的,自己還需要在這些庫的基礎上,再加上一些封裝,以簡化上層的開發難度。

譬如lau stephen老兄的spserver, 就是個不錯的嘗試。他是在libevent的基礎上,整合出乙個應用層框架。

網路框架的兩個關鍵點,1是效能要足夠,2是要方便上層開發。3是要穩定,有這3點,就足夠了。

通用的資料結構和庫,主要是用來實現一些封裝,譬如封裝執行緒,封裝資料庫訪問,封裝執行緒池,封裝記憶體池, 封裝執行緒安全的佇列,該佇列主要用來實現半同步,半非同步模式中關鍵的排隊層。 這個庫,應該是隨著自己的經驗和水平的增進而不斷改進的。對於大部分伺服器的開發,這個庫都是必要的.

整個伺服器的架構設計,設計架構的時候,考慮無非是簡單,容易擴充套件,安全性,成本也是一部分考慮。 沒有通用的架構,只有針對自己的需求和條件的比較好的架構。所以千萬不能照抄架構,要結合自己的實際情況來思考,別人的東西,只能參考。簡單的出發點,就是便於維護,kiss原則。

擴充套件性的關鍵,就在乙個負載均衡,要保證系統中沒有會阻礙效能提公升的障礙點。安全性的考慮,很多關鍵的業務,必須部署在內網,以避免攻擊。

例如,網遊中常用的gate架構,既有安全性的考慮,也有負載均衡的考慮,他只把gate伺服器部署在公網上。

伺服器的上層業務邏輯, 這塊千差萬別,但是有一些共同的問題。譬如邏輯採用單執行緒還是多執行緒的問題,如果上層業務很簡單,譬如就是簡單的資料庫查詢或者註冊認證,可以採用多執行緒來做邏輯,盡可能的提高伺服器的效能。但是如果是很複雜的業務,譬如im或者網遊邏輯伺服器,資料互動會非常多,這個時候,多執行緒是很不可取的,維護,擴充套件性,都會出現很大的問題。查錯也會成為**煩。

最好的執行緒劃分還是按照業務的相關性,把業務糾纏比較緊密的,放在乙個執行緒裡。各個執行緒直接,通過訊息或者佇列來進行通訊。

邏輯伺服器的高下,主要在於細節。譬如資料結構的效率,記憶體分配的效率,伺服器的防禦性程式設計處理, 對於客戶端的協議支援是否全面。 做邏輯伺服器的關鍵,是要用心。只要是花心思了,保證穩定,能夠滿足客戶端的業務需求和效能需求,就是很好了。

伺服器設計,開發的體會

做伺服器有一段時間了,想記錄下自己的體會。依我的看法,伺服器可以看做是4個部分組合起來的,底層的網路框架,通用的資料結構和庫,整個伺服器的架構設計,伺服器的上層業務邏輯。底層的網路框架,目前可以說技術基本都是公開的了,可以自己從頭寫,採用iocp,epoll。也可以直接使用ace,libevent ...

伺服器開發的一點心得體會

這段時間在公司做一款遊戲伺服器開發,開發過程中的一點體會記錄下來,日後也是一點經驗 1.定時重新整理機制,伺服器中,要有不斷定時重新整理的措施,比如任務系統 2.執行緒的管理和排程,一般使用執行緒池方案 3.記憶體方面,為了提高效能,通常使用記憶體池,而不是頻繁地動態分配記憶體 4.資料報的設計,通...

併發伺服器的設計

併發 即同時 併發伺服器 實現多客戶端同時連線,同時處理多個請求。利用多程序或多執行緒的方式處理連線成功後的任務,主程式繼續等待連線。多程序 建立子程序,任務函式交給子程序執行 listen sockfd,5 允許連線的客戶機數目5 while 1 else if pid 0 printf fork...