如何打造高效的多任務、高并發的網絡服務器系統?

同一個功能的軟件,不同的團隊,不同工程師去實現,肯定是千差萬別,甚至從根本上完全不同。所以軟件開發在未來很長時間內仍然是一項工匠的手工勞動,尤其像多任務,高并發,偏底層這種對實現技巧比較高的系統,這種系統對開發者來說仍然充滿挑戰,考驗工程師對產品的理解,經驗的積累,技術方案的取舍,以及各種因素的權衡。總之,平庸的軟件系統,很多人都可以做,但在這個領域內的標桿產品,只有功力深厚的工程師才能駕馭。

對應用服務器業務類型的深入理解
開發一個產品,肯定要先對產品的業務和功能必須有深入的理解,脫離業務去談產品的技術實現,那無異于空中樓閣,沒有根基,產品是為解決業務需求,業務痛點而存在的。首先架構師將一個大的解決方案進行模塊切分,然后對每個軟件業務模塊進行需求定義,接下來技術專家對實現方案進行技術論證決策和開發任務提煉,最后開發工程師負責開發任務的實現。作為各個環節的參與者,我們首先要深入理解需求定義,探明軟件日常的工作場景,然后才能有針對性的進行相關的構建和設計。
我們一般大體上將服務器軟件類型分為“IO密集型”和“計算密集型”。IO密集型,顧名思義,就是說軟件要處理高并發,大數據量的網絡或者文件IO請求,這時我們要將CPU計算資源向IO傾斜,并審慎的選擇高效的IO模型,IO模型的選擇也包含了很多技術內容,同時也有很多的框架支撐,具體不在此贅述。計算密集型,就是說軟件的主要業務是進行同步計算,這時我們的側重點要考慮如何在多核CPU之間分配、同步這些計算任務,使之充分利用計算資源;IO層面如何做到精簡,穩定,可靠。當然也存在著“IO和計算混合型”,那我們就要結合具體業務綜合考慮技術方案。總之,兵無常勢 水無常形,具體問題,具體分析,決策的依據都來源于我們日常的總結與積累。

計算任務的合理分配(多任務CPU資源的分配)
我們早已邁入多核CPU的時代,在服務器領域,尤其如此。服務端的軟件系統要充分利用計算資源,那就必須適應多核CPU的并發特性。提到這里,很多人會想“不就是多搞幾個線程就行了,有什么難的”,是啊,那搞幾個線程?為什么要把這個任務放在這個線程里?深究起來,都不是簡單的問題,我們在開發一個系統前,必須要有“并發性規劃”,根據業務特點,進行進程,線程,線程池,同步/異步,阻塞/非阻塞的規劃選擇,任何選擇都不是隨意的,都是有考量和統籌的,甚至有模擬演算,這樣的決策才是科學、有效的。

IO復用模型的合理選擇
服務端系統要么要接收外界的數據流,要么要監聽外界的指令。數據流和指令的接收處理方式,都要涉及到IO模型的選擇,尤其對IO密集型的應用,IO模型的選擇和開發實現,是產品成功與否的關鍵,這也是CamelProxy的核心技術。除了標準的socket標準,不同的操作系統平臺也對IO復用模型有不同的技術支持,比如Linux平臺的poll, epoll,Windows的重疊IO,完成端口等。同時也產生了很多第三方的跨平臺的C++網絡開發框架和庫,同時支持同步的,異步的,反應式,前攝式的等操作方式,并且也提供了很多網絡開發過程必不可少的組件,比如主動對象,線程池,消息隊列,同步控制等。這方面的框架包括ACE, Libevent, Boost等,都是非常好的網絡開發知識總結和實現。總之,沒有差的技術,只有合不合適你當前場景的技術,合理的選擇,將會事半功倍。

內存資源的高效使用
作為一個服務器后臺系統的開發者,我們都希望自己的系統高效,能夠長時間穩定運行的,最好能連續幾個月,不需要重啟的。從我們的經驗來看,要達到這個目標,必須對內存的調配使用要著重考量。內存的使用也是反應一個開發者在C, C++編程能力的重要指標,如果代碼中臨時對象,內存復制滿天飛,起碼就反映了開發者對語言的機制沒有深入洞悉。在內存使用技巧上,要注意兩個方面。首先,不要頻繁的進行內存的動態分配,釋放,避免內存碎片的累積。很多系統也沒有內存泄漏,但隨著運行時間的退役,內存占用量不斷上升,最終到了一個臨界點,然后系統就必須重啟。內存最好在系統開始運行就分配好,再根據系統的負載的變化動態的調整預分配的內存,或者用內存池等技巧來優化;再者,編程實現時,注重指針,引用的使用,避免不必要的臨時對象的產生,用不好指針的程序員,不是合格的C++開發者。總之,開發高效,穩定的系統,內存的編程實現技巧必不可少,考驗的也是開發者的功力于思考。

多線程并發的有效控制
充分挖掘多核CPU的計算能力,就必須應用多線程,多執行路徑的程序設計方式。多線程開發除了帶來線程路徑設計和執行任務分配的問題外,還有一個重要的問題就是線程間的協作和通信。這不僅包括了多線程對競爭資源的訪問控制,也包含了線程的通知激活,優雅退出,以及衍生出來消息隊列,流水線操作,都需要適當的場景選擇合適的方案。

語言工具的選擇
干什么活用什么樣的工具,工具的選擇會使過程和結果事半功倍。做高性能,大容量,高并發服務端后臺服務軟件系統,開發語言一定是C,C++, 因為該語言提供了足夠的空間,讓你充分運用各種技巧來優化程序的性能,這是其他高層語言所不能具備的,其他語言為了降低開發者所需掌握的難度與復雜性,做了太多的封裝與抽象化,不適合做一些高性能的應用。
選擇了對的工具,剩下的就是考驗實現者對工具的運用的水平,也是系統實現的關鍵和核心,也體現了一個高水平開發者對軟件的認識與思考,懂得如何有的放矢,充分解決問題,又不臃腫。正可謂“增一分則太長,減一分則太短”,取舍之間,大有乾坤。

這是在開發網絡代理服務器CamelProxy系統-CamelProxy代理服務器過程中一點經驗總結,如果您有更好的建議,歡迎批評指正。

轉載于:https://blog.51cto.com/13535157/2093238

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/452178.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/452178.shtml
英文地址,請注明出處:http://en.pswp.cn/news/452178.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

BZOJ.2780.[SPOJ8093]Sevenk Love Oimaster(廣義后綴自動機)

題目鏈接 \(Description\) 給定n個模式串,多次詢問一個串在多少個模式串中出現過。(字符集為26個小寫字母) \(Solution\) 對每個詢問串進行匹配最終會達到一個節點,我們需要得到這個節點所代表的子串出現在多少個模式串中。 建立廣義后綴自動機。每次插入…

BigDecimal 加減乘除運算

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 java.math.BigDecimal。BigDecimal一共有4個夠造方法,讓我先來看看其中的兩種用法: 第一種:BigDeci…

主碼 超碼 候選碼

碼是數據系統中的基本概念。所謂碼就是能唯一標識實體的屬性,他是整個實體集的性質,而不是單個實體的性質。它包括超碼,候選碼,主碼。   超碼是一個或多個屬性的集合,這些屬性可以讓我們在一個實體集中唯一地標識一…

學成在線--18.新增課程(課程分類查詢)

文章目錄一.需求分析二.課程分類查詢介紹三.數據結構四.數據格式五.數據模型六.Api接口七.服務器端1.Dao1)定義mapper2)定義mapper映射文件2.Service3.Controller八.接口測試一.需求分析 用戶操作流程如下: 1、用戶進入“我的課程”頁面&…

給程序員們的工資報價提醒

在薪水上討價還價的方式有很多種,我要說的這一點也許并不是最好的。然而,如果使用的得當,會收到很好的效果。如果你正在跟一家公司接觸(沒有經過職業中介),而且事情看來很順利,進度很快,你要保持這種面試的…

POI 方式-excle 表格導出實現-java-poi

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 效果&#xff1a; jsp 頁面 用的Bootstrap &#xff1a; <li class"dropdown"> <a href"javascript:void(0)…

02-css的選擇器

css的選擇器&#xff1a;1.基本選擇器 2.高級選擇器 基本選擇器包含&#xff1a; 1.標簽選擇器標簽選擇器可以選中所有的標簽元素&#xff0c;比如div&#xff0c;ul&#xff0c;li &#xff0c;p等等&#xff0c;不管標簽藏的多深&#xff0c;都能選中&#xff0c;選中的是所有…

iphoneX樣式兼容

// 1.viewport meta 標簽增加屬性viewport-fitcover // 2.body元素增加樣式 body { padding-bottom: constant(safe-area-inset-bottom); padding-bottom: env(safe-area-inset-bottom); } // 3.如有fixed底部的元素&#xff0c;也增加上面樣式 xxx { padding-bottom: constant…

