GO語(yǔ)言是非常適合高并發(fā)場(chǎng)景的乌妒,那么,業(yè)務(wù)系統(tǒng)具體會(huì)遇到哪些高并發(fā)的場(chǎng)景呢涌庭?該如何考慮性能開銷呢芥被?那么本文就筆者在業(yè)務(wù)系統(tǒng)常常遇到的問(wèn)題來(lái)拋磚引玉~
請(qǐng)求合并
這是什么場(chǎng)景呢欧宜?回源坐榆!回源DB,二進(jìn)制流回源源站等等~高并發(fā)的場(chǎng)景下冗茸,大量用戶訪問(wèn)同一個(gè)對(duì)象席镀,那么做請(qǐng)求合并可以節(jié)省非称ブ校可觀的資源,singleflight~當(dāng)然這是進(jìn)程內(nèi)的用法豪诲。
批量協(xié)議
好像和請(qǐng)求合并有點(diǎn)像顶捷?不太一樣。比較經(jīng)典的case就是redis的pipeline屎篱,業(yè)務(wù)接口更是如此服赎。能批量就批量,減少請(qǐng)求放大交播,減少太多的封包解包重虑,減少cpu和帶寬~
merge請(qǐng)求
額~~merge什么?比如一個(gè)視頻id更新計(jì)數(shù)秦士,那么9->18->25......對(duì)了缺厉,計(jì)數(shù)從1漲到100,難道我要寫100次db嗎隧土?很明顯提针,可以內(nèi)存里merge~~
并行請(qǐng)求
這個(gè)用法在網(wǎng)關(guān)服務(wù)就非常常見啦~當(dāng)你的服務(wù)需要聚合A、B曹傀、C這3個(gè)系統(tǒng)的數(shù)據(jù)辐脖,而A、B和C之間沒(méi)有依賴皆愉,那么完全可以并行請(qǐng)求揖曾。golang里常用errgroup去實(shí)現(xiàn)。
減少鎖以及系統(tǒng)調(diào)用
? ? ? ? 有些情況鎖是很難避免的亥啦,但是可以通過(guò)一些鎖粒度拆分優(yōu)化去減少鎖的開銷炭剪。系統(tǒng)調(diào)用對(duì)cpu的開銷都是挺明顯的,具體可以壓測(cè)看profile翔脱,也可以查看top奴拦,us%的開銷在90%以上,說(shuō)明性能優(yōu)化還是可以的届吁。
序列化協(xié)議错妖,json和pb
? ??????這里既包括API的協(xié)議,也同時(shí)包括緩存對(duì)象的序列化協(xié)議疚沐。緩存的訪問(wèn)常常會(huì)幾倍于api請(qǐng)求暂氯,經(jīng)常有放大,所以更要重視亮蛔。
異步處理痴施,使用channel,而不是無(wú)限制go func()
????????比如更新緩存的場(chǎng)景。這點(diǎn)挺容易理解辣吃,無(wú)限制的goroutine會(huì)帶來(lái)大量的context切換动遭,浪費(fèi)cpu。當(dāng)然channel的長(zhǎng)度要做限制和監(jiān)控神得。消費(fèi)者goroutine數(shù)可以適當(dāng)配置厘惦。