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

騰訊開源發表於2018-05-21

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

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

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


雲抓包

TSW支援使用者維度的抓包

  • 對於染色的使用者
  • 對請求生命週期內的抓包進行收集
  • 提供抓包檢視、下載等功能
  • 抓包格式支援Fiddler和Charles,以及HAR


全息日誌

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

  • 對請求生命週期內的日誌,採用全息的方式記錄,形成流水
  • 流水按使用者維度聚合
  • 提供檢視功能,快速定位問題原因


異常發現

  • 內建指標實時監控
  • 程式碼異常推送告警

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

誰都在用?

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

騰訊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。


相關文章