學成在線--19.新增課程(數據字典)

文章目錄一.介紹二.數據模型三.數據模型類四.字典查詢API接口五.服務器端1.Dao2.Service3.Controller一.介紹 在新增課程界面需要選擇課程等級、課程狀態等&#xff0c;這些信息統一采用數據字典管理的方式。 本項目對一些業務的分類配置信息&#xff0c;比如&#xff1a;課程…

范式簡介

范式是符合某一種級別的關系模式的集合。關系數據庫中的關系必須滿足一定的要求。滿足不同程度要求的為不同范式。范式的種類&#xff1a; 第一范式(1NF) 第二范式(2NF) 第三范式(3NF) BC范式(BCNF) 第四范式(4NF) 第五范式(5NF) 一個低一級范式的關系模式&#xff0c;通過模…

程序員的進化

對于很多同學來說&#xff0c;他們對程序員的職業生涯非常關注。而這本質上是一個進化的過程。我們將如何進化&#xff1f;在每個進化階段我們應該如何提高自己&#xff1f;下面的文章根據我自己的切身經歷和閱讀過的書&#xff0c;為程序員每個階段的進化提供了不同的學習思路…

【樹形dp】vijos1144小胖守皇宮

細節很精妙 描述 huyichen世子事件后&#xff0c;xuzhenyi成了皇上特聘的御前一品侍衛。 皇宮以午門為起點&#xff0c;直到后宮嬪妃們的寢宮&#xff0c;呈一棵樹的形狀&#xff1b;某些宮殿間可以互相望見。大內保衛森嚴&#xff0c;三步一崗&#xff0c;五步一哨&#xff0c…

手機號碼歸屬地及運營商查詢

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL;public class NewMobile {public stati…

redhat6.5手動配置網絡

2、手動設置ip地址如果虛擬機不能自動獲取IP&#xff0c;只能手動配置&#xff0c;配置方法如下&#xff1a;輸入命令#vi /etc/sysconfig/network-scripts/ifcfg-eth0 [編輯網卡的配置文件]輸入上述命令后回車&#xff0c;打開配置文件&#xff0c;使用方向鍵移動光標到最后一行…

學成在線--20.新增課程(最后完善)

文章目錄一.效果展示二.服務端1.Api接口2.Dao3.Service4.Controller三.前端1.頁面完善1&#xff09;創建course_add.vue頁面2&#xff09;course_add.vue頁面路由3&#xff09;course_list.vue中添加鏈接2.查詢數據字典1&#xff09;視圖中代碼2&#xff09;定義Api方法3&#…

http協議工作流程

用戶單機鼠標后所發生的事件過程如下&#xff1a; &#xff08;1&#xff09;瀏覽器分析鏈接所指向頁面的URL。 &#xff08;2&#xff09;瀏覽器向DNS服務器請求解析URL的IP地址。 &#xff08;3&#xff09;域名系統DNS解析出URL對應的IP地址。 &#xff08;4&#xff09…

html里面表格問題

表格問題匯總&#xff1a; 現代網站中表格的用武之地已經很少了&#xff0c;但是一些框架&#xff0c;如bootstorp還是會用到的&#xff0c;所以還是需要了解掌握。本隨筆只涉及開發過程中遇到的表格問題&#xff0c;不做其他拓展。 1、caption代表的是表格元素的標題。至于標題…

利用Underscore求數組的交集、并集和差集

1 數組交集函數——intersection 數組的交集是指包含多個數組中的共同元素的一個數組&#xff0c;求數組的交集就是找出給定數組中的共有元素。 下面實現一個求兩個數組交集的函數。 判斷數組是夠包含指定值&#xff0c;使用Array.indexOf就可以。所以我們可以遍歷第一個參數數…

RT-Thread簡介

RT-Thread簡介 RT-Thread是一款完全由國內團隊開發維護的嵌入式實時操作系統&#xff08;RTOS&#xff09;&#xff0c;具有完全的自主知識產權。 經過16個年頭的沉淀&#xff0c;伴隨著物聯網的興起&#xff0c;它正演變成一個功能強大、組件豐富的物聯網操作系統。 RT-Thre…

調用第三方API ,實現手機號碼歸屬地及運營商查詢

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 運行結果&#xff1a; 中國電信 西雙版納 西雙版納,中國電信 代碼&#xff1a; import java.io.BufferedReader; import java.io.I…