2022-10-03: Experimental WebTransport over HTTP/3 support, .NET 6 Migration Journeys

Published on Monday, 03 October 2022

トピックス

Experimental WebTransport over HTTP/3 support in Kestrel - .NET Blog

https://devblogs.microsoft.com/dotnet/experimental-webtransport-over-http-3-support-in-kestrel/

Kestrel での WebTransport over HTTP/3 の実験的サポートについての記事。

.NET 7 RC 1 の Kestrel で WebTransport over HTTP/3 の実験的サポートが導入された。WebTransport は UDP を使用する QUIC と HTTP/3 に基づいたストリーミング接続で、従来までの HTTP/2 での一つの接続による WebSocket の複数ストリームと異なり、あるストリームがパケットドロップ等の理由でブロックされた場合でも他のストリームがブロックされるといったことを避けられるといったメリットがある。

WebTransport を有効にするにはプロジェクトファイル (.csproj) で実験的機能の設定を有効化と、WebHost で HTTP/3 をリッスンする必要がある。

Microsoft Teams’ Infrastructure and Azure Communication Services’ Journey to .NET 6 - .NET Blog

https://devblogs.microsoft.com/dotnet/microsoft-teams-infrastructure-and-azure-communication-services-journey-to-dotnet-6/

Microsoft Teams と Intelligent Conversation and Communications Cloud (IC3) と呼ばれるリアルタイム通信会話の基盤を .NET Framework から .NET 6 へと移行した事例の紹介。

動機として Azure のコスト削減、パフォーマンス向上、サービスとネットワークのモダナイゼーション、エンジニアリングの生産性の向上をあげている。

IC3 は200を超えるマイクロサービスで構成され、現在は1/3以上のサービスが .NET 6 で実行されている。以降のアプローチとして2つのマイクロサービスでアプローチの構築と検証、基盤のサポートとライブラリーの更新を行い、前提と移行手順を検証したのち、残りのサービスに展開した。

その際効率の向上の測定のため Q-Factor 分析を行ったとのこと。Q-Factor とは Q=(合計作業量)/(合計使用率) で導き出される値で、インスタンスが一定期間の使用率あたりに可能な仕事量を表すもので、ここでは CPU を使用率として、リクエスト数を作業量として定義して計測している(つまり 1,000 reqs を CPU 50% で処理した場合は Q = 2,000 で、2,000 reqs を CPU 50% で処理できれば Q = 4,000 となる、といった形で比較できる)。

記事ではマイクロサービスのいくつかのドメインでの結果を紹介している。

メッセージングドメインの API サービスを .NET 6 に移行した際の結果としては大きくは CPU 使用率の削減、Azure の支出の削減、Azure のコンピューティングのコストの削減の効果があった。現在 Dynamic PGO を適用してさらなるコスト削減を目指しているところ。

次に通話ドメインのブローカーサービスを .NET 6 に移行した結果の紹介で同様に CPU コアの削減と Azure の支出の削減、API レイテンシーの向上の効果があった。CPU 使用率の削減は当初は .NET Core 3.1 と .NET Framework でのベンチマークの結果、.NET Core のほうが高かったがいくつかの最適化を行うことで .NET Core でより良いパフォーマンスが得られ、.NET 6 へ移行しボトルネックを特定できる仕組みなどを用意した結果、最終的に大幅な改善が得られた。レイテンシーは API によっては 10ms 前後から 5ms 前後へと平均 55% の改善が得られたとのこと。

最後は会議ドメインについて。会議仮想アシスタントと会議自動応答サービスが .NET 6 へと移行され、会議自動応答サービスでの結果を紹介している。ここでも CPU コアの大きな削減 (98%) や Azure の支出の削減、CPU 使用率の削減や応答時間の短縮といった効果があったとのこと。

Microsoft Commerce's .NET 6 Migration Journey - .NET Blog

https://devblogs.microsoft.com/dotnet/microsoft-commerce-dotnet-6-migration-journey/

