日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

为什么我要选择erlang+go进行server架构(2)

發(fā)布時(shí)間:2025/3/8 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 为什么我要选择erlang+go进行server架构(2) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處:server非業(yè)余研究http://blog.csdn.net/erlib 作者Sunface

為什么我要選擇Erlang呢?

? ? ? 一、erlang特別適合中小團(tuán)隊(duì)創(chuàng)業(yè):

? ? ? ?erlang有異常成熟、經(jīng)過(guò)電信級(jí)別大規(guī)模驗(yàn)證的OTP應(yīng)用庫(kù),僅僅須要非常easy的代碼就能建立起異常穩(wěn)定、容錯(cuò)性強(qiáng)、擴(kuò)展性強(qiáng)、高并發(fā)的server框架,這也是erlang最寶貴的核心價(jià)值所在。

? ? ? 二、erlang是天生的并發(fā)語(yǔ)言

? ? ? ? ? ?erlang的并發(fā)特性是語(yǔ)言級(jí)別的,從開(kāi)發(fā)伊始就採(cǎi)用了CSP并發(fā)模式, 以進(jìn)程為單位,進(jìn)程間沒(méi)有共享內(nèi)存,變量不可變的實(shí)現(xiàn)方式保證了無(wú)鎖的并發(fā)模型,因此也是異常高效的,換句話說(shuō):你僅僅要像尋常一樣寫(xiě)代碼就能并發(fā),全然不用擔(dān)心不論什么底層實(shí)現(xiàn),你的代碼能完美的并行執(zhí)行在多核server上,假設(shè)你能寫(xiě)出美麗的并發(fā)級(jí)別的算法和代碼(盡量少的順序代碼),那在32核機(jī)器上就能跑出32倍性能!!!! Go 語(yǔ)言的并發(fā)模型也是取經(jīng)于Erlang,可是我覺(jué)得Erlang的并發(fā)模型更優(yōu)秀,由于進(jìn)程間全然沒(méi)有共享內(nèi)存,全然無(wú)鎖。

? ? ? 三、再介紹下我當(dāng)初的業(yè)務(wù)需求

? ? ? ? ?一款多人在線游戲,一個(gè)玩家走一步都要把消息廣播給同屏的玩家,玩家聊天,戰(zhàn)斗更涉及到大量的消息廣播;怎樣應(yīng)對(duì)?再有一個(gè)及其普通卻不太easy搞定的的需求:在線玩家列表怎么實(shí)現(xiàn)?是啊,你是不是在想用哪種鎖合適?提到的兩個(gè)場(chǎng)景的關(guān)鍵詞是:高并發(fā),大量廣播;可能你還會(huì)想到"鎖".

? ? ? ? 我嘗試過(guò)在.net下使用完畢port+TPL庫(kù)+protocol buffer來(lái)完畢上面的功能,可是并沒(méi)有通過(guò)測(cè)試的檢驗(yàn),測(cè)試模型是聊天.在收發(fā)消息方面,client和server一對(duì)一的收發(fā)壓力不大,可是一旦開(kāi)啟廣播,壓力一下就上去了.對(duì)象的頻繁創(chuàng)建會(huì)導(dǎo)致垃圾回收,而垃圾回收會(huì)導(dǎo)致CPU和內(nèi)存都飄忽不定,中間增加對(duì)象池會(huì)得到一定緩解,可是不能徹底解決這個(gè)問(wèn)題,然后想到的就是人為干預(yù)垃圾回收,推斷標(biāo)準(zhǔn)是什么呢?那就是用PerformanceCounter吧,結(jié)果發(fā)現(xiàn)PerformanceCounter一次調(diào)用分配的內(nèi)存相當(dāng)大!最后一版的結(jié)果是:聊天室模型,一人說(shuō)話廣播給全部人,300人在線可以穩(wěn)定,人數(shù)一多就開(kāi)始不淡定了.這些都是經(jīng)過(guò)量化分析得出的結(jié)果,使用的工具是Visual Studio2010中的Performace Profile工具.

