Go語言寫的tsnet庫運(yùn)行了四年,Tailscale團(tuán)隊(duì)突然用Rust重寫核心。這不是技術(shù)炫技,而是一個(gè)被用戶逼出來的決定——當(dāng)Python和Elixir開發(fā)者想把Tailscale塞進(jìn)自己的程序時(shí),他們發(fā)現(xiàn)唯一的橋梁是"在進(jìn)程里塞一個(gè)Go運(yùn)行時(shí)"。
為什么Go的解法走到頭了
![]()
Tailscale的核心產(chǎn)品邏輯很干凈:讓程序像連局域網(wǎng)一樣安全通信,但不需要真的坐在同一個(gè)機(jī)房。實(shí)現(xiàn)方式是給操作系統(tǒng)掛一個(gè)虛擬網(wǎng)卡,讓上層應(yīng)用無感知。
這個(gè)設(shè)計(jì)在桌面和服務(wù)器上跑得通。但團(tuán)隊(duì)自己踩坑時(shí)發(fā)現(xiàn),OS層動(dòng)手腳在很多場(chǎng)景是死路:精簡(jiǎn)內(nèi)核的嵌入式設(shè)備、禁止修改網(wǎng)絡(luò)棧的容器環(huán)境、或者只是不想折騰系統(tǒng)權(quán)限的SaaS多租戶架構(gòu)。
tsnet應(yīng)運(yùn)而生——"把Tailscale編譯進(jìn)你的程序",不碰操作系統(tǒng),純用戶態(tài)運(yùn)行。Go開發(fā)者用得很爽:setec密鑰管理、tsidp身份代理、tclip粘貼板、golink短鏈,全是內(nèi)部工具。
社區(qū)也跟上來了。tnsrv反向代理、chat-tails消息服務(wù),生態(tài)慢慢長出來。
但非Go開發(fā)者被擋在門外。Tailscale試過補(bǔ)救:libtailscale,一個(gè)C庫包裝。實(shí)現(xiàn)方式很粗暴——首次調(diào)用時(shí)在你的進(jìn)程里啟動(dòng)完整Go運(yùn)行時(shí),再用C膠水粘一層接口。
兩個(gè)運(yùn)行時(shí)搶進(jìn)程生命周期,結(jié)果可想而知。Python的GIL和Go的調(diào)度器打架,Elixir的BEAM虛擬機(jī)被Go運(yùn)行時(shí)強(qiáng)行插入,穩(wěn)定性災(zāi)難。
「第一次調(diào)用就 spinning up an entire Go runtime inside your process」,原文這句描述本身就是問題診斷。不是API設(shè)計(jì)差,是架構(gòu)層面的不可能三角:既要tsnet的功能,又要跨語言,還要進(jìn)程內(nèi)和平共處。
Rust的解法:把運(yùn)行時(shí)削薄到零
tailscale-rs的立項(xiàng)邏輯很直接:如果Go的運(yùn)行時(shí)是障礙,那就換一個(gè)沒有運(yùn)行時(shí)負(fù)擔(dān)的語言。Rust的零成本抽象和無垃圾回收特性,讓它成為系統(tǒng)級(jí)庫的新默認(rèn)選擇。
具體實(shí)現(xiàn)上,tailscale-rs是一個(gè)原生Rust庫,同時(shí)輸出C兼容接口。Python、Elixir、C的綁定都基于這層C接口,但底層不再有Go運(yùn)行時(shí)攪局。
關(guān)鍵差異在于進(jìn)程內(nèi)的資源所有權(quán)。Rust的所有權(quán)模型編譯期就解決了內(nèi)存安全,不需要運(yùn)行時(shí)垃圾回收。這意味著嵌入tailscale-rs的程序,網(wǎng)絡(luò)棧完全受控于宿主語言的生命周期管理。
Python的asyncio事件循環(huán)、Elixir的OTP監(jiān)督樹、C的手動(dòng)內(nèi)存管理——各自保持原有的運(yùn)行假設(shè),不被外來運(yùn)行時(shí)入侵。
目前代碼以實(shí)驗(yàn)性預(yù)覽形式發(fā)布,GitHub倉庫明確標(biāo)注「do not use it in production yet」。但方向已經(jīng)清晰:tsnet的功能集,以庫的形態(tài)向全語言開放。
正方:這是基礎(chǔ)設(shè)施庫的正確形態(tài)
支持者認(rèn)為,網(wǎng)絡(luò)基礎(chǔ)設(shè)施的終極形態(tài)就是語言無關(guān)的庫。Tailscale的WireGuard實(shí)現(xiàn)、NAT穿透、密鑰管理,這些能力應(yīng)該像zlib或OpenSSL一樣,任何語言都能鏈接。
Rust在這個(gè)位置有先例優(yōu)勢(shì)。Mozilla用Rust重寫Firefox的CSS引擎,AWS用Rust寫Lambda的MicroVM(Firecracker),Cloudflare的代理?xiàng)R苍赗ust化。系統(tǒng)級(jí)庫選Rust,已經(jīng)成為2020年代的基礎(chǔ)設(shè)施共識(shí)。
對(duì)Tailscale自身而言,這步棋也有商業(yè)計(jì)算。tsnet生態(tài)原本局限在Go社區(qū),現(xiàn)在可以觸達(dá)Python的數(shù)據(jù)科學(xué)棧、Elixir的實(shí)時(shí)通信場(chǎng)景、C/C++的嵌入式和游戲開發(fā)。每個(gè)語言社區(qū)都是一個(gè)潛在的產(chǎn)品擴(kuò)展面。
技術(shù)債角度,維護(hù)一套R(shí)ust核心比維護(hù)「Go運(yùn)行時(shí)+C膠水+多語言綁定」的三層架構(gòu)更可持續(xù)。libtailscale的兼容性問題本質(zhì)是架構(gòu)缺陷,不是修bug能解決的。
反方:生態(tài)分裂與機(jī)會(huì)成本
質(zhì)疑聲音同樣具體。首先,tsnet在Go生態(tài)已經(jīng)運(yùn)行四年,內(nèi)部工具和社區(qū)項(xiàng)目深度依賴。tailscale-rs從預(yù)覽到生產(chǎn)就緒需要時(shí)間,期間兩套實(shí)現(xiàn)并行維護(hù),團(tuán)隊(duì)資源被稀釋。
更深層的問題是功能對(duì)齊。tsnet的API設(shè)計(jì)經(jīng)過大量實(shí)戰(zhàn)打磨,tailscale-rs能否完全復(fù)刻語義?Go的goroutine和channel模型與Rust的async/await差異顯著,某些tsnet的慣用模式在Rust里可能需要重新設(shè)計(jì)。
綁定層的質(zhì)量也是未知數(shù)。Python的PyO3、Elixir的Rustler都是成熟的FFI工具,但每個(gè)綁定都需要持續(xù)維護(hù)。C接口的ABI穩(wěn)定性、跨平臺(tái)編譯、調(diào)試體驗(yàn)——這些細(xì)節(jié)會(huì)消耗大量工程時(shí)間。
一個(gè)尖銳的對(duì)比:如果目標(biāo)是跨語言,為什么不直接完善libtailscale的Go運(yùn)行時(shí)隔離?比如用獨(dú)立進(jìn)程+IPC通信,而非進(jìn)程內(nèi)嵌。這條路徑?jīng)]有被完全探索就被放棄,是否存在技術(shù)決策的過早優(yōu)化?
我的判斷:運(yùn)行時(shí)戰(zhàn)爭(zhēng)的基礎(chǔ)設(shè)施終局
這場(chǎng)爭(zhēng)論的本質(zhì)是「運(yùn)行時(shí)邊界」在基礎(chǔ)設(shè)施庫中的位置。Go的成功很大程度上依賴其運(yùn)行時(shí)——調(diào)度器、垃圾回收、網(wǎng)絡(luò)輪詢——但這也成為跨語言嵌入的障礙。
Tailscale的選擇揭示了一個(gè)趨勢(shì):下一代系統(tǒng)級(jí)庫正在從「帶運(yùn)行時(shí)的SDK」轉(zhuǎn)向「零運(yùn)行時(shí)的引擎」。Rust不是唯一選項(xiàng),但它是2026年這個(gè)時(shí)間點(diǎn)上,平衡性能、安全和多語言綁定的最優(yōu)解。
對(duì)開發(fā)者的實(shí)際影響:如果你在用Python寫IoT網(wǎng)關(guān),用Elixir建實(shí)時(shí)協(xié)作工具,或者用C++開發(fā)游戲服務(wù)器,現(xiàn)在可以把Tailscale的組網(wǎng)能力編譯進(jìn)二進(jìn)制,而不必在部署時(shí)折騰系統(tǒng)網(wǎng)卡或容器特權(quán)。
這改變了什么?邊緣計(jì)算場(chǎng)景的部署模型。以前「Tailscale客戶端+你的應(yīng)用」是兩套東西,現(xiàn)在可以是一個(gè)靜態(tài)鏈接的可執(zhí)行文件。在受限環(huán)境——比如客戶的VPC、工廠的內(nèi)網(wǎng)、飛機(jī)的娛樂系統(tǒng)——這種差異決定了方案是否可行。
Tailscale團(tuán)隊(duì)把預(yù)覽版放出來,明確要社區(qū)反饋。這不是產(chǎn)品發(fā)布,是技術(shù)路線的公開驗(yàn)證。Go的tsnet不會(huì)消失,但Rust版本的演進(jìn)速度將決定Tailscale能否突破語言天花板,成為真正的基礎(chǔ)設(shè)施默認(rèn)選項(xiàng)。
特別聲明:以上內(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.