Microsoft Commerce という製品やサービスのカタログからライセンス情報の保持、税額の計算などビジネス、コンシューマー問わず Microsoft の取引にかかわるサービスのセットで .NET 6 の移行を行った事例紹介。

記事では Microsoft Commerce のグローバルルックアップサービス (GLS)と呼ばれる、サービスを分割し、ユーザーのデータの場所を近さに応じてマッピングするサービスを移行した例を紹介している。

移行には .NET Framework から .NET Core に加え、実行プラットフォームを Windows から Linux (Kubernetes) へ移す必要になった。

  • Windows から Linux
  • .NET Framework から .NET Core (3.1 あるいは .NET 5、現在は .NET 6)
  • コンテナーと Kubernetes へのプラットフォームシフト (VM からの脱却)
  • ビルドとリリースシステムの変更によりセキュリティーおよびコンプライアンスの向上、コンテナー化されたアプリケーションをサポート
  • 移行に伴うプラットフォームと .NET の拡張と改善の利用とパートナーの依存関係を含むメリットの享受

移行の結果として大きなコストの削減と CPU コアの削減といったコストの削減があったが、.NET 以外の様々な変更も含むため、より具体的な .NET Framework から .NET Core への移行による効果例を探した結果、サービスの待ち時間の大幅な短縮といった効果が見られたとしている。

さらに .NET 5 から 6 への移行も行われ、スレッドプールの改善、接続管理の改善、ランタイム内部の例外の削減といった効果が見られたとのこと。

記事では移行に関する知見がいくつか紹介されている。

依存関係のマッピングと移行経路の評価(.NET 機能への置き換え、新しい依存関係への置き換え、依存関係を使用しての移行、独自の実装への置き換え)には広範囲の作業が必要となり時間をかけている。

また移行時に独自ソリューションを .NET のベストプラクティスへの置き換えを試みたこと。例えばオブジェクトプーリングの機構は ObjectPool クラスを使用する、RecyclableMemoryStream ライブラリーを使用するといった形で独自実装からの置き換えを、APM ベースの非同期モデルは TAP へと変換するといった形での対応を行った。

サービスは .NET Core へと移行して、Windows から Linux に移行することで Linux で動作させるために必要な対応が必要となった。"Windows 前提" であることはビルド、ツール、監視やトラブルシューティングといった部分でもぐりこむことがある。例えばフォルダーのスラッシュ(/\) や COM の依存、Windows API の使用といった様々であり、これらはプラットフォーム依存しない形に変更する必要がある。サービスを複数のプラットフォームで End-to-End で早期にテストすることで見つけ出すことが重要であること。

HTTP.sys から Kestrel への移行により Linux と Kubernetes での動作とクリーンなコードへと代わり、インメモリーキャッシュのために Win32 ファイル API を使用してファイルシステムへの読み書きを行っていたコードを UnmanagedMemoryStream へと置き換えるといったことをしている。

最後にクロスプラットフォームによるツーリングについて。使い慣れた Windows のデバッグや調査のためのツールが .NET Core や Linux でも動作するわけではないことから、 .NET の標準ツール (dotnet counters, dotnet dump, dotnet trace など) に関する知識を溜めたとのこと。新しく使えるようになったツールとして .NET メトリクスサイドカーがあり、.NET 6 移行の dotnet monitor を Docker イメージに含めサイドカーとして動作させることで稼働中のプロセスのメトリクスやダンプ、トレースの取得が可能となった。

Fall 2022 Updates for Xamarin, Hello iOS 16 and Android 13 - Xamarin Blog

https://devblogs.microsoft.com/xamarin/xamarin-ios-16-android-13-updates/

Xamarin の2022年秋のアップデートのアナウンス。

Visual Studio 2022 17.3.5 と Visual Studio for Mac 2022 17.3.6 で Xamarin が iOS 16 と Android 13 に対応した。

