Go開(kāi)發(fā)關(guān)鍵技術(shù)指南:SRS & Others

Others

關(guān)于Go悲柱,還有哪些重要的技術(shù)值得了解的民晒,下面詳細(xì)分享芙贫。

GC

GC一般是C/C++程序員對(duì)于Go最常見(jiàn),也是最先想到的一個(gè)質(zhì)疑傍药,GC這玩意兒能行嗎磺平?我們以前C/C++程序都是自己實(shí)現(xiàn)內(nèi)存池的,我們內(nèi)存分配算法非常牛逼的拐辽。

Go的GC優(yōu)化之路拣挪,可以詳細(xì)讀Getting to Go: The Journey of Go's Garbage Collector

2014年Go1.4俱诸,GC還是很弱的菠劝,是決定Go生死的大短板。

image.png

上圖是Twitter的線(xiàn)上服務(wù)監(jiān)控睁搭。Go1.4的STW(Stop the World) Pause time是300毫秒赶诊,而Go1.5優(yōu)化到了30毫秒笼平。

而Go1.6的GC暫停時(shí)間降低到了3毫秒左右。

Go1.8則降低到了0.5毫秒左右舔痪,也就是500微秒寓调。從Go1.4到Go1.8,優(yōu)化了600倍性能锄码。

如何看GC的STW時(shí)間呢夺英?可以引入net/http/pprof這個(gè)庫(kù),然后通過(guò)curl來(lái)獲取數(shù)據(jù)滋捶,實(shí)例代碼如下:

package main

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    http.ListenAndServe("localhost:6060", nil)
}

啟動(dòng)程序后痛悯,執(zhí)行命令就可以拿到結(jié)果(由于上面的例子中沒(méi)有GC,下面的數(shù)據(jù)取的是另外程序的部分?jǐn)?shù)據(jù)):

$ curl 'http://localhost:6060/debug/pprof/allocs?debug=1' 2>/dev/null |grep PauseNs
# PauseNs = [205683 79032 202102 82216 104853 142320 90058 113638 152504
145965 72047 49690 158458 60499 99610 112754 122262 52252 49234 68420 159857
97940 226085 103644 135428 245291 141997 92470 79974 132817 74634 65653 73582
47399 51653 86107 48619 62583 68906 131868 111903 85482 44531 74585 50162
31445 107397 10903081771 92603 58585 96620 40416 29763 102248 32804 49394
83715 77099 108983 66133 47832 35379 143949 69235 27820 35677 99430 104303
132657 63542 39434 126418 63845 167969 116438 68904 77899 136506 119708 47501]

可以用python計(jì)算最大值是322微秒重窟,最小是26微秒载萌,平均值是81微秒。

Declaration Syntax

關(guān)于Go的聲明語(yǔ)法Go Declaration Syntax亲族,和C語(yǔ)言有對(duì)比炒考,在The "Clockwise/Spiral Rule"這個(gè)文章中也詳細(xì)描述了C的順時(shí)針語(yǔ)法規(guī)則。其中有個(gè)例子:

int (*signal(int, void (*fp)(int)))(int);

這個(gè)是個(gè)什么呢霎迫?翻譯成Go語(yǔ)言就能看得很清楚:

func signal(a int, b func(int)) func(int)int

signal是個(gè)函數(shù)斋枢,有兩個(gè)參數(shù),返回了一個(gè)函數(shù)指針知给。signal的第一個(gè)參數(shù)是int瓤帚,第二個(gè)參數(shù)是一個(gè)函數(shù)指針。

當(dāng)然實(shí)際上C語(yǔ)言如果借助typedef也是能獲得比較好的可讀性的:

typedef void (*PFP)(int);
typedef int (*PRET)(int);
PRET signal(int a, PFP b);

只是從語(yǔ)言的語(yǔ)法設(shè)計(jì)上來(lái)說(shuō)涩赢,還是Go的可讀性確實(shí)會(huì)好一些戈次。這些點(diǎn)點(diǎn)滴滴的小傲嬌,是否可以支撐我們夠浪程序員浪起來(lái)的資本呢筒扒?至少Rob Pike不是拍腦袋和大腿想出來(lái)的規(guī)則嘛怯邪,這種認(rèn)真和嚴(yán)謹(jǐn)是值得佩服和學(xué)習(xí)的。

Documents

