Golang Concurrency Pattern - iT 邦幫忙

文章推薦指數: 80 %
投票人數:10人

Go劍復國-30天導入Golang 系列第26 篇 ... 所謂的CPU & MEM 上限,所以也就意味著goroutine 不能無窮無境的開,那今天就來討論Concurrency Pattern,到底該如何設計。

2019iT邦幫忙鐵人賽 DAY 26 1 自我挑戰組 Go劍復國-30天導入Golang系列第 26篇 GolangConcurrencyPattern 2019鐵人賽 golang syhlion 2018-11-0910:07:105380瀏覽 在前面有介紹過了golang的重點之一goroutine,golang的設計讓concurrency非常容易,但是大家有沒有想過,goroutine也不是什麼黑科技,最終電腦還是有所謂的CPU&MEM上限,所以也就意味著goroutine不能無窮無境的開,那今天就來討論ConcurrencyPattern,到底該如何設計。

接下來,我們假設一個情境,我們需要在某個httphandler,加入統計request相關的方法,但是又不希望它影響這個apiresponse的速度,所以我們一定是要用goroutine把統計的相關func,丟到背景平行處理。

就像下面一樣 //模擬需要統計reqesut相關數據的 funcStatistic(r*http.Request){ } funcmain(){ http.HandleFunc("/api/query",func(whttp.ResponseWriter,r*http.Request){ //假設需要統計request相關數據,所以丟背景 goStatistic(r) u:=&UserInfo{ Name:"syhlion", Age:18, } b,err:=json.Marshal(u) iferr!=nil{ log.Println(err) return } w.Header().Set("Content-Type","application/json;charset=UTF-8") w.WriteHeader(http.StatusOK) w.Write(b) }) log.Fatal(http.ListenAndServe(":8080",nil)) } 但是如果照上面所寫的,如果httprequest一多,是不是goroutine就無窮無境的開下去了....,那這樣就在比到底是先碰上port不夠的問題,還是CPU&MEM先被耗盡。

最終就是被OS層強制關閉application。

在這方面上的設計,我個人是有一個原則,『當存取的人數多時,服務可以慢,但不能死』,所以當我們存取人數多時,寧可少收幾個客戶,也不能硬要多收幾個客戶,讓整個系統崩潰。

接下來我們來構思一下改良策略,首先我們需要一個worker派發中心。

這時侯就能善用golang的特性channel,運用channel當作quene,在當配gorotuine,就能做出一個派工的模型。

依據上圖,我們的實作方式如下 typeStatisticWorkerstruct{ quenechan*http.Request numint } //統一由這邊做requset加入的動作 func(s*StatisticWorker)AddRequest(r*http.Request)(errerror){ select{ cases.quene



請為這篇文章評分?