Xamarin SDK は2024年5月1日までのサポートとなり、最終的なプラットフォームバージョンは iOS 16 と Android 13 となる。これ以降のバージョンについては .NET の一部として提供されるため移行が必要となる。

記事では .NET 6 へのアップグレードについてとロードマップを改めて紹介している。

Visual Studio for Mac 17.4 Preview 2.1 is now available - Visual Studio Blog

https://devblogs.microsoft.com/visualstudio/visual-studio-for-mac-17-4-preview-2-1-is-now-available/

Visual Studio for Mac 17.4 Preview 2.1 がリリースされた。

このリリースではデバッグ中のワンクリックでのリスタート、エディターのドラッグアンドドロップによるサイドバイサイドのようなシェル体験の改善、エディターの C# 11 に関する機能のサポートやハイライティング、行間設定といった改善のほか、Apple Silicon 環境へのインストールに Rosetta が不要となった。

Use .NET from any JavaScript app in .NET 7 - .NET Blog

https://devblogs.microsoft.com/dotnet/use-net-7-from-any-javascript-app-in-net-7/

.NET 7 で対応する JavaScript ベースのアプリケーションから .NET を WebAssembly のアプリケーションとして利用できるようになる仕組みについての記事。

記事では JavaScript のサンプルプロジェクト TodoMVC に .NET WebAssembly で一部実装を置き換えるという例を紹介している。

Rider 2022.3 Early Access Program Is Now Open | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/09/26/rider-2022-3-early-access-program/

Rider 2022.3 EAP が公開された。

このリリースでは起動パフォーマンスの改善や C# での Language Injection のサポートの強化、NuGet Central Package Management のサポートやホットリロードの改善、IL Viewer や UI/UX の改善などが含まれる。

ReSharper 2022.3 Early Access Program Is Open! | The .NET Tools Blog

https://blog.jetbrains.com/dotnet/2022/09/26/resharper-2022-3-early-access-program/

ReSharper 2022.3 EAP が公開された。

このリリースでは C# 11 の Raw String リテラル無いの Language Injection のサポートなどが追加されている。

Release v12.0.0 · AutoMapper/AutoMapper

https://github.com/AutoMapper/AutoMapper/releases/tag/v12.0.0

AutoMapper v12.0.0 がリリースされた。

いくつかの不具合の修正と改善が行われている。

アーティクル、スライドなど

NuGet Season of Giving - The NuGet Blog

https://devblogs.microsoft.com/nuget/nuget-season-of-giving/

NuGet リポジトリーに貢献を待っているという記事。

10月は Hacktoberfest が開催され、NuGet も参加しているためコミュニティーからの貢献を呼び掛けている。

.NET Core 3.1 以降を Windows Update の更新対象とする at SE の雑記

https://blog.engineer-memo.com/2022/09/28/net-core-3-1-%e4%bb%a5%e9%99%8d%e3%82%92-windows-update-%e3%81%ae%e6%9b%b4%e6%96%b0%e5%af%be%e8%b1%a1%e3%81%a8%e3%81%99%e3%82%8b/

Windows Server で .NET Core 3.1 または .NET 5 以降の更新を Windows Update から受け取る設定についての記事。

.NETCoreでマルチプラットフォームを対象にした画像処理 - Qiita

https://qiita.com/karuakun/items/319b78a41cd0e9fa5f07

.NET Core 以降で画像処理を行うためのライブラリーを紹介している記事。

記事では System.Drawing.Common, ImageSharp, SkiaSharp の3つを紹介している。

Migrating from ASP.NET to ASP.NET Core (Part 4) - .NET Blog

https://devblogs.microsoft.com/dotnet/migrating-from-asp-net-to-asp-net-core-part-4/

ASP.NET を ASP.NET Core に移行するシリーズの Part 4 記事。

記事では Visual Studio のプロジェクト移行拡張ツールの更新についてと System.Web アダプターの更新について触れている。

.NET6 + EnityFramework + ChocolateでGraphQLサーバーを作る

