Golang Concurrency Pattern - iT 邦幫忙
文章推薦指數: 80 %
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
延伸文章資訊
- 1Design Patterns in Go - Refactoring.Guru
The Catalog of Go Examples · Creational Patterns · Abstract Factory · Builder · Factory Method · ...
- 2Golang Concurrency Pattern - iT 邦幫忙
Go劍復國-30天導入Golang 系列第26 篇 ... 所謂的CPU & MEM 上限,所以也就意味著goroutine 不能無窮無境的開,那今天就來討論Concurrency Patter...
- 3一起幫忙解決難題,拯救IT 人的一天
Go Design Patterns. Hey! Go Design Patterns 系列第1 篇. 髒桶子York Lin. 3 個月前‧ 190 瀏覽. 2. 大家好,本系列文章探討經典D...
- 4Common anti-patterns in Go - DeepSource
A list of anti-patterns you should avoid while writing code in Golang. Insights Go. Header image....
- 5senghoo/golang-design-pattern: 设计模式Golang实现 - GitHub
... 实现-《研磨设计模式》读书笔记. Contribute to senghoo/golang-design-pattern development by creating an accou...