一次超時(shí)事件的排查

背景

生產(chǎn)環(huán)境中,調(diào)用公司封裝的kms服務(wù)進(jìn)行解密,偶報(bào)超時(shí)錯(cuò)誤熏迹。但是看接口實(shí)際耗時(shí)只有100多ms。

一開(kāi)始懷疑是errgroup中的ctx用錯(cuò)了凝赛,導(dǎo)致cancel掉了請(qǐng)求注暗。后面確認(rèn)以后發(fā)現(xiàn)不是。

最后查看基礎(chǔ)框架封裝的源碼墓猎,默認(rèn)的請(qǐng)求超時(shí)時(shí)間被設(shè)置成了30ms捆昏,真是氣死。

當(dāng)時(shí)有兩個(gè)模塊毙沾,一個(gè)是模塊是對(duì)端接口玩般,gateway會(huì)在ctx里面設(shè)置deadline谷徙,然后向下傳遞趁啸,這個(gè)模塊沒(méi)報(bào)錯(cuò)油讯,因?yàn)閏tx里面有deadline了,就沒(méi)有用client設(shè)置的timeout
    if _, ok := ctx.Deadline(); ok {
        return next
    }

另一個(gè)模塊是消費(fèi)kafka回調(diào)函數(shù)里面的ctx,這個(gè)ctx里面沒(méi)有設(shè)置deadline,所以會(huì)用client的timeout

grpc-go如何實(shí)現(xiàn)超時(shí)

通過(guò)下面的代碼,可以看到grpc-go是通過(guò)context實(shí)現(xiàn)超時(shí)控制的敛摘。

import (
    "context"
    "time"

    pb "example.com/example.protobuf"
    "google.golang.org/grpc"
)

func main() {
    // 假設(shè)已經(jīng)設(shè)置了連接和客戶端
    conn, _ := grpc.Dial("your_grpc_server_address", grpc.WithInsecure()) // 使用實(shí)際的連接參數(shù)替換
    client := pb.NewYourServiceClient(conn)

    // 設(shè)置超時(shí)
    timeout := 3 * time.Second
    ctx, cancel := context.WithTimeout(context.Background(), timeout)
    defer cancel()

    // 使用帶超時(shí)的 context 進(jìn)行 gRPC 調(diào)用
    req := &pb.YourRequest{} // 使用實(shí)際的請(qǐng)求結(jié)構(gòu)體替換
    resp, err := client.YourMethod(ctx, req)
    if err != nil {
        // 處理錯(cuò)誤,可能是超時(shí)導(dǎo)致的
    }
    // 如果調(diào)用成功乳愉,處理響應(yīng)
}

基礎(chǔ)框架如何把timeout參數(shù)和grpc-go的超時(shí)機(jī)制整合

通過(guò)grpc的攔截器【只需要幾個(gè)攔截器兄淫,把攔截器做成自定義hook的形式,方便添加更多的業(yè)務(wù)邏輯】蔓姚,在發(fā)送請(qǐng)求前捕虽,讀取請(qǐng)求里面的timeout參數(shù),通過(guò)context.WithTimeout注進(jìn)context來(lái)實(shí)現(xiàn)超時(shí)控制坡脐。

通過(guò)ctx注進(jìn)去泄私,然后請(qǐng)求前拿出來(lái)設(shè)置上去

func WithClientConfig(ctx context.Context, conf settings.ClientConfig) context.Context {
    return context.WithValue(ctx, clientConfigKey{}, conf)
}

設(shè)置timeout

func withTimeout(ctx context.Context, next func(context.Context) error) func(context.Context) error {
        //如果是stream類的rpc,則不許呀設(shè)置超時(shí)
    if rpc.IsStream(ctx) {
        return next
    }

        //如果context自己設(shè)置了超時(shí)备闲,就不讀配置里面的timeout參數(shù)去設(shè)置context了
    if _, ok := ctx.Deadline(); ok {
        return next
    }

    var timeout int64

    conf := grpcclient.GetClientConfig(ctx)

    timeout = conf.Timeout
    if timeout <= 0 {
        timeout = defaultTimeout
    }

    return func(ctx context.Context) error {
        ctx, cancel := context.WithTimeout(ctx, time.Duration(timeout)*time.Millisecond)
        defer cancel()
        return next(ctx)
    }
}

kms客戶端緩存優(yōu)化

