Context

context 標(biāo)準(zhǔn)庫(kù)的解決思路是:在整個(gè)樹(shù)形邏輯鏈條中锭碳,用上下文控制器 Context幽七,實(shí)現(xiàn)每個(gè)節(jié)點(diǎn)的信息傳遞和共享壹堰。



在 context 庫(kù)的官方文檔中有這么一句話:Do not store Contexts inside a struct type;instead, pass a Context explicitly to each function that needs it.The Context should be the first parameter.大意是說(shuō)建議我們?cè)O(shè)計(jì)函數(shù)的時(shí)候乙各,將 Context 作為函數(shù)的第一個(gè)參數(shù)谐岁。你能理解官方為什么如此建議醋奠,有哪些好處?可以結(jié)合你的工作經(jīng)驗(yàn)伊佃,說(shuō)說(shuō)自己的看法窜司。


context作為第一個(gè)參數(shù)在實(shí)際工作中是非常有用的一個(gè)實(shí)踐。不管我們是設(shè)計(jì)一個(gè)函數(shù)航揉,或者設(shè)計(jì)一個(gè)結(jié)構(gòu)體的方法塞祈,或者服務(wù)的時(shí)候,我們一旦養(yǎng)成了將第一個(gè)參數(shù)作為context的習(xí)慣帅涂,那么這個(gè)context在相互調(diào)用的時(shí)候议薪,就會(huì)傳遞下去尤蛮。這里會(huì)帶來(lái)幾個(gè)好處:

1 鏈路通用內(nèi)容傳遞。context中是可以通過(guò)WithValue方法將某些字段封裝在context里面斯议,并且傳遞的产捞。最常見(jiàn)的字段是traceId, spanId。而在日志中帶上這些ID哼御,再將日志收集起來(lái)坯临,我們就能進(jìn)行分析了。這也是我們現(xiàn)在比較流行的全鏈路分析的原理恋昼。

2 鏈路統(tǒng)一設(shè)置超時(shí)看靠。我們?cè)诙x一個(gè)服務(wù)的時(shí)候,將第一個(gè)參數(shù)固定設(shè)置為context焰雕,則可以通過(guò)這個(gè)context進(jìn)行超時(shí)設(shè)置衷笋,而這個(gè)超時(shí)設(shè)置,是由上游調(diào)用方進(jìn)行設(shè)置矩屁,這樣就形成了一個(gè)統(tǒng)一的超時(shí)設(shè)置機(jī)制辟宗。比如A設(shè)置了5s超時(shí),自己使用了1s吝秕,傳遞到下游B服務(wù)的時(shí)候泊脐,設(shè)置B的context超時(shí)時(shí)長(zhǎng)為4s。這樣全鏈路超時(shí)傳遞下去烁峭,就能保持統(tǒng)一設(shè)置了容客。

是的,請(qǐng)求控制和請(qǐng)求實(shí)現(xiàn)混在一起的情況约郁,后面引入middleware會(huì)改掉的缩挑。


PS:其實(shí)在 Golang 的設(shè)計(jì)中,每個(gè) Goroutine 都是獨(dú)立存在的鬓梅,父 Goroutine 一旦使用 Go 關(guān)鍵字開(kāi)啟了一個(gè)子 Goroutine供置,父子 Goroutine 就是平等存在的,他們互相不能干擾绽快。而在異常面前芥丧,所有 Goroutine 的異常都需要自己管理,不會(huì)存在父 Goroutine 捕獲子 Goroutine 異常的操作坊罢。所以切記:在 Golang 中续担,每個(gè) Goroutine 創(chuàng)建的時(shí)候,我們要使用 defer 和 recover 關(guān)鍵字為當(dāng)前 Goroutine 捕獲 panic 異常活孩,并進(jìn)行處理物遇,否則,任意一處 panic 就會(huì)導(dǎo)致整個(gè)進(jìn)程崩潰!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末挎挖,一起剝皮案震驚了整個(gè)濱河市这敬,隨后出現(xiàn)的幾起案子航夺,更是在濱河造成了極大的恐慌蕉朵,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阳掐,死亡現(xiàn)場(chǎng)離奇詭異始衅,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)缭保,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門汛闸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人艺骂,你說(shuō)我怎么就攤上這事诸老。” “怎么了钳恕?”我有些...
    開(kāi)封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵别伏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我忧额,道長(zhǎng)厘肮,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任睦番,我火速辦了婚禮类茂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘托嚣。我一直安慰自己巩检,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布示启。 她就那樣靜靜地躺著兢哭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪丑搔。 梳的紋絲不亂的頭發(fā)上厦瓢,一...
    開(kāi)封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音啤月,去河邊找鬼煮仇。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谎仲,可吹牛的內(nèi)容都是我干的浙垫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夹姥!你這毒婦竟也來(lái)了杉武?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤辙售,失蹤者是張志新(化名)和其女友劉穎轻抱,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體旦部,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡祈搜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了士八。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片容燕。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖婚度,靈堂內(nèi)的尸體忽然破棺而出蘸秘,到底是詐尸還是另有隱情,我是刑警寧澤蝗茁,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布醋虏,位于F島的核電站,受9級(jí)特大地震影響评甜,放射性物質(zhì)發(fā)生泄漏灰粮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一忍坷、第九天 我趴在偏房一處隱蔽的房頂上張望粘舟。 院中可真熱鬧,春花似錦佩研、人聲如沸柑肴。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晰骑。三九已至,卻和暖如春绊序,著一層夾襖步出監(jiān)牢的瞬間硕舆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工骤公, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抚官,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓阶捆,卻偏偏與公主長(zhǎng)得像凌节,于是被迫代替她去往敵國(guó)和親钦听。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • [TOC] Golang Context分析 Context背景 和 適用場(chǎng)景 golang在1.6.2的時(shí)候還沒(méi)...
    AllenWu閱讀 11,535評(píng)論 0 30
  • context包專門用來(lái)簡(jiǎn)化處理單個(gè)請(qǐng)求的多個(gè)goroutine之間與請(qǐng)求域的數(shù)據(jù)倍奢、取消信號(hào)朴上、截止時(shí)間等相關(guān)操作。...
    wz998閱讀 3,761評(píng)論 0 3
  • 為什么需要context 在并發(fā)程序中卒煞,由于超時(shí)痪宰、取消操作或者一些異常情況,往往需要進(jìn)行搶占操作或者中斷后續(xù)操作跷坝。...
    陳二狗想吃肉閱讀 547評(píng)論 0 2
  • 原文:Context Package Semantics In Go 介紹 Golang 可以使用關(guān)鍵詞 "go"...
    豆腐匠閱讀 524評(píng)論 0 0
  • 控制并發(fā)有兩種經(jīng)典的方式:WaitGroup和Context WaitGroup:控制多個(gè)Goroutine同時(shí)完...
    JunChow520閱讀 672評(píng)論 0 2