国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁(yè) > 網(wǎng)易號(hào) > 正文 申請(qǐng)入駐

Discord 工程團(tuán)隊(duì)如何在 Elixir Actor 模型中實(shí)現(xiàn)分布式追蹤而不犧牲性能

0
分享至


作者 | Steef-Jan Wiggers

譯者 | 馬可薇

Discord 工程團(tuán)隊(duì)分享了他們是如何在支撐數(shù)百萬(wàn)并發(fā)用戶的情況下,為自家的 Elixir 基礎(chǔ)設(shè)施加入分布式追蹤的。他們做了一個(gè)自定義的 “Transport” 庫(kù),把追蹤上下文包在 Elixir 的消息傳遞機(jī)制外面,從而解決了在 actor 架構(gòu)里做可觀測(cè)性埋點(diǎn)的一個(gè)核心難題。

和基于 HTTP 的微服務(wù)不同(trace context 通常放在 header 里傳遞),Elixir 的 actor 模型是在進(jìn)程之間直接傳任意消息,本身并沒有元數(shù)據(jù)這一層。Discord 希望在整個(gè)聊天系統(tǒng)里實(shí)現(xiàn)端到端的可觀測(cè)性,但遇到了一個(gè)問(wèn)題:OpenTelemetry 的標(biāo)準(zhǔn)追蹤 只能在單個(gè)服務(wù)內(nèi)部生效,沒法在 Elixir 進(jìn)程之間傳遞上下文。

團(tuán)隊(duì)總結(jié)了三個(gè)必須滿足的要求:一是對(duì)開發(fā)者足夠友好,方便落地;二是既支持原始消息,也支持 GenServer 抽象;三是能夠在生產(chǎn)環(huán)境實(shí)現(xiàn)無(wú)停機(jī)部署。

Discord 的方案引入了一個(gè)叫 “Envelope(信封)” 的基礎(chǔ)結(jié)構(gòu),用來(lái)把 trace context 包進(jìn)消息里。實(shí)現(xiàn)看起來(lái)非常簡(jiǎn)單,本質(zhì)上就是一個(gè)結(jié)構(gòu)體,里面包含原始消息和序列化后的 trace carrier:

end

這個(gè)庫(kù)提供了可以直接替換的 GenServer call 和 cast 方法,會(huì)自動(dòng)把發(fā)出去的消息包一層。在接收端,通過(guò)一個(gè) handle_message 函數(shù)統(tǒng)一處理舊的裸消息和新的 Envelope 消息:如果有 trace context 就提取出來(lái),用完之后再清理掉。

這個(gè)“統(tǒng)一處理”的設(shè)計(jì)在上線過(guò)程中非常關(guān)鍵。Discord 不可能一夜之間改掉所有消息傳遞邏輯,也沒法同時(shí)更新所有節(jié)點(diǎn)。這個(gè)庫(kù)可以同時(shí)處理已埋點(diǎn)和未埋點(diǎn)的消息,從而支持逐步遷移,而且不需要重啟服務(wù)。

Discord 的架構(gòu)在擴(kuò)展性上有一些獨(dú)特挑戰(zhàn)。比如一個(gè)用戶在一個(gè)有一百萬(wàn)在線成員的服務(wù)器里發(fā)消息,這一個(gè)帶追蹤的操作就可能生成一百萬(wàn)個(gè)子 span——每個(gè)會(huì)話一個(gè),用來(lái)把消息轉(zhuǎn)發(fā)給客戶端。

團(tuán)隊(duì)基于 fanout(消息擴(kuò)散規(guī)模)做了動(dòng)態(tài)采樣。發(fā)給單個(gè)用戶的消息,100% 保留采樣結(jié)果。發(fā)給 100 個(gè)用戶時(shí),采樣率降到 10%。當(dāng)接收人數(shù)超過(guò) 1 萬(wàn)時(shí),只有 0.1% 的會(huì)話會(huì)記錄會(huì)采樣。這樣既能保留有價(jià)值的追蹤數(shù)據(jù),又不會(huì)把可觀測(cè)性系統(tǒng)壓垮。


來(lái)源:Discord 博客

最初上線時(shí),追蹤帶來(lái)的開銷超出了 Discord 的預(yù)期。那些最活躍、擁有數(shù)百萬(wàn)成員的服務(wù)器,一度跟不上消息流量。性能分析發(fā)現(xiàn),即使 99% 以上的操作沒有被采樣,進(jìn)程仍然花了大量時(shí)間在解析 trace context 上。

解決方案是:只對(duì)被采樣的請(qǐng)求傳遞 trace context。未采樣的請(qǐng)求在 Envelope 里就不帶 context,從而省掉序列化和解析的開銷。這對(duì)傳統(tǒng)的 head sample 語(yǔ)義做了一點(diǎn)小改動(dòng),但成功消除了 CPU 峰值問(wèn)題。