新的語(yǔ)言文檔支持都很好花墩,不用買(mǎi)本書(shū)看悬秉,Go也是一樣,Go官網(wǎng)歷年比較重要的文章包括:

其中冰蘑,文章中有引用其他很好的文章和泌,我也列出來(lái)哈:

SRS

SRS是使用ST症革,單進(jìn)程單線(xiàn)程,性能是EDSM模型的nginx-rtmp的3到5倍噪矛,參考SRS: Performance,當(dāng)然不是ST本身性能是EDSM的三倍铺罢,而是說(shuō)ST并不會(huì)比EDSM性能低艇挨,主要還是要根據(jù)業(yè)務(wù)上的特征做優(yōu)化。

關(guān)于ST和EDSM韭赘,參考本文前面關(guān)于Concurrency對(duì)于協(xié)程的描述缩滨,ST它是C的一個(gè)協(xié)程庫(kù),EDSM是異步事件驅(qū)動(dòng)模型泉瞻。

SRS是單進(jìn)程單線(xiàn)程楷怒,可以擴(kuò)展為多進(jìn)程,可以在SRS中改代碼Fork子進(jìn)程瓦灶,或者使用一個(gè)TCP代理,比如TCP代理go-oryx: rtmplb抱完。

在2016年和2017年我用Go重寫(xiě)過(guò)SRS贼陶,驗(yàn)證過(guò)Go使用2CPU可以跑到C10K,參考go-oryxv0.1.13 Supports 10k(2CPUs) for RTMP players碉怔。由于僅僅是語(yǔ)言的差異而重寫(xiě)一個(gè)項(xiàng)目烘贴,沒(méi)有找到更好的方式或理由,覺(jué)得很不值得撮胧,所以還是放棄了Go語(yǔ)言版本桨踪,只維護(hù)C++版本的SRS。Go目前一般在API服務(wù)器用得比較多芹啥,能否在流媒體服務(wù)器中應(yīng)用锻离?答案是肯定的,我已經(jīng)實(shí)現(xiàn)過(guò)了墓怀。

后來(lái)在2017年汽纠,終于找到相對(duì)比較合理的方式來(lái)用Go寫(xiě)流媒體,就是只提供庫(kù)而不是二進(jìn)制的服務(wù)器傀履,參考go-oryx-lib虱朵。

目前Go可以作為SRS前面的代理,實(shí)現(xiàn)多核的優(yōu)勢(shì)钓账,參考go-oryx碴犬。

Links

