這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前兩天去上海參加 Gopher China 2015 大會,見到很多久聞大名的大神和朋友,感覺很好。而且看到許多的企業,尤其是大企業都已經開始成規模的使用 golang,說明 golang 本身的設計和效能,已經受到了大家的認可。當然其實有很多的話題,不局限在 golang 了。
Go 語言核心
最重量級的話題,就是 雨痕 的 《Go 1.4 Runtime》。主要說了 Go 的記憶體 Clerk、記憶體回收行程和goroutine調度器三塊內容。我之前閱讀過他的 《Go 語言筆記》 ,非常不錯。很詳細的闡述了 Go 語言本身的實現設計,同時為更合理的利用 golang 提供一些參考。 再加上他本人也很低調,真的是 隱士高人 的感覺。這次的他的演講也相當不錯。流暢的思路和平和的語言,而且不時的有詼諧幽默,讓人聽起來很有意思。唯一的遺憾是,他準備的ppt其實可以講到3個小時,可惜會程只有45min,儘管大家還是爭取多聽了一些,但還是意猶未盡。
另一個超級話題,是 Robert Griesemer 的演講。他是 Go 的三位作者之一,也是 Google V8 和 Java Hotspot VM 開發人員之一,相當巨大的光環!他的演講是關於 gofmt 的。 Go語言本身有很多的外圍工具,比如 gofmt, godoc。其中格式化工具 gofmt 協助大家簡單直接的就統一了代碼風格。Go 本身就帶有 parser 包,就能夠很好的去解析go源碼到文法樹。 唯一要吐槽的是 Q&A 環節,提問的童鞋用誰都聽不懂的“英語”去問,哈哈哈!
Go 和 高速並發
很多人看上 Go 語言,主要是因為簡化的並行存取模型:很簡單地建立輕量級的使用者協程goroutine,使用channel進行goroutine之間的通訊,runtime本身的調度足夠快。當然在演講的題目裡不會少,比如 達達 聊了在遊戲中的實踐,goroutine(codis的作者) 和 周洋 在分布式系統中的實現,QLeeLuLu(fawave的作者)在廣告競價系統中的應用,以及 月牙寂 的在P2P緩衝網路的應用。
總結起來,高速並發時需要考慮的細節:
達達的遊戲項目為了保證很高的速度,很多的資料都直接是記憶體資料。記憶體中的大資料會明顯的影響GC的效率。因而要做的, 減少記憶體中的資料對象數量。然後記憶體資料肯定是要寫入實體儲存體的。達達在記憶體做了一層資料到mysql的直接映射關係,被稱為 記憶體資料庫,而且支援交易處理。我的理解,記憶體資料庫中的實際操作,不是直接對mysql的操作copy過來。它本身的模型並不複雜,所以很多的操作都是單一對象操作的,或者是對象的某些欄位的操作。達達也提起記憶體資料庫的調度代碼其實是用代碼產生的。換句話說就是簡單的邏輯描述就可以表示的資料操作。那麼事務顯然在業務中是必要的,同時操作不同對象,相當於操作多個資料表。
另外這個記憶體資料庫使用了類似傳統資料庫的日誌機制。記憶體的修改是可以即時完成的,然後同步到mysql用的是自訂的一種交易記錄描述。mysql其實也是把當前執行的操作寫在binlog中,後續才會真正執行到儲存的資料中。
集中的反義,就是分散。分散的理解,其實有很多可能。比如反覆的io操作,rpc操作等。從go本身的角度,分散的造成的麻煩是 goroutine泄漏 。如果把各種邏輯都放到獨立的goroutine中,當邏輯阻塞,goroutine就不停建立且無法結束。這給調度器帶來很大的壓力,以至於別的邏輯建立的goroutine很久無法被執行,拖慢整個業務的速度。簡單的處理方式就是通過channel,將需要處理的邏輯傳遞給某些goroutine執行。換句話說,建立一些goroutine專門處理某種邏輯,通過channel傳遞邏輯參數,就可以。
剩下的問題就是對外部資源調度的分散。redis使用時最常見的集中的方法就是用pipeline。rpc也可以使用長連結雙工模式的調用。簡單地說就是讓各種命令一起執行,而不是分別執行。
鎖在很多排他性的操作的時候是必須的,沒有任何辦法規避。但是 鎖的粒度,是需要控制的關鍵。如果鎖的粒度很大,鎖住的資料或者邏輯很多,那別的操作就只能等待。比如說,一個10k對象的全域map修改,需要加鎖防止並發衝突。但是只要鎖住1W的對象就全部無法操作。因此最簡單把這個10k個對象的map拆分成10個1K的map。這樣每個小map即使鎖住,也只會影響1k資料,而不是原來的10k。但實際中鎖的粒度,需要根據業務判斷,但是減小粒度是統一的追求。
timer這東西其實就是一個計時的goroutine和到期訊號的channel的組合。timer越多顯然就是goroutine越多。調度器的消耗明顯增長。如果還是需要計時邏輯的操作,可以去看看時間輪演算法,減少建立timer。另外就乾脆不要用,在自己的邏輯中判斷時間是否超出限制的問題。
高並發的服務,Go 本身的一些細節,是有助於提升效率的,但是不是靠 Go 語言本身就足夠,還需要和各種手段配合,才能真正滿足實際的業務要求。
Go 和 虛擬化
Go 語言最明星的項目是 docker。很多大神在研究和使用docker。作為一種輕量級的虛擬化技術,相比xen有很多優點,受到大家的青睞。我並不熟悉docker的應用,沒有在虛擬化上有多少實際經驗,所以聽聽大神們的說法,增長知識。
馬全一 是docker社區很有名的朋友。他演講主要再說DevOps,就是從開發、測試到部署、營運的全程解決方案。為了在開發、測試和部署層面的統一,系統內容需要很好的統一性。直接方法就是虛擬化,如完全類似的虛擬鏡像。docker的出現,讓虛擬化的成本大大的降低。而且docker鏡像的管理非常像git樣版本管理的模式,對開發人員非常友善。另外,docker鏡像對系統資源的使用很有效率,也可以作為生產部署方式。因而,以後的DevOps的趨勢很可能就是ContainerOps。
我不太懂docker,聽了很多未來的趨勢,以及docker和rocket之間的江湖恩怨。目前較好的使用方式就是用docker虛擬化application,不要虛擬資料存放區。就很像nginx代理n個執行個體,這些執行個體操作統一資料的感覺。另外,演講也提到微軟Windows對docker的支援。十幾天前docker也發布的windows用戶端的preview。看來docker在全平台的虛擬化很有希望了。
Go 與各種領域
Go 語言的定位是系統級語言,很多方面都會有深入的應用。
一個演講是有關在電信領域,網路功能虛擬化(NFV, network functions virtualization)。電信網路裝置之間的串連,是網路單元之間的串連,如基站-節點裝置-網關裝置,各種物理裝置群組成的網路。物理裝置之間的溝通,就需要靠硬體協議互動。網間裝置種類越多,互動協議就越多越複雜。Go的使用,就是在普通伺服器裝置上,實現網路單元的功能,即軟體類比硬體。同時,虛擬後的軟體相比硬體裝置,可以更快平衡網路的突然變化。不過,電信網路對聯通率,聯通品質有很嚴格的要求,目前這個方案還是測試階段,不知道成功與否。
另外有個金融領域的演講,補充了很多知識。以前我也以為金融系統,尤其是銀行系統是很古老的系統。但是其實他們也在隨著新的技術演化。因為金融領域的特殊性,對資料的安全和監管要求很高。而且金融業務的複雜度遠超過一般商業業務。金融IT系統本身是完全耦合的,而且架構非常穩定。當然,他們也在嘗試使用虛擬化技術,來做架構內部的調整。雖然整體結構是不太可能改變的,但是各種新興業務也在使用新的技術。
還有一個很有啟發的演講,用 Go 語言寫的網路作業系統,類似於 Chrome OS。我們為何要考慮高並發的問題,因為服務和運算都是集中的,比如微博的資料處理就是新浪機房在做。那如果去掉中心,那運算的複雜度顯然會降低很多。同時,資料也會分散,分布在各個用戶端節點中。這其實很像比特幣,沒有中心,資料都存在使用者的用戶端。資料的更新通過用戶端的P2P傳播。類比的說,新浪的資料其實分布在各個微博使用者的電腦上。當你使用微博,就其實連入了微博網路,可以P2P的從別的用戶端同步你需要的資料(一般只需要自己時間軸的資料)。這是我的理解,不知道是不是大神真正的意思。目前來思考,其實還有很多問題,比如資料的分散和同步,網路節點同步等等問題。不過這樣的一種模式,確實很有開創性。
一個小失望
七牛是 Go 語言在中國商用的先驅。許式偉也是 Go 語言最早的使用者和佈道者之一。只是這次就聊個 HTTP 測試載入器,實在是讓人失望。亮點也就只有發明一種 DSL 來簡化HTTP測試的描述。七牛本來也有很多可以聊的,比如雲端儲存的冗餘機制,多媒體檔案的處理。所以,他來說這樣的題目,實在是失望。
許多朋友
在 Go 語言圈裡混了很久,也算有很多熟人。以前都是網路聊天討論,這次可以見到本人,非常高興。達達和月牙寂是廈門本地的朋友,偶爾也見面聊天,還是很熟悉的。不過兩個人線上下的感覺和上台演講不同,達達還是太羞澀啦。
lunny是xorm的作者,看起來是個很溫存的大叔。BetaGo好高啊,很認真的樣子。毛劍也有點軟軟的感覺。當然asta謝的觀感和照片裡差不多,很熱情很熱心,還辛苦的為提問的童鞋遞話筒。大會也一直是他辛辛苦苦,忙前忙後。是個很不錯的人。
我只是個普通的程式員,沒什麼高大上的作品或者名號,也不求成為大家眼中的大神。瞭解和學習我想要的,做好自己的工作,過好樸素的生活,我就滿足了。
Go 語言在中國非常火熱。國內大量的 Go 語言開發人員在這次 gopher china上聚會,交流技術,結交朋友。我也看到其實還有很多的大神在深入研究 Go 語言的使用。我還只是一個才入門的孩子,需要很多鍛煉。希望自己再接再厲,好好學習,天天向上!!!