第二個(gè)優(yōu)化針對(duì) sessions 服務(wù):在 fanout 過(guò)程中記錄 span 會(huì)讓 CPU 使用率提高 10 個(gè)百分點(diǎn)。Discord 選擇禁止 sessions 在接收到 fanout 消息后再開啟新的 trace。它們可以繼續(xù)已有的 trace,但不會(huì)自己決定是否采樣。這一改動(dòng)幾乎消除了所有額外開銷,把 CPU 使用率從 55% 降到 45%。

最顯著的一次優(yōu)化來(lái)自對(duì) gRPC 請(qǐng)求處理的分析。在 Elixir 服務(wù)和 Discord 的 Python API 交互時(shí),有 75% 的請(qǐng)求處理時(shí)間都花在解析 trace context 上。團(tuán)隊(duì)為此做了一個(gè)過(guò)濾器,可以直接從編碼后的 trace context 字符串里讀取采樣標(biāo)志,而不需要完整反序列化。如果沒有被采樣,就完全不傳 context。

這套投入在最近一次故障中發(fā)揮了作用,當(dāng)時(shí)某個(gè)服務(wù)器跟不上用戶的活動(dòng)。追蹤數(shù)據(jù)顯示,用戶連接該服務(wù)器進(jìn)程時(shí)出現(xiàn)了長(zhǎng)達(dá) 16 分鐘的延遲——這是一個(gè)指標(biāo)和日志都很難直接看出來(lái)的用戶影響。追蹤還揭示了下游的連鎖反應(yīng):故障期間用戶甚至無(wú)法點(diǎn)擊進(jìn)入這個(gè)服務(wù)器。

Discord 工程師 Nick Krichevsky 表示,這種嚴(yán)重性能下降雖然很少見,但分布式追蹤已經(jīng)成為排查問(wèn)題的關(guān)鍵手段——很多問(wèn)題“以前根本無(wú)從下手”。

Transport 這個(gè)庫(kù)代表了一種在 actor 系統(tǒng)中實(shí)現(xiàn)分布式追蹤的務(wù)實(shí)做法。它不是強(qiáng)行套用 HTTP 那種 metadata 模式,而是直接包裹 Elixir 的消息傳遞機(jī)制,讓 Discord 在保持原有架構(gòu)優(yōu)勢(shì)的同時(shí),也獲得了可以支撐生產(chǎn)規(guī)模的可觀測(cè)性。

聲明:本文為 InfoQ 翻譯,未經(jīng)許可禁止轉(zhuǎn)載。

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺(tái)“網(wǎng)易號(hào)”用戶上傳并發(fā)布,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點(diǎn)推薦
廣告使用“清朝長(zhǎng)辮”被指辱華,法國(guó)品牌Lemaire致歉

廣告使用“清朝長(zhǎng)辮”被指辱華,法國(guó)品牌Lemaire致歉

南方都市報(bào)
2026-04-26 20:40:18
男子一身名牌坐地鐵,被指像成功人士,網(wǎng)友:再有錢也怕堵車

男子一身名牌坐地鐵,被指像成功人士,網(wǎng)友:再有錢也怕堵車

丫頭舫
2026-04-27 17:39:57
38歲王思聰近照認(rèn)不出!滿頭白發(fā)穿睡衣度假,駝背顯老像 50 歲

38歲王思聰近照認(rèn)不出!滿頭白發(fā)穿睡衣度假,駝背顯老像 50 歲

橙星文娛
2026-04-27 14:17:09
2-3!3-3!瘋狂一夜,亞特蘭大爆大冷,拉齊奧補(bǔ)時(shí)絕平,曼聯(lián)險(xiǎn)勝

2-3!3-3!瘋狂一夜,亞特蘭大爆大冷,拉齊奧補(bǔ)時(shí)絕平,曼聯(lián)險(xiǎn)勝

足球狗說(shuō)
2026-04-28 05:07:09
“酩酊大醉”不讀míng dīng dà zuì了,正確讀音是什么?

“酩酊大醉”不讀míng dīng dà zuì了,正確讀音是什么?

未央看點(diǎn)
2026-04-27 22:13:40
從排隊(duì)入籍到集體觀望?美國(guó)入籍申請(qǐng)?bào)E降,綠卡人群態(tài)度變了?

從排隊(duì)入籍到集體觀望?美國(guó)入籍申請(qǐng)?bào)E降,綠卡人群態(tài)度變了?

紐約時(shí)間
2026-04-28 02:29:16
看完女排最新集訓(xùn),心里五味雜陳!別說(shuō)里約,連倫敦周期都比不上

看完女排最新集訓(xùn),心里五味雜陳!別說(shuō)里約,連倫敦周期都比不上

金毛愛女排
2026-04-28 00:00:04
Deepseek,光通信之后的下一個(gè)主升浪

Deepseek,光通信之后的下一個(gè)主升浪