kms客戶端可以設(shè)置兩個(gè)緩存晌端,一個(gè)是加密的緩存,一個(gè)是解密的緩存恬砂。

根據(jù)uid后2位取模咧纠,設(shè)置加密的緩存,緩存過(guò)期時(shí)間為1小時(shí)泻骤。相同uid后綴的消息漆羔,在1小時(shí)以內(nèi)都用相同的密鑰加密。過(guò)期以后狱掂,重新去獲取密鑰演痒,后面1小時(shí)的,又用另外一個(gè)密鑰加密趋惨。

加密獲取密鑰對(duì)以后鸟顺,把解密的密鑰緩存下來(lái),過(guò)期時(shí)間設(shè)置為24小時(shí)希柿。這樣诊沪,新發(fā)的消息养筒,在24小時(shí)內(nèi)被拉取曾撤,都不需要請(qǐng)求kms去解密,走緩存即可晕粪。

效果:加密密鑰小時(shí)級(jí)別變化挤悉,解密大概率走緩存,性能好。即保證了安全性装悲,又保證了性能昏鹃。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市诀诊,隨后出現(xiàn)的幾起案子洞渤,更是在濱河造成了極大的恐慌,老刑警劉巖属瓣,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件载迄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抡蛙,警方通過(guò)查閱死者的電腦和手機(jī)护昧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粗截,“玉大人惋耙,你說(shuō)我怎么就攤上這事⌒懿” “怎么了绽榛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)婿屹。 經(jīng)常有香客問(wèn)我蒜田,道長(zhǎng),這世上最難降的妖魔是什么选泻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任冲粤,我火速辦了婚禮,結(jié)果婚禮上页眯,老公的妹妹穿的比我還像新娘梯捕。我一直安慰自己,他們只是感情好窝撵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布傀顾。 她就那樣靜靜地躺著,像睡著了一般碌奉。 火紅的嫁衣襯著肌膚如雪短曾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天赐劣,我揣著相機(jī)與錄音嫉拐,去河邊找鬼。 笑死魁兼,一個(gè)胖子當(dāng)著我的面吹牛婉徘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼盖呼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼儒鹿!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起几晤,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤约炎,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蟹瘾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體章钾,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年热芹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贱傀。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伊脓,死狀恐怖府寒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情报腔,我是刑警寧澤株搔,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站纯蛾,受9級(jí)特大地震影響纤房,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜翻诉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一炮姨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧碰煌,春花似錦舒岸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至个少,卻和暖如春洪乍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夜焦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工壳澳, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糊探。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓钾埂,卻偏偏與公主長(zhǎng)得像河闰,于是被迫代替她去往敵國(guó)和親科平。 傳聞我的和親對(duì)象是個(gè)殘疾皇子褥紫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 為什么需要超時(shí)控制髓考? 很多連鎖故障的場(chǎng)景下的一個(gè)常見(jiàn)問(wèn)題是服務(wù)器正在消耗大量資源處理那些早已經(jīng)超過(guò)客戶端截止時(shí)間的...
    kevwan閱讀 637評(píng)論 0 5
  • 1、事件還原 昨天下午弃酌,收到一個(gè)504的告警氨菇,顯然這是一個(gè)超時(shí)告警。當(dāng)時(shí)由于手頭有其他事情妓湘,沒(méi)在意查蓉,就只是瞄了一眼...
    Jackie_Zheng閱讀 957評(píng)論 0 3
  • 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必將下面這段話置于文章開(kāi)頭處(保留超鏈接)榜贴。本文轉(zhuǎn)發(fā)自[董澤潤(rùn) blog]豌研,不允許修改題目及內(nèi)容...
    董澤潤(rùn)閱讀 4,663評(píng)論 1 7
  • 在工程化的Go語(yǔ)言開(kāi)發(fā)項(xiàng)目中,Go語(yǔ)言的源碼復(fù)用是建立在包(package)基礎(chǔ)之上的唬党。本文介紹了Go語(yǔ)言中如何定...
    雪上霜閱讀 241評(píng)論 0 0
  • 大家好鹃共,我是杜歡,很榮幸能代表滴滴來(lái)做分享驶拱。我來(lái)滴滴的第一件事情就是幫助公司統(tǒng)一技術(shù)棧霜浴,在服務(wù)端我們要把以前拿 P...
    中v中閱讀 1,752評(píng)論 0 25