Java:golang兄,聽說你天生高併發?

雖然是這樣的標題沒錯,但是絕非語言大戰,筆者本身是一個Java開發者,但說到底就是編程開發人員無疑,因此這並不阻礙我們去了解其它的語言,這就像有的人主食吃麪,有的主食吃米,但是他們可以偶爾換個口味嘛(關於素食主義,emming,這不在筆者研究範圍……)。

隨着5G時代的逐漸到來,互聯網公司勢必迎來新一輪不小的升級,服務雲化必定是大趨勢,爲了跟上時代步伐,在面試準備之餘對雲開發相關做了一些瞭解。在這一過程中,無意接觸到了golang。

其實go語言在挺早前就聽說過,坊間傳說它“天生支持高併發,執行速度接近C,網絡服務接近Nginx……”,儘管如此,進一步瞭解它依然拖沓到現在。

其它還好,當時唯一不理解的是“天生支持高併發”,尤其是“天生”二字,着實讓人感到滿滿的高端和神祕。下面基於筆者初步的瞭解來解釋一下這個疑問(說明可能不是很專業,讀者將就吧,如果有更大的興趣可以自行學習哈):

一句話總結:go語言在設計的時候從關鍵字層面實現了多協程開發,好像語言本身支持高併發一樣。

(協程可以看做是輕量級的線程,即用戶級別的線程,系統線程(比如Java中的thread)屬於重量級的線程,協程依賴於線程。Java目前爲止並沒有支持協程)

在go中實現併發操作到底有多簡單(你可以回想一下c語言實現協程),來看代碼:

func main()  {
   go add(3,6)  
   go add(1,6)  
   time.Sleep(time.Second)
}
func add(a int,b int)  {
   result := a+b
   fmt.Println(result)
}

go關鍵字實現了協程開闢調用,如果不進行等待,主線程結束,協程就會馬上結束。

不知道看到這裏大家有沒有理解go在高併發開發中的優勢,goroute和channel的模式實現了類似Unix的epoll模型,因此對於一些耗時任務執行是非常有優勢的。

那在接口服務方面,go和Java到底是誰更快呢?

爲此筆者進行了相關測試,環境如下:

Go :SDK1.8 ;框架:beego ,sqlx1.4

Java:JDK1.8 ;框架:springboot2.0,springMVC,jdbctemplate(沒有使用重量級的ROM框架)

測試工具:ApacheJMeter 


均爲請求返回json數據  http://127.0.0.1:8080/user

我們個測試十次,然後取平均值

上方的表格就是總體的參數了,ApacheJMeter 配置:線程數1000 setup:1 循環次數:2,二者的error都爲0.00%。

可以看出,go的吞吐比Java多出17%左右。

那到這裏,很多Java開發者就有點傷心了,這這這……

其實,還是那句老話:“語言之間沒有優劣,重要的是用途。”Java的強項在於構建大型項目的整體,更容易實現分佈式。在我看來,go在整個體統的某一塊會有更好的性能,比如雲文件存儲、中間件開發,需要處理的邏輯密集度越高,go的優勢會越明顯,對於系統整體可用性來說,常規的數據訪問使用Java可能是更好的選擇。

另外關係型數據庫是go的主要瓶頸,因爲從理論上來說它可以接近nginx的http服務速度,因此,在一些極高併發系統設計,可以考慮使用go結合redis進行重構,比如電商中的秒殺系統。

END

【推薦閱讀

絕了!Dataway讓SpringBoot不在需要Controller、Service了

不要網上亂拷貝代碼了!一段網上找的代碼突然炸了!

如何搭建一款自己的私有百度網盤?

我把SpringBoot項目從18.18M瘦身到0.18M,部署起來真省事!

項目實踐:三招組合拳,手把手教你打出優雅的後端接口

我把SpringBoot的banner換成了美女,老闆說工作不飽和,建議安排加班

SpringBoot + Redis + 註解 + 攔截器 實現接口冪等性校驗

推薦三個 Vue 後臺管理模版,配合 Spring Boot 使用真香!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章