由于簡(jiǎn)書(shū)限制了文章字?jǐn)?shù),只好分成不同章節(jié):

  • Overview 為何Go有時(shí)候也叫Golang?為何要選擇Go作為服務(wù)器開(kāi)發(fā)的語(yǔ)言梆暮?是沖動(dòng)服协?還是騷動(dòng)?Go的重要里程碑和事件惕蹄,當(dāng)年吹的那些牛逼蚯涮,都實(shí)現(xiàn)了哪些遭顶?
  • Could Not Recover 君可知棒旗,有什么panic是無(wú)法recover的?包括超過(guò)系統(tǒng)線(xiàn)程限制铣揉,以及map的競(jìng)爭(zhēng)寫(xiě)逛拱。當(dāng)然一般都能recover台猴,比如Slice越界、nil指針曹步、除零、寫(xiě)關(guān)閉的chan等尿孔。
  • Errors 為什么Go2的草稿3個(gè)有2個(gè)是關(guān)于錯(cuò)誤處理的活合?好的錯(cuò)誤處理應(yīng)該怎么做竹捉?錯(cuò)誤和異常機(jī)制的差別是什么块差?錯(cuò)誤處理和日志如何配合?
  • Logger 為什么標(biāo)準(zhǔn)庫(kù)的Logger是完全不夠用的状蜗?怎么做日志切割和輪轉(zhuǎn)鹉动?怎么在混成一坨的服務(wù)器日志中找到某個(gè)連接的日志泽示?甚至連接中的流的日志?怎么做到簡(jiǎn)潔又夠用捎泻?
  • Interfaces 什么是面向?qū)ο蟮腟OLID原則笆豁?為何Go更符合SOLID赤赊?為何接口組合比繼承多態(tài)更具有正交性抛计?Go類(lèi)型系統(tǒng)如何做到looser, organic, decoupled, independent, and therefore scalable?一般軟件中如果出現(xiàn)數(shù)學(xué)录豺,要么真的牛逼要么裝逼。正交性這個(gè)數(shù)學(xué)概念在Go中頻繁出現(xiàn),是神仙還是妖怪弟断?為何接口設(shè)計(jì)要考慮正交性阀趴?
  • Modules 如何避免依賴(lài)地獄(Dependency Hell)?小小的版本號(hào)為何會(huì)帶來(lái)大災(zāi)難棚菊?Go為什么推出了GOPATH叔汁、Vendor還要搞module和vgo据块?新建了16個(gè)倉(cāng)庫(kù)做測(cè)試,碰到了9個(gè)坑像屋,搞清楚了gopath和vendor如何遷移己莺,以及vgo with vendor如何使用(畢竟生產(chǎn)環(huán)境不能每次都去外網(wǎng)下載)戈轿。
  • Concurrency & Control 服務(wù)器中的并發(fā)處理難在哪里凶杖?為什么說(shuō)Go并發(fā)處理優(yōu)勢(shì)占領(lǐng)了云計(jì)算開(kāi)發(fā)語(yǔ)言市場(chǎng)?什么是C10K腾么、C10M問(wèn)題解虱?如何管理goroutine的取消漆撞、超時(shí)和關(guān)聯(lián)取消?為何Go1.7專(zhuān)門(mén)將context放到了標(biāo)準(zhǔn)庫(kù)悍汛?context如何使用离咐,以及問(wèn)題在哪里?
  • Engineering Go在工程化上的優(yōu)勢(shì)是什么昆著?為什么說(shuō)Go是一門(mén)面向工程的語(yǔ)言凑懂?覆蓋率要到多少比較合適梧宫?什么叫代碼可測(cè)性?為什么良好的庫(kù)必須先寫(xiě)Example疤坝?
  • Go2 Transition Go2會(huì)像Python3不兼容Python2那樣作嗎跑揉?C和C++的語(yǔ)言演進(jìn)可以有什么不同的收獲埠巨?Go2怎么思考語(yǔ)言升級(jí)的問(wèn)題辣垒?
  • SRS & Others Go在流媒體服務(wù)器中的使用。Go的GC靠譜嗎脱衙?Twitter說(shuō)相當(dāng)?shù)目孔V捐韩,有圖有真相鹃锈。為何Go的聲明語(yǔ)法是那樣屎债?C的又是怎樣垢油?是拍的大腿滩愁,還是拍的腦袋惊楼?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市璃诀,隨后出現(xiàn)的幾起案子蔑匣,更是在濱河造成了極大的恐慌裁良,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件牧抵,死亡現(xiàn)場(chǎng)離奇詭異犀变,居然都是意外死亡获枝,警方通過(guò)查閱死者的電腦和手機(jī)骇笔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)懦傍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谎脯,“玉大人持寄,你說(shuō)我怎么就攤上這事娱俺≤恚” “怎么了烛愧?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵慎冤,是天一觀(guān)的道長(zhǎng)沧卢。 經(jīng)常有香客問(wèn)我但狭,道長(zhǎng),這世上最難降的妖魔是什么呈队? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任宪摧,我火速辦了婚禮绍刮,結(jié)果婚禮上挨摸,老公的妹妹穿的比我還像新娘。我一直安慰自己膝蜈,他們只是感情好饱搏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布置逻。 她就那樣靜靜地躺著,像睡著了一般肺素。 火紅的嫁衣襯著肌膚如雪宇驾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,287評(píng)論 1 301
  • 那天塌西,我揣著相機(jī)與錄音捡需,去河邊找鬼筹淫。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的狸相。 我是一名探鬼主播脓鹃,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瘸右,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了苞俘?” 一聲冷哼從身側(cè)響起龄章,我...
    開(kāi)封第一講書(shū)人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤做裙,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仔戈,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體监徘,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耐量,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年廊蜒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片著榴。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脑又,死狀恐怖锐借,靈堂內(nèi)的尸體忽然破棺而出钞翔,到底是詐尸還是另有隱情,我是刑警寧澤哮笆,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布稠肘,位于F島的核電站萝毛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鲁冯。R本人自食惡果不足惜色查,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一跨扮、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衡创,春花似錦、人聲如沸哟玷。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抑月。三九已至谦絮,卻和暖如春洁仗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奶甘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留方淤,地道東北人蹄殃。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓讳苦,卻偏偏與公主長(zhǎng)得像吩谦,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咐扭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容