【譯】使用.NET將WebAssembly擴展到雲(二)

原文 | Richard Lander

翻譯 | 鄭子銘

輕量級功能

嗯……但是如果我們使用 Wasm 更像是一個典型的功能而不是一個應用程序,我們可能不會計算一百萬個單詞,而是做一些更輕量級的事情。讓我們重新運行比較,但使用最小的文件。

通過 Wasm,使用我們的解釋器:

$ time WASMTIME_NEW_CLI=0 wasmtime run --mapdir /text::/home/rich/git/convenience/wordcount count.wasm $* /text/Clarissa_Harlowe/summary.md
        9     153    1044 /text/Clarissa_Harlowe/summary.md
Elapsed time (ms): 21
Elapsed time (us): 21020.8

real    0m0.098s
user    0m0.083s
sys 0m0.014s

使用 Wasm 和原生 AOT:

$ time WASMTIME_NEW_CLI=0 wasmtime run --mapdir /text::/home/rich/git/convenience/wordcount count.wasm $* /text/Clarissa_Harlowe/summary.md
        9     153    1044 /text/Clarissa_Harlowe/summary.md
Elapsed time (ms): 0
Elapsed time (us): 825.3

real    0m0.048s
user    0m0.035s
sys 0m0.014s

再次,使用 CoreCLR:

$ time ./app/count ../Clarissa_Harlowe/summary.md 
        9     153    1044 ../Clarissa_Harlowe/summary.md
Elapsed time (ms): 16
Elapsed time (us): 16100

real    0m0.063s
user    0m0.027s
sys 0m0.019s

此圖表顯示了上下文中的所有結果,這次是針對較小的文檔。

有趣的。對於較小的工作負載,其中一些選項之間的性能差異開始縮小。我們還可以看到運行時啓動成本的差異。現在說還爲時過早,但這些動態可能是這項技術的關鍵考慮因素。一個重要的警告是,字數統計只是一種情況,其他情況可能會產生完全不同的結果。目前,該示例已經提供了足夠的預期內容。

這一切都還處於早期階段。隨着我們走得更遠,我們將想要測試更有趣的場景,以形成更具代表性的理解。我也確信其中一些性能數字將會提高。

功能上略有改進

WASI 的承諾是能夠依賴一組具有豐富功能的接口(和匹配的實現)。 SpiderLighting 兌現了這一承諾。

SpiderLightning:一組 WIT 接口,抽象分佈式應用程序功能和運行時 CLI,用於運行使用這些功能的 Wasm 應用程序。

如前所述,WASI 旨在定義與 System 命名空間相同的平臺功能(但只是其中的一小部分)。您可以在 SpiderLighting wit 目錄中看到該接口的接口定義(至少一種版本)。

如果你有智慧,那就發揮你的智慧

您應該能夠走到任何 WIT 界面,引用它,查看其完整的類型形狀,並開始使用它進行編碼。我們距離最終體驗還有幾步之遙,但這就是願景。

SpiderLighting 提供了一個名爲 slim 的便捷 CLI 工具,它可以連接 wasmtime、您的應用程序、WASI SDK 以及您的應用程序所需的任何 WIT 實現(如在 slimfile.toml 中聲明的那樣)。

SpiderLighting 團隊告訴我們,他們構建了 slim(及相關組件)作爲工具來幫助他們開發 wasi-cloud-core 規範,以實現無服務器功能。在不久的將來,我們預計其他應用程序主機(例如 Fermyon Spin)將使用 wasi-cloud-core 接口,然後我們將使用其中一臺主機,而不是輕微的。

我們有一組 Spiderlight 樣本。以下示例創建 WASI 鍵值存儲,然後打印到控制檯。請注意,dotnet run 使用 light 作爲實現細節。

using SpiderLightning;

using var keyValue = new KeyValue("placeholder-name");
keyValue.Set("somekey", "Hello from .NET. This value is from a SpiderLightning key-value store.");

Console.WriteLine(keyValue.GetString("somekey"));

請記住,KeyValue 不是 C# 類型,而是投射到 C# 中的 WASI 接口。

這是代碼運行時的樣子。

$ pwd
/home/rich/git/spiderlightning-dotnet
$ docker run --rm -it -v $(pwd):/source -w /source/sample/ConsoleApp wasi-sdk dotnet run -c Release
Hello from .NET. This value is from a SpiderLightning key-value store.

我正在一個安裝了所有必需依賴項的容器中運行該應用程序。容器和WASI可以一起使用嗎?一定。

您可以在有限的環境中構建依賴 WASI SDK 的應用程序,並在更大的環境中運行它們。 Windows 和 macOS Arm64 的支持似乎最差。隨着時間的推移,這肯定會改變。

網頁場景

對 WASI 的很多興趣在於能夠託管小型且便攜式的 Wasm 功能和應用程序。其中一個關鍵方面是使用某種形式的網絡編程模型。目前,我們還沒有啓用 WASI 的 ASP.NET Core。目前,我們已經公開了 http-server WASI 類型。

它啓用以下模式

HttpServer.OnIncomingRequest(request =>
{
    return new HttpResponse(200)
        .WithBody($"<h1>Hello!</h1> You did a {request.Method} request to {request.Uri} with {request.Headers.Count} headers")
        .WithHeaders(new[] { KeyValuePair.Create("content-type", "text/html") });
});

這有點低級了。委託也不是異步友好的。以下是異步最終如何工作的一些提示

我嘗試用這個 API 編寫一個更大的示例。它目前被阻止,因爲我們沒有辦法調用 https 端點。我可以通過在本地複製所有必需的 JSON 文件來解決這個問題,但不會那麼引人注目。

這個領域是最有趣的,但也是定義最少的。我們預計至少還需要一年的時間才能運行我們所認爲的真正的網絡應用程序和功能。我們的目標是建立一個模型,您無需更改太多代碼即可使用 Wasm 作爲部署目標。

實驗

WASI 工作負載目前處於實驗階段,因此得名工作負載。至少在 WASI 本身發佈穩定的 1.0 版本之前,它仍將是一個實驗。我們無法確切地預測那會是什麼時候。

有幾個待辦事項需要調查和解決:

  • 綜合調試
  • 支持AOT
  • dotnet 使用 wasmtime CLI 參數運行
  • 支持更多 WASI 接口,可能通過更好的 witbindgen 支持

閉幕式

更高層次的故事是,我們已經能夠使我們的 Blazor Wasm 實現(實際上是整個 .NET)適應便攜式計算的新領域。正如這幾個演示所證明的那樣,很多功能已經發揮作用。

您可以使用 .NET 8 嘗試在本文中閱讀的所有內容(以及更多內容)。從以下命令開始,安裝所需的軟件。

dotnet workload install wasi-experimental

在接下來的一年裏,我們將專注於提高當前實施的功能和用戶體驗,並跟隨 WASI 的總體發展。我們還期待觀察雲團隊如何在其服務中採用 WASI。迄今爲止,我們一直在構建支持技術。隨着我們的進一步發展,我們將考慮專注於與雲服務相結合的更多定位體驗。就目前而言,這一切都是面向未來的,就像 WASI 的其他部分一樣。

簡潔是智慧的靈魂。 - 威廉·莎士比亞

如果你讀到這裏,你就會明白,如果我說得簡短一點,你就不會那麼瞭解情況了。但鑑於這篇文章的篇幅和細節,我已經無計可施了。

原文鏈接

Extending WebAssembly to the Cloud with .NET

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含鏈接: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。

如有任何疑問,請與我聯繫 ([email protected])

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章