? ? ? ?須要解決的第二個(gè)問(wèn)題就是并發(fā)加鎖,最簡(jiǎn)單的測(cè)試模型就是在線玩家列表.這個(gè)問(wèn)題相同困擾了我非常久,嘗試各種鎖,還是在拋異常,要么就是性能的下降,問(wèn)題此起彼伏.興許還要解決TCP通信的數(shù)據(jù)格式,以及粘包等問(wèn)題......

? ? ? ?項(xiàng)目時(shí)間緊張,存在的風(fēng)險(xiǎn)非常多,要盡快把技術(shù)方案確定下來(lái)然后去推進(jìn)別的事情;可是可供選擇的方案有C++和Erlang.坦白講我和團(tuán)隊(duì)的基礎(chǔ)假設(shè)使用C++方案,一定能搞出來(lái),可是排錯(cuò)和性能優(yōu)化將是一個(gè)巨大的挑戰(zhàn).那么Erlang呢?從開(kāi)篇引用的那段文字看,好像這就是我須要的,簡(jiǎn)單了解了一下語(yǔ)法,還是非常驚喜,因?yàn)橹皩?duì)F#有過(guò)接觸,一下感覺(jué)非常親切.并且我特別關(guān)注到:

? ? ?長(zhǎng)處:

? ? ? 1.面向并發(fā),有成熟并且久經(jīng)考驗(yàn)的框架可供使用,網(wǎng)絡(luò)部分已經(jīng)經(jīng)過(guò)了良好封裝

? ? ? 2.內(nèi)存緩存解決方式進(jìn)程字典,前者的讀寫(xiě)速度是50NS-100Ns級(jí)別的

? ? ? 3.對(duì)二進(jìn)制數(shù)據(jù)解析的語(yǔ)法是直觀,簡(jiǎn)單,強(qiáng)大(游戲中有大量的二進(jìn)制數(shù)據(jù)要處理

? ? ? 4.沒(méi)有共享內(nèi)存! 沒(méi)有鎖!(我們?cè)诖a中沒(méi)有過(guò)顯示使用鎖)

? ? ?缺點(diǎn)

? ? ? ?1.從一種語(yǔ)言過(guò)渡到還有一種語(yǔ)言,會(huì)有各種不爽:

? ? ? ?2.控制邏輯簡(jiǎn)單僅僅有if 和 case ,并且有if沒(méi)有else,沒(méi)有continue break goto

? ? ? ?3.包含kernel庫(kù)和standlib庫(kù)在內(nèi),非常多函數(shù)和變量的命名和傳統(tǒng)語(yǔ)言不一樣

? ? ? ?因此我們就決定了採(cǎi)用erlang來(lái)又一次寫(xiě)一套全新的架構(gòu),事實(shí)證明當(dāng)初的決定是無(wú)比正確的,一個(gè)極少須要重新啟動(dòng)、能熱更、穩(wěn)定的游戲server實(shí)在是太重要了,并且開(kāi)發(fā)過(guò)程和維護(hù)是如此的高速和輕松,我們的團(tuán)隊(duì)一致覺(jué)得:從來(lái)沒(méi)有想過(guò)開(kāi)發(fā)會(huì)是這么一件愉快的事情!

既然Erlang已經(jīng)被我“吹”的快飛起來(lái)了,為什么還要使用Go?

? ?鑒于Go語(yǔ)言已經(jīng)婦孺皆知了,我也就不介紹了,大概說(shuō)說(shuō)我自己的情況,我這人沒(méi)啥其它興趣愛(ài)好,業(yè)余時(shí)間絕大部分都花費(fèi)在所謂的“程序猿要不停的學(xué)習(xí)才不會(huì)落伍”上,因此在11年的時(shí)候,知道了go,斷斷續(xù)續(xù)學(xué)習(xí)了一年后,Go1.1版本號(hào)出來(lái)后,發(fā)現(xiàn)改進(jìn)非常大,就開(kāi)始認(rèn)真研究并常年混跡在google-group及國(guó)外大牛的博客世界中,自我感覺(jué)還能夠。當(dāng)然我絕對(duì)不是Go的“朝圣者”,也發(fā)現(xiàn)Go確實(shí)不是非常完美,詳細(xì)能夠參見(jiàn)“為什么我要放棄Go“,此文作者的觀點(diǎn)我盡管不敢全然茍同,可是有些觀點(diǎn)還是贊同的,比方說(shuō)非常多Go愛(ài)好者是非常護(hù)短的,假設(shè)你敢說(shuō)什么“壞話”,就等著被查水表吧 ;)。

