Stack Overflowは先頃、.NET Frameworkから.NET Coreへのシステムアーキテクチャ移行を完了した。このプラットフォームはStack Overflowだけではなく、170を越えるQ&Aコミュニティ、さらには企業のプライベートQ&Aサイトも支えている。
"ここ、Stack Overflowでは、多くのものを.NET Coreに移行しました。その過程においては、古い.NETの世界にあって、新しい世界にはないパーツを置き換えなくてはなりませんでした。"
Nick Craver — アーキテクチャリーダ
最後の変更となったASP.Net MVCからASP. Net Coreへの移行は、アーキテクチャの"web and service"ティアに影響を与えた。
"web and service"は、メインのQ&Aアプリケーション、キャリア、モバイルAPI、API v2、タグサービスを提供するティアだ。これらのサービスには、複数レイヤと冗長性による高可用性が提供されている。永続化ストレージは、Availability Groupを通じて同じように高可用性を備えたSQL Serverである。
フロントエンドのCDN、DNS、ロードバランシング、バックエンドのElastic SearchとRedisキャッシュコンポーネントは影響を受けていない。
.NET Coreへの変更と並行して、Stack Overflowでは、アクセシビリティの大幅な向上とダークモードをサポートするユーザインターフェース変更も行っている。バックエンドも同時に、最新バージョンのSQL Server 2019をサポートするために変更された。
これらすべての変更を行っている間も、システムは毎月数百万というユーザのサポートを継続しているのだ。
InfoQは先頃、アーキテクチャリーダのNick Craver氏から、今回の移行と、その過程における課題の対処について詳しく聞くことができた。
InfoQ: なぜ今、.NET Coreに移行しようと決めたのですか?
Craver: 最近になって決めたのではありません。実は何年も前から、こちらの方向に進みたいと決断していたのです。.NET Core 1.xより前から、Marc Gracellと私は、私たちのオープンソースライブラリ(Dapper、MiniProfiler、StackExchange.Redisなど)を互換性のあるものにする作業に着手していました。これらの依存関係を使っているアプリ(私たちのメインアプリケーションもそうです)よりも前に作業を終えておくべきだ、ということを理解していたからです。Architecture(私のチームです!)が多くの時間を費やしてStack Overflow for Teamsを提供した後、主要な(これだけではありませんが)プロジェクトとして、.NET Coreへの移行に着手しました。移行の完了までには、およそ1.5~2人年の工数がかかっています。
InfoQ: 書き直しが必要だったのは、どのコンポーネントですか?
Craver: この件はちょっと複雑ですが、聞いてください。.NET Core 1.xの頃、APIが大幅に変更されました。そのため、ライブラリに互換性を持たせるに当たっては、多くのコンポーネントを大幅に書き直して動作するようにしなくてはなりませんでした。.NET Core 2.xでは".NET Standard"がものになり、互換性が大きく向上したことから、書き直した結果の大部分は不要になりました。要するに、もっと遅く着手していれば、これほど多くの作業をしなくてもよかった、ということです。もっとも、そうしていれば、他の仕事が何か月も何年も滞ることになったでしょう ... 人生はトレードオフの連続ですね :)
いくつかの書き直しはしましたが、1回の"ビッグバン"アプローチではなかったので、マイグレーションには調整やシム(shim)を使用しました。このあたりのことは、近々ブログ記事に詳しく書くつもりです。
引用元: Stack Overflow The Architecture 2016 — Nick Craver's Blog
InfoQ: 特に問題になったような部分はありましたか?
Craver: アプリに関しては、Stack Overflowを私たちの希望したように動作させたり、あるいは必要なスケールアップを行ったりするために、フレームワークを越えた拡張や置き換え、ハックなどをした部分については、基本的にすべての部分で苦労しました。具体的には要求パイプライン、認証をスピンアップする順序、ASP.NETのカスタムフィルタといった部分が中心でした。フォーム検証も .NET Coreで非常にアグレッシブになった部分なので、当初はbotが非常に多くのノイズを発生させていました。ただし、これは単純にやっかい者でしかありませんし、巨大なWebサイトでは仕方のないことでもあります。
InfoQ: 移行による予想外のメリットや、副次的な効果は何かありましたか?
Craver: 移行が完了するまでは、予想外のことはそれ程多くはありませんでした。.NET Coreが非常に出力ストリーム指向であるため、今はタイミング面での目的でHTTP Trailerヘッダの調査をしているところです。予想はしていたのですが、これ程とは思っていませんでしたし、Coreへの移行とは関係のない、他の複雑な要因もありました。全体的に見て、Trailerヘッダが必要、Linuxとの互換性が必要、などのことがあります。
macOSやLunuxではすでにほぼ動作しているので、Macを使っているデザイナがWindows VMをインストールする必要はありませんし、いくつかのデプロイメントシナリオでは、すでにコンテナで運用する準備もほぼ整っています。例えば、突っ込んだり、テストしたりするためにアクセスできるPRのURLを考えてみてください。これをコンテナで行たいのです。そうすれば、ワンステップ・クラスタが出来上がります。
興味のある読者は、Stack Overflowのブログや、Nickのブログについてのポッドキャストで詳細を学ぶとよいだろう。彼らのサイトについて質問があるならば、Meta Stack Overflowに投稿することができる。NickのTwitterアカウント@Nick_CrfaverやStack Overflowのユーザ nick-craverにコンタクトを取るとようだろう。