靜姐的財(cái)富第六感
2026-04-26 22:31:06
淚目 趙心童曬兒時(shí)與丁俊暉合照:偶像暉哥讓我加油 你也要加油啊

淚目 趙心童曬兒時(shí)與丁俊暉合照:偶像暉哥讓我加油 你也要加油啊

風(fēng)過(guò)鄉(xiāng)
2026-04-27 06:15:09
有的人為了當(dāng)官,把老婆送給領(lǐng)導(dǎo)睡

有的人為了當(dāng)官,把老婆送給領(lǐng)導(dǎo)睡

斜杠人生
2026-04-28 00:00:04
金價(jià):大家不用等候了!不出意外,金價(jià)可能將歷史重演!

金價(jià):大家不用等候了!不出意外,金價(jià)可能將歷史重演!

殘夢(mèng)重生來(lái)
2026-04-28 04:40:09
不到72小時(shí),俞敏洪再迎兩大壞消息,主播集體辭職只是“開胃菜”

不到72小時(shí),俞敏洪再迎兩大壞消息,主播集體辭職只是“開胃菜”

阿廢冷眼觀察所
2026-04-28 00:24:36
皮蛋再次成為關(guān)注對(duì)象!研究發(fā)現(xiàn):高血脂吃皮蛋,身體或有6改善

皮蛋再次成為關(guān)注對(duì)象!研究發(fā)現(xiàn):高血脂吃皮蛋,身體或有6改善

健康科普365
2026-04-25 09:27:08
七萬(wàn)匹東洋大馬的覆滅:國(guó)民黨三年敗光日本四十五年心血

七萬(wàn)匹東洋大馬的覆滅:國(guó)民黨三年敗光日本四十五年心血

小莜讀史
2026-04-26 22:44:33
特朗普轉(zhuǎn)發(fā)“中印是人間地獄”,印度痛批低俗,中方態(tài)度耐人尋味

特朗普轉(zhuǎn)發(fā)“中印是人間地獄”,印度痛批低俗,中方態(tài)度耐人尋味

線裝史冊(cè)
2026-04-28 02:38:29
東南亞隱藏的“電詐大佬”,一個(gè)個(gè)正在浮出水面

東南亞隱藏的“電詐大佬”,一個(gè)個(gè)正在浮出水面

現(xiàn)實(shí)的聲音
2026-04-27 20:36:14
大姑子一家9口住進(jìn)來(lái),老公說(shuō)他5200養(yǎng)活全家足夠,我?guī)夯啬锛?>
    </a>
        <h3>
      <a href=麥子情感故事
2026-04-27 21:34:15
沒人再提激光雷達(dá)數(shù)量?直擊北京車展:今年智能駕駛“卷”什么

沒人再提激光雷達(dá)數(shù)量?直擊北京車展:今年智能駕駛“卷”什么

時(shí)代周報(bào)
2026-04-26 18:14:26
涉黃被傳喚,馬斯克出事了

涉黃被傳喚,馬斯克出事了

營(yíng)銷頭版
2026-04-27 14:42:14
中國(guó)排協(xié)官宣!16點(diǎn)30分,女排訓(xùn)練將直播,第二批球員恐揭曉

中國(guó)排協(xié)官宣!16點(diǎn)30分,女排訓(xùn)練將直播,第二批球員恐揭曉

跑者排球視角
2026-04-27 23:48:17
2026-04-28 05:28:49
InfoQ incentive-icons
InfoQ
有內(nèi)容的技術(shù)社區(qū)媒體
12309文章數(shù) 51863關(guān)注度
往期回顧 全部

科技要聞

DeepSeek V4上線三天,第一批實(shí)測(cè)出來(lái)了

頭條要聞

坐在特朗普身邊親歷槍擊案的女記者 身份非常不一般

頭條要聞

坐在特朗普身邊親歷槍擊案的女記者 身份非常不一般

體育要聞

人類馬拉松"破二"新紀(jì)元,一場(chǎng)跑鞋軍備競(jìng)賽

娛樂(lè)要聞

黃楊鈿甜為“耳環(huán)風(fēng)波”出鏡道歉:謠言已澄清

財(cái)經(jīng)要聞

Meta 140億收購(gòu)Manus遭中國(guó)發(fā)改委否決

汽車要聞

不那么小眾也可以 smart的路會(huì)越走越寬

態(tài)度原創(chuàng)

家居
時(shí)尚
手機(jī)
教育
軍事航空

家居要聞

江景風(fēng)格 流動(dòng)的秩序

絲巾的10種系法,愛美的女人必看

手機(jī)要聞

一加Nord CE6 Lite官宣5月7日發(fā)布,7000mAh電池

教育要聞

你不說(shuō)這是計(jì)算障礙,我真以為我是智障呢

軍事要聞

伊朗外長(zhǎng)折返伊斯蘭堡內(nèi)情披露

無(wú)障礙瀏覽 進(jìn)入關(guān)懷版