shubham shaw

C#やJavaなどのマネージドフレームワークを使った分散エンタープライズバックエンドの設計に7年以上携わった後、私は最近、サーバー上でWebAssemblyを実行する実験をするために、いつもの技術スタックを離れてみました。長年一つの馴染んだエコシステムにいると、プラットフォームの慣習が普遍的なルールのように感じられることがあるため、まったく異なるパラダイムを学ぶことは、アーキテクチャの前提を検証するのに最適な方法です。

ほとんどのエンジニアはWebAssemblyをブラウザのイノベーションとして認識しています。これはバイナリコード形式であり、つまり、コンピュータコードをコンパクトな命令に事前変換し、ほぼネイティブの速度で安全な仮想エンジン内で実行することを意味します。しかし最近、オープンソースコミュニティはWebAssembly System Interfaceを作成しました。これは、これらの同じサンドボックス化されたバイナリが、オペレーティングシステムのリソース(ファイル、システムクロック、ネットワークソケットなど)と安全にやり取りできるようにする標準化された抽象化レイヤーです。この開発により、WebAssemblyはウェブページから離れ、バックエンドクラウドインフラストラクチャ上に持ち出されることになりました。

外部ユーザーからの信頼できないコードを処理する方法について考えるうちに、私の好奇心は高まりました。ワークフォースプラットフォームや財務報告エンジンのようなシステムでは、ビジネスクライアントはしばしばカスタム計算やデータ変換ルールをアップロードしたいと望みます。伝統的に、サードパーティのコードを安全に実行するには、新しいコンテナを起動する必要がありました。これは、アプリケーションとそのオペレーティング環境全体を含む分離されたソフトウェアパッケージです。コンテナは強固なセキュリティ境界を提供しますが、メモリオーバーヘッドがあり、起動に数百ミリ秒かかります。

サーバーサイドのWebAssemblyは、まったく異なる角度から分離にアプローチします。オペレーティングシステムを模倣するのではなく、WebAssemblyランタイムは顕微鏡のようなサンドボックスとして機能します。マイクロ秒単位で起動し、システムメモリのわずかな割合しか消費せず、すべてのファイルやネットワーク接続へのアクセスが明示的に許可されなければならない、厳格な機能ベースのセキュリティを強制します。ユーザースクリプトが割り当てられたボックス外のメモリに触れようとすると、ランタイムは残りのサーバーをクラッシュさせることなく、即座にそれを終了させます。

初めての動作するプロトタイプを構築することは、私が普段当然のこととして受け入れている基本的な概念を再考することを余儀なくさせました。C#やJavaのようなガベージコレクション言語では、ランタイムが未使用のコンピュータメモリを自動的にクリーンアップするため、データ構造が物理メモリにどのように配置されるかについて心配することはめったにありません。WebAssemblyランタイムはハードウェアに近い場所で動作するため、サンドボックスの壁を越えて情報を渡すために、複雑なオブジェクトをプレーンなバイトストリームに変換する、つまりデータを慎重にシリアライズする必要があります。このエコシステムでのステップスルーデバッグやモニタリングのためのツールも、エンタープライズ開発者が確立されたフレームワークから期待するものよりはるかに未熟です。

これらの学習上のハードルにもかかわらず、クラウドシステムの実用的なアプリケーションは魅力的です。サーバーサイドのWebAssemblyにより、チームは、カスタマーコードがシステム障害のリスクを負うことなく、セキュアにコアビジネスロジックと並行して実行される、拡張可能なプラグインアーキテクチャを構築できます。大型モノリスや複雑なマイクロサービス向けに、コンテナを一夜にして完全に置き換えることはありませんが、サーバーレスタスクやイベント駆動型関数向けに、非常に効率的なツールを提供します。

メインの言語エコシステムの外にある新しいパラダイムを探求する時間を取ることは、エンジニアリングの視点を鋭敏に保ちます。私たちが主要なツールで日常的に受け入れているトレードオフは、コンピューティングの必須の法則ではなく、選択であることを思い出させてくれます。

ブラウザ外でWebAssemblyの実験を始めた開発者の方々にとって、サンドボックス境界を越えたメモリ管理を扱う際に直面した最大の精神的変化やハードルは何でしたか?

webassembly #rust #programming #cloud