https://zenn.dev/noripi10/articles/2db7fb619f588d

.NET 6 と Enity Framework Core、Chocolate GraphQL を組み合わせて GraphQL を作ってみるという記事。

Advanced SignalR configuration: fine-tuning the server-side hub and all supported client types

https://medium.com/@f.sazanavets/advanced-signalr-configuration-fine-tuning-the-server-side-hub-and-all-supported-client-types-a3de4858fc71

SignalR のサーバーサイドとクライアントと様々な設定について解説している記事。

C#でクラス新規作成時のテンプレートを編集する - Qiita

https://qiita.com/alicial/items/1bc992e8787c8211d91d

Visual Studio で C# の新しいクラスを作成するときのテンプレートをカスタマイズする方法についての記事。

Sorting in C#: OrderBy.OrderBy or OrderBy.ThenBy? What’s more effective and why?

https://medium.com/c-sharp-progarmming/sorting-in-c-orderby-orderby-or-orderby-thenby-whats-more-effective-and-why-f9545ee2265f

二つの並び替え軸がある場合に OrderBy.OrderBy と OrderBy.ThenBy のそれぞれでの処理の違いを内部についても含めて解説している記事。

Streaming in SignalR - Scientific Programmer

https://scientificprogrammer.net/2022/09/26/streaming-in-signalr/

SignalR でメッセージのストリーミングを行う方法についての記事。

ASP.NET Core rate limiting middleware in .NET 7 - Maarten Balliauw

https://blog.maartenballiauw.be/post/2022/09/26/aspnet-core-rate-limiting-middleware.html

.NET 7 の ASP.NET Core のレートリミットミドルウェアの使い方についての記事。

記事ではレート制限時の挙動のカスタマイズやポリシーの構成、YARP との組み合わせといったものを説明している。

Understanding identity in .NET

https://dev.to/pbouillon/understanding-identity-in-net-2169

.NET のアイデンティティ (Claim) についての基礎を解説している記事。

ライブラリ、リポジトリ、ツールなど

nifanfa/MOOS: C# x64 operating system programming with the .NET native ahead-of-time compilation technology.

https://github.com/nifanfa/MOOS

.NET 7 の NativeAOT を使用して C# で OS を作るというプロジェクト。

pg-ito/dotnet_ffi: invoke C# managed code from php

https://github.com/pg-ito/dotnet_ffi

PHP の拡張で .NET ランタイムをホストして C# のライブラリーを呼び出せるようにする仕組み。

mathnet/mathnet-numerics: Math.NET Numerics

https://github.com/mathnet/mathnet-numerics

数値計算ライブラリー。特殊関数、線形代数、確率モデル、乱数、統計、補間、積分、回帰、曲線フィッティング、積分変換 (FFT) などが含まれる。

-「ちょっと午後までに標準偏差表示しといて」~C# での最速標準偏差~ - Qiita

Cysharp/MemoryPack: Zero encoding extreme performance binary serializer for C#.

https://github.com/Cysharp/MemoryPack

C# / .NET に特化したバイナリー形式(メモリー表現のまま)のシリアライズを行うハイパフォーマンスなシリアライザー。

.NET 7 を前提とした実装と Incremental Source Generator による事前コード生成などの特徴を持っている。

サイト、ドキュメントなど

ASP.NET Core in Action, version 3, is now available

https://andrewlock.net/asp-dotnet-core-in-action-version-3-is-now-available/

ASP.NET Core in Action 第3版が Early Access で発売された。

この新版では Minimal APIs を含む .NET 7 に対応した形に更新されているとのこと。記事では10月13日まで40%オフで入手できるクーポンを公開している。

Deep Dive

LINQ Usage Survey · Issue #76205 · dotnet/runtime

https://github.com/dotnet/runtime/issues/76205

LINQ の利用調査。メソッド構文かクエリー式か、どのようなケースで使用するか、どのようなケースで避けているか。