??

項(xiàng)目nodejspythonc++/rubyerlanggolang
體系成熟43553
開(kāi)發(fā)效率55345
性能33554
加密公布30435
邏輯簡(jiǎn)單55345
易學(xué)易用55254
跨平臺(tái)55555
從上表中能夠看出 erlang和go之間的互補(bǔ)性還是非常好的,Go的體系成熟度確實(shí)還有待提高

? ?因?yàn)镋rlang和Go都是非常棒的語(yǔ)言,這里就出現(xiàn)一個(gè)問(wèn)題:二選其一還是物盡其用?經(jīng)過(guò)深思熟慮后,我和團(tuán)隊(duì)選擇了后者。首先,erlang的OTP寫(xiě)server并發(fā)框架非常之簡(jiǎn)單、穩(wěn)定且高性能,erlang的Mnesia數(shù)據(jù)庫(kù)也是非常輕量:速度非常快,分布式簡(jiǎn)單,使用起來(lái)也非常原生態(tài)(是Erlang標(biāo)準(zhǔn)庫(kù)支持的),全部的這些都能把程序猿從繁瑣的工作中解放出來(lái),可是,erlang也有個(gè)挺重要的問(wèn)題(在不同業(yè)務(wù)場(chǎng)景中此問(wèn)題或許非常突出,也可能全然無(wú)關(guān)緊要,至少85%的情況下不算一個(gè)問(wèn)題):它是虛擬機(jī)語(yǔ)言,對(duì)于順序代碼的運(yùn)行速度僅僅有C的七分之中的一個(gè),盡管能夠利用多核的優(yōu)勢(shì),可是在大型mmorpg中,消息密集時(shí),CPU的瓶頸還是挺明顯的,會(huì)影響玩家順暢的體驗(yàn)感覺(jué)(ARPG)。

? ? 因此我就想假設(shè)邏輯這部分用Go來(lái)寫(xiě),是不是能夠非常好的利用這兩個(gè)語(yǔ)言的長(zhǎng)處進(jìn)行互補(bǔ)?心動(dòng)不如行動(dòng),由于我們的erlang游戲架構(gòu)的藕合度還是挺低的,因此分離出來(lái)地圖server,用Go又一次實(shí)現(xiàn)了下,通過(guò)socket跟erlang架構(gòu)部分進(jìn)行通信,發(fā)現(xiàn)效果異常之好,Go的性能、并發(fā)的原生支持再配合上erlang寫(xiě)游戲框架,在性能上已經(jīng)絕不亞于C++框架,可是后者大家都懂,中關(guān)村程序猿據(jù)說(shuō)平均壽命50多歲,非常大的一部分原因是由于這個(gè)。

以后的路怎么走?

?? ?混合型編程會(huì)是以后的主流,由于沒(méi)有哪個(gè)語(yǔ)言是完美的,包含被眾多“朝圣者”所推崇的Go,假設(shè)我們能依據(jù)自己的業(yè)務(wù)場(chǎng)景,選對(duì)合適的語(yǔ)言,那不敢說(shuō)事半功10倍,至少事半功倍應(yīng)該是有的,所以不要被主流語(yǔ)言(Java,C++)禁錮了我們的世界,局限了我們的創(chuàng)新,假設(shè)能做到輕松愉快的開(kāi)發(fā),那這個(gè)世界該多美好!!


總結(jié)

以上是生活随笔為你收集整理的为什么我要选择erlang+go进行server架构(2)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。