• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于協(xié)程的高并發(fā)架構(gòu)研究

      2018-08-18 08:23:26劉健黃才勝
      關(guān)鍵詞:計算機(jī)軟件

      劉健 黃才勝

      摘要:本文運用goroutine的簡便特點研發(fā)了webgo架構(gòu),通過對比webgo架構(gòu)和beego架構(gòu)可以看出融入?yún)f(xié)程思想的高并發(fā)架構(gòu)更有優(yōu)勢。

      關(guān)鍵詞:計算機(jī);軟件;協(xié)程;高并發(fā)結(jié)構(gòu)

      中圖分類號:TP311.52 文獻(xiàn)標(biāo)識碼:A 文章編號:1007-9416(2018)04-0085-02

      隨著我國網(wǎng)絡(luò)建設(shè)的不斷發(fā)展,軟件研發(fā)產(chǎn)業(yè)也進(jìn)入了發(fā)展的快車道,越來越多的網(wǎng)頁以及應(yīng)用軟件應(yīng)運而生,如何提高網(wǎng)絡(luò)的效率和便捷性日益成為人們關(guān)注的焦點。相比于傳統(tǒng)網(wǎng)絡(luò)來說,如今網(wǎng)民對網(wǎng)絡(luò)的要求更高,使用頻率也更高,為了滿足廣大網(wǎng)民對計算機(jī)系統(tǒng)的高要求,軟件工程師們加大了對計算機(jī)高并發(fā)架構(gòu)的研發(fā)力度。雖然物理結(jié)構(gòu)上的改變能夠高并發(fā),但是這種改變需要大量的服務(wù)器,運行成本將大幅度增加,另外,由于線程的數(shù)量有限,因此,本文利用協(xié)程的思想進(jìn)行多線程的程序設(shè)計。

      1 協(xié)程

      1.1 協(xié)程定義

      所謂協(xié)程,其實是一套簡便程序組件,協(xié)程比傳統(tǒng)的線程使用起來更為簡單輕巧[1]。進(jìn)程與線程是操作系統(tǒng)中的兩種結(jié)構(gòu),通過交叉結(jié)合使用進(jìn)程與線程可以讓計算機(jī)的操作系統(tǒng)出于多種運行模式下。對于單核CPU來說,每次僅調(diào)用單個進(jìn)程或線程。調(diào)度內(nèi)核能夠使進(jìn)程與線程交替獲得CPU資源,從而把使用者所提交的作業(yè)化整為零。

      協(xié)程與進(jìn)程、線程有著明顯的不同:協(xié)程提出于編譯器層面,而進(jìn)程、線程提出于操作系統(tǒng)層面;協(xié)程是通過提議一種語言來做編譯器的標(biāo)準(zhǔn),再由編譯器的制造者實現(xiàn)這種機(jī)制,而進(jìn)程、線程是通過操作系統(tǒng)來進(jìn)行分配與調(diào)度的;協(xié)程是通過引入相關(guān)代碼使代碼段可以分段運行,重啟處由yield關(guān)鍵字決定,而進(jìn)程、線程是通過保存、恢復(fù)等中段的形式來完成的,其本質(zhì)仍舊是利用CPU時間片[2]。

      1.2 協(xié)程編程

      函數(shù)在軟件程序進(jìn)行調(diào)用的過程與遞歸思想很相似,要等到被調(diào)用者給出數(shù)據(jù)時調(diào)用者才能開始調(diào)用,例如,函數(shù)A若想調(diào)用函數(shù)B,那么只有在函數(shù)B執(zhí)行完畢并將結(jié)果返回以后,函數(shù)A方能開始執(zhí)行。所以,系統(tǒng)內(nèi)部是通過棧完成調(diào)用函數(shù),即函數(shù)執(zhí)行就是線程執(zhí)行[3]。調(diào)用函數(shù)時要有輸入與輸出,是按順序運行,但是協(xié)程調(diào)用不需要像程序調(diào)用那樣等待結(jié)果,可直接運行下去,當(dāng)收到協(xié)程反饋回的結(jié)果后,再繼續(xù)對上訴結(jié)果進(jìn)行處理。若需用多核來進(jìn)行多協(xié)程編程,那么就要用多進(jìn)程與多線程結(jié)合的形式,這是由于協(xié)程仍然占用單個CPU核[4]。

      綜上所述,進(jìn)程的堆棧都不共享,調(diào)度是由操作系統(tǒng)來完成的;線程只是共享堆,但不共享棧,調(diào)度仍是由操作系統(tǒng)來完成的;協(xié)程也只是共享堆,但不共享找,調(diào)度是由編程人員來完成的。

      2 REST簡介

      最初提出的REST(Representational State Transfer)只定義了部分編程的規(guī)范與準(zhǔn)則,當(dāng)設(shè)計符合這些規(guī)范與準(zhǔn)則時,就將這些設(shè)計稱為RESTful設(shè)計[5]。這種以資源為核心的編程方式給編程留下了通用接口,且能夠在高效使用HTTP協(xié)議時簡化web的編程框架。Google提出的golang語言僅僅支持的是底層REST。

      對于REST來說,資源是最重要最寶貴的,這些資源能夠利用URI定位到服務(wù)器上,其中URI能夠在http的前部信息里通過特定的字段來展現(xiàn)資源。REST中涉及到的表現(xiàn)層是通過json格式的數(shù)據(jù)來展現(xiàn)資源的,通常web涉及采用的是json多的前后端交互。在訪問網(wǎng)站時,數(shù)據(jù)會在瀏覽器和服務(wù)器之間進(jìn)行不斷的交互,但http協(xié)議是無狀態(tài)的,只是明確了訪問規(guī)范。在進(jìn)行狀態(tài)保存時,在服務(wù)器端進(jìn)行的編程會發(fā)揮作用,因此,仍舊要通過http來訪問服務(wù)器端??傊?,RESTful的特點可以概括為三點:(1)資源用URI來表示;(2)在資源表現(xiàn)層進(jìn)行數(shù)據(jù)交換;(3)客戶端通過http來操作服務(wù)器資源。

      由于REST減少了交互延遲,精簡了框架設(shè)計,降低了系統(tǒng)冗余度,能夠大量擴(kuò)展,因此,REST不僅使客戶端與服務(wù)器端的交流變得更為簡便,而且使系統(tǒng)能夠進(jìn)一步得到擴(kuò)展。本文所研究的高并發(fā)架構(gòu)可以通過對REST的稍加改造來達(dá)到golang的REST標(biāo)準(zhǔn)。本文只實現(xiàn)了3個層次,在實際應(yīng)用中,可以根據(jù)實際需要來選擇要實現(xiàn)的規(guī)范。

      3 webgo框架的設(shè)計與實現(xiàn)

      本文所設(shè)計的webgo框架能夠迅速構(gòu)建golang語言應(yīng)用的HTTP框架,能夠迅速開發(fā)各種web應(yīng)用,該框架是一個融合了golang特性的RestFul框架。

      3.1 路由模塊

      HTTP的請求通過路由組件發(fā)送給相應(yīng)函數(shù)進(jìn)行處理,路由相當(dāng)于框架中的事件處理器,用戶請求路徑(path)與查詢串信息HTTP請求方法(method)均包含在事件中,路由器的作用其實是將用戶請求信息傳到了一個處理函數(shù)。路由的設(shè)置思路主要是路由信息的添加與要執(zhí)行函數(shù)的轉(zhuǎn)發(fā):路由信息的添加是用http.Handle與http.HandleFunc等函數(shù)實現(xiàn)的,均在底層調(diào)用DefaultServeMux函數(shù),該函數(shù)能夠?qū)⒙酚尚畔Σ赜趍ap信息中;要執(zhí)行函數(shù)的轉(zhuǎn)發(fā)是通過監(jiān)聽端口Go將接收到的tcp連接交由Handler進(jìn)行處理。

      雖然當(dāng)前的Web應(yīng)用路由均是基于http默認(rèn)路由器來實現(xiàn)的,但有三點限制:(1)參數(shù)無法自行設(shè)定;(2)對REST模式無法完美支持且不能限制訪問;(3)路由規(guī)則多,程序編寫復(fù)雜。為了克服上訴限制,設(shè)計了一種考慮存儲路由與轉(zhuǎn)發(fā)路由的REST方式路由。本文設(shè)計的高并發(fā)架構(gòu)含有controllerInfo和controllerRegistor兩個數(shù)據(jù)類型。

      3.2 業(yè)務(wù)邏輯模塊

      本文在現(xiàn)有REST準(zhǔn)則規(guī)范的基礎(chǔ)上設(shè)計了新型MVC格式的框架,在本文中將其命名為controller,這提高了web應(yīng)用開發(fā)效率,相比于以前基于Action的MVC框架更為簡單高效。MVC式的架構(gòu)模式十分普遍,M是指模型(Model),V是指視圖(View),C是指控制器(Controller)。MVC式的架構(gòu)模式實質(zhì)是利用了分層思想,即分開業(yè)務(wù)邏輯與展示,模型表示的是服務(wù)器端的數(shù)據(jù)結(jié)構(gòu),視圖表示的是前端表現(xiàn)層(網(wǎng)頁、模板等),控制器是實現(xiàn)業(yè)務(wù)邏輯的。對于前面http里的handler來說,handler其實是一個控制器。MVC式的架構(gòu)模式核心是控制器,這是展示與加工數(shù)據(jù)的來源,而且一個正常系統(tǒng)可以沒有模型和視圖,但不能沒有控制器。本文設(shè)計的高并發(fā)架構(gòu)包含struct和interface兩個類型。

      3.3 日志模塊

      在程序設(shè)計人員編寫程序的過程中,日志的正確使用是十分重要的,這是因為調(diào)試信息是記錄在日志中的。webgo的日志模塊是在seelog的基礎(chǔ)上開發(fā)的,它是依據(jù)level的類型來輸出各種類型的日志,這樣做能夠使開發(fā)程序和部署程序變得更為簡單,實用性更強(qiáng)。通常在開發(fā)程序時設(shè)置一個較低的level值,在部署程序的時候再將原本較低的level值調(diào)高,此做法能夠屏蔽掉開發(fā)過程里的調(diào)試信息。

      本文將seelog部署程序的思想融入設(shè)計webgo日志中,依據(jù)level的不同值來記錄相關(guān)的日志,然而webgo的日志系統(tǒng)的級別較輕,使用了系統(tǒng)自帶的log.Logger接口,默認(rèn)將信息傳送至os.Stdout,用戶能夠利用這個接口,再用webgo.SetLogger對輸出進(jìn)行自定義設(shè)定。

      4 webgo和beego的比較分析

      beego框架大量的應(yīng)用到Golang的web框架中,相比于其它webgo框架,本文所設(shè)計的主要優(yōu)勢體現(xiàn)在對路由的轉(zhuǎn)發(fā)以及業(yè)務(wù)邏輯的處理封裝方面。

      4.1 webgo和beego的路由對比

      本文是通過map在webgo框架的底層存儲路由的,雖然beego里樹狀結(jié)構(gòu)的存儲空間較少,但是其比map更為高效。beego框架的優(yōu)勢能夠在具有許多路由的時候體現(xiàn)出來,這使得高并發(fā)且少量路由時的webgo更占優(yōu)勢。

      4.2 webgo和beego的業(yè)務(wù)邏輯處理對比

      程序段中的Ctx字段存儲了大量上下文中所包含的信息,例如,含有各種數(shù)據(jù)的清單表格、客戶端輸入的各類參數(shù)以及URI等。這些字段存儲在beego的map中。當(dāng)有多個路由的時候,存儲上下文中的信息變得更為簡單。然而當(dāng)并發(fā)量異常巨大時,存儲起來的上下文中的信息將占用大量的空間,因此,本文所設(shè)計的基于協(xié)程的高并發(fā)架構(gòu)webgo將會去掉存儲模塊。

      5 結(jié)語

      beego作為golang的web框架,它主要針對的是那些量級很高的研發(fā)項目,傾向于開發(fā)API,但是本文所研發(fā)設(shè)計的webgo框架主要針對的是那些量級很低且高并發(fā)的快速研發(fā)項目。當(dāng)處于項目研發(fā)的前期階段時,要在盡可能匹配考慮項目應(yīng)用環(huán)境的前提下選擇適合的框架,只有應(yīng)用了合適的框架才能在提高效率的同時大幅度壓縮研發(fā)周期。

      通過分析測試以及對比的結(jié)果可以發(fā)現(xiàn),本文提出的基于協(xié)程的高并發(fā)架構(gòu)大大改善了原有的性能指標(biāo):(1)服務(wù)器端的負(fù)載量級從百萬級提高至千萬級;(2)成倍擴(kuò)大單位時間內(nèi)需要建立的連接數(shù)量(qbs),最終能夠比處于同樣應(yīng)用環(huán)境的多線程高10倍;(3)相同并發(fā)量的運行時間減少約68%,當(dāng)并發(fā)量在1000萬的時候,基于協(xié)程的高并發(fā)架構(gòu)運行時間從3.7s縮減到2.2s;(4)內(nèi)存消耗下降了約140%,當(dāng)并發(fā)量在1000萬的時候,基于協(xié)程的高并發(fā)架構(gòu)消耗內(nèi)存從240M縮減到100M。

      參考文獻(xiàn)

      [1]李中躍.一種低成本的C語言協(xié)程實現(xiàn)[J].遼寧省交通高等??茖W(xué)校學(xué)報,2012,(4):23-26.

      [2]石剛,王生原,董淵,等.同步數(shù)據(jù)流語言可信編譯器的構(gòu)造[J].軟件學(xué)報,2014,(2):341-356.

      [3]諶衛(wèi)軍.C程序設(shè)計課程中的堆與棧[J].計算機(jī)教育,2015(5):98-102.

      [4]鄒昌偉,王林.面向嵌入式的協(xié)程與腳本化機(jī)制[J].計算機(jī)應(yīng)用,2014,(5):1408-1412.

      [5]章武媚.基于RESTfulWeb技術(shù)的資源管理系統(tǒng)設(shè)計與實現(xiàn)[J].計算機(jī)應(yīng)用與軟件,2014,(5):23-28.

      猜你喜歡
      計算機(jī)軟件
      禪宗軟件
      英語文摘(2021年10期)2021-11-22 08:02:26
      計算機(jī)操作系統(tǒng)
      穿裙子的“計算機(jī)”
      基于計算機(jī)自然語言處理的機(jī)器翻譯技術(shù)應(yīng)用與簡介
      科技傳播(2019年22期)2020-01-14 03:06:34
      計算機(jī)多媒體技術(shù)應(yīng)用初探
      科技傳播(2019年22期)2020-01-14 03:06:30
      軟件對對碰
      巧用立創(chuàng)EDA軟件和Altium Designer軟件設(shè)計電路
      電子制作(2019年24期)2019-02-23 13:22:20
      信息系統(tǒng)審計中計算機(jī)審計的應(yīng)用
      即時通訊軟件WhatsApp
      CHIP新電腦(2015年10期)2015-10-15 18:03:55
      Fresnel衍射的計算機(jī)模擬演示
      汶上县| 鸡西市| 文水县| 舟山市| 仲巴县| 托里县| 溧水县| 贵溪市| 武川县| 靖远县| 中山市| 高阳县| 衡南县| 揭西县| 奉化市| 饶平县| 许昌县| 交口县| 汕头市| 红原县| 南丹县| 龙泉市| 伊吾县| 都江堰市| 搜索| 乾安县| 甘孜| 通辽市| 开平市| 秦安县| 道真| 裕民县| 苗栗县| 塔城市| 榆树市| 金昌市| 南康市| 伊宁市| 武山县| 文成县| 米泉市|