05.21 騰訊Node.js基礎設施TSW正式開源

騰訊Node.js基礎設施TSW正式開源

經過六年的迭代與沉澱,騰訊Tencent Server Web (以下簡稱TSW)這一公司級運維組件於今日正式開源。TSW是面向WEB前端開發者,以提升問題定位效率為初衷,提供雲抓包、全息日誌和異常發現的Node.js基礎設施。TSW每天為百億次請求提供穩定服務,廣泛應用在QQ空間、微視、微雲、QQ音樂、全民K歌、騰訊雲等三十多個重要業務當中。

官方網站:https://tswjs.org

Github 開源地址:https://github.com/Tencent/TSW

雲抓包

TSW 支持用戶維度的抓包

l 對於染色的用戶

l 對請求生命週期內的抓包進行收集

l 提供抓包查看、下載等功能

l 抓包格式支持Fiddler和Charles,以及HAR

全息日誌

TSW 提供用戶維度的全息日誌幫助開發者快速定位問題

l 對請求生命週期內的日誌,採用全息的方式記錄,形成流水

l 流水按用戶維度聚合

l 提供查看功能,快速定位問題原因

異常發現

l 內置指標實時監控

l 代碼異常推送告警

誰都在用?

騰訊Node.js基礎設施TSW正式開源

源於直出

2012年10月,TSW第一版上線織雲(一體化自動運維平臺),Node.js版本為0.6.20。當時的功能十分簡陋,只實現了服務端JS直出頁面,可以說毫無運維可言,唯一的價值是可以讓首屏體驗更快。為了強化這個唯一的價值,實現了gzip+chunked,邊壓縮邊傳輸,可以讓頁面內容有節奏的回包,精確控制流式回包,對Node.js來說非常簡單。

在瀏覽器裡,想要cookie的時候通過上下文window變量就取到了,從來沒有覺得取cookie是一件特別費勁的事。但到Node.js裡就不同了,對於取cookie這麼簡單的需求,需要特別關注request對象在哪裡。因為request對象是局部變量,無法全局獲得,這就是問題的本質。

直到2014年,一種實現上下文的方法被發現,window對象誕生。利用process.domain總是指向當前包裹自己的domain對象這一個特性來完成上下文自動切換。window對象的本質是與request對象生命週期綁定的全局變量。你可以在任何時候通過window獲取request對象,進而取得cookie等其它信息。

window的出現,打通了不同維度間的聯繫,把這些聯繫落地,就可以產生新的價值。比如在DNS解析API中,是沒有用戶概念的,用戶存在於更高維度中,高維對低維不可見,通過window對象,低維度裡可以知道正在為哪個用戶做解析服務。當解析結果有問題時,知道影響了哪個用戶,通過用戶也能回朔到解析過程。維度之間不是單純的依賴關係,而是密切配合的關係。這就導致了TSW的代碼在組織方式上,需要無條件高內聚,不能以模塊的方式單獨存在。為了收集這些聯繫,需要有配套的存儲、查看系統。這些系統最終演進為TSW開放平臺(tswjs.org)。

興於抓包

有個問題一直困擾著我們:為了解決某個問題,抓包一小時,代碼一分鐘,抓包效率嚴重影響著定位問題的效率。在這樣的背景下,TSW提出服務端雲抓包的解決方案。與用戶端抓包相比,不用再關注用戶端網絡環境、位置、接入層協議等問題。

只抓請求包和響應包遠遠不夠,使用上下文對象,對其強化。在請求處理過程中,利用上下文,將衍生請求進行關聯抓包,構成全息抓包;將衍生日誌進行關聯,構成全息日誌。對於一次請求,能看到所有維度的日誌和抓包,是一件很自然的事。最後把日誌和抓包落地供查看。對於不符合預期的請求,可精確給出問題原因。從結果看,團隊整體的研發效率得到了質的提升。

騰訊Node.js基礎設施TSW正式開源

久於運維

公司內頂尖的前端開發,分佈在各種類型的產品中,想讓他們成為用戶,先要突破部門牆。運維這個維度是有機會破牆的。A業務和B業務的運維很大可能是同一波人。就像引力波,可跨越空間維度,直接抄近道,不用繞著本維空間跑。因此TSW選擇在運維上發力,而不是在代碼如何編寫上,與開源庫飈車。

安裝1臺Node.js是技能,安裝1000臺是運維。安裝和升級,應該看成一個運維問題來解決掉。Node.js版本,大家都知道迭代很快,如果每個版本都有業務在用,就有多個運維對象。提供多個版本供業務選擇看起來很民主,但是,好的運維是減少運維對象。

能不能統一升級只維護一個版本?統一升級又遇到新的挑戰:CPP擴展是和Node.js版本強相關的,只升Node.js還不夠,擴展也需要統一維護。為了找出來所有的CPP擴展,TSW動用了監控,對業務私有擴展郵件告警,然後納入TSW統一維護。統一維護加速了TSW的迭代速度,版本強一致規避了迭代帶來的代碼腐化問題。

前端開發之間交流JS毫無問題,但對運維同學來說,是方言,這時就需要能講普通話。拿啟動邏輯來說,一個Node.js程序炫技式啟動,掛了的時候,只有開發知道怎麼拉起來,這就十分尷尬。再拿擴縮容舉例,運維擴縮容後,需要動代碼才能上下線,那就是有問題的。織雲經過多年積累,運維自動化程度達到了自助級別,TSW在標準化上,選擇入駐織雲。當需要安裝、重啟、升級TSW時,到織雲點一下按鈕就好了。

盛於開源

TSW已經具有很強的穩定性和業務通用性。Node.js在前端界目前已經具有相當的熱度和歡迎度,TSW作為Node.js基礎設施,在公司內部已經得到了開發團隊以及運維團隊的認可,本次將TSW開源,在業界進一步增強TSW的技術影響力,同時也進一步完善和優化TSW。


分享到:


相關文章: