BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース WebAssemblyでコンテナレスの未来を築く - WebAssemblyサミットでのKevin Hoffman氏の講演

WebAssemblyでコンテナレスの未来を築く - WebAssemblyサミットでのKevin Hoffman氏の講演

原文(投稿日:2020/05/14)へのリンク

Capital Oneの分散システムエンジニアであるKevin Hoffman氏は、WebAssembly Summitで、WebAssemblyの現在の最先端技術と、それを使って今日構築できるものについて話し合った。Hoffman氏は、WebAssemblyモジュールがクラウド、エッジ、IoTおよび組み込みデバイスでのイミュータブルデプロイメントの事実上のユニットである、コンテナレスの未来をそっと見た。

Hoffman氏は、ブラウザでのWeb Assemblyの主な利点として、速度、小さなフットプリント、セキュリティモデル、開発者の生産性、および迅速で継続的なデプロイメントについて言及することから始めた。これらの利点は、セキュリティが特に重要なクラウド環境でさらに大きくなる:

ワークロードが改ざんされていないことを確認したいと思います。私たちは、出所、所有権の連鎖を証明できるようにしたいと考えています […]。メモリサンドボックスとメモリ分離は、クラウドで機能します。

Hoffman氏は、WebAssemblyの特性をさらに説明した。WebAssemblyファイルは、自己完結型のポータブルファイルである。マイクロサービスは2MBまで小さくすることができる。WebAssemblyは安全で、バッファオーバーランの影響を受けない。WebAssemblyホストは、モジュールが実行できる/実行できないことを決定する。ハッシュや署名などのメタデータは、カスタムセクションに配置できる。分離されたメモリサンドボックスは、機密データを漏えいさせたり、盗み出したりすることはできない。WebAssemblyは移植可能である。同じファイルを、ブラウザ、クラウド、組み込みデバイスなど、ホストが存在する場所ならどこでも実行できる。コードは、OS、プロセッサ、およびプラットフォームに依存しない。WebAssemblyはコンテナを必要としない。ただし、Hoffman氏は次のように警告した:

それを作るとポータブル性に優れています。ポータブルになりました。仕様ではポータブルであることが求められていますが、コミュニティとして、私たちは簡単にそれを台無しにすることができます。そのため、今後はWebAssemblyの移植性の利点を妨げるようなことは何もしないようにする必要があります。

WebAssemblyはポリグロットである。ホストランタイムとWasmモジュールの言語は分離されている。このモジュールは、Rust、Go、Zig、AssemblyScript、C、C++など、ほぼすべての言語で記述できる。ただし、現在のsyscall/js実装はJavaScriptランタイムの存在を前提としているため、警告がGoに適用される

Hoffman氏は引き続き、ブラウザの外部でWebAssemblyを実行する方法をリストし、ランドスケープを低レベル、中レベル、および高レベルのランタイムに分割した。

低レベルのランタイムには、インタープリタとコンパイラの両方が含まれている。このカテゴリには、wasmtimewasmerwasm3wasmiなどのホストが含まれる。ランタイムの広範なリストはGitHubにある。

低レベルのランタイムを使用するかその上に構築するのが、中レベルのランタイムである。Hoffman氏は、waPCwascapという2つのオープンソースプロジェクトについて言及した。

waPC (WebAssemblyプロシージャコール用) は、双方向の関数呼び出し、任意のバイナリペイロードを備えている。したがって、waPCを使用すると、ホストランタイムとWebAssemblyの間で情報をやり取りしたり、数値引数のみをサポートするというWebAssemblyの制限を回避できる。

さらに、引数の受け渡しは、メモリに依存しない方法で管理される。どちらの側も、相手側のメモリ割り当てパターンを認識していない。インターフェイスタイプ (相互運用性のためのWasm提案)、Emscripten (C/C++)、およびwasmbindgen (Rust) は、ホストがゲスト内にメモリを割り当てることを許可することによって機能する。つまり、相互作用はステートフルである。ホストがデータのメモリ割り当てを要求してからクラッシュした場合は、クラッシュ前とまったく同じ状態でWasmインスタンスを再構成するリカバリメカニズムを構築する必要がある。Hoffman氏は、ゲストとホストの境界を越えてメモリを明示的に割り当てたり解放したりすることは、クラウド対応できないだけでなく、潜在的なバグやメモリリークの大きな原因になると警告した。したがって、waPCはステートレスになるように設計されている。

高レベルのランタイムの一部として、Hoffman氏はwaPCとwascapの上に構築されたwaSCCについて言及した:

開発者には、Webサービスまたはマイクロサービスと機能を、セキュリティで保護され署名されてから動的に機能にバインドされるWebAssemblyモジュールにコンパイルされた純粋なビジネスロジックとして構築する必要があります。[それ]は、メッセージブローカ、HTTP、Key-Valueストアなどの非機能要件に費やすすべての定型文を取り除きます。すべてが動的に[バインド]されます。WebAssemblyモジュールの移植性と小さなサイズを活用できます。

現時点では、GoがWebAssembly仕様に準拠するようになり、Go SDKを使用することを視野に入れて、ホストとゲストはRustで記述される。

Hoffman氏は、巨人の肩の上に立つことによって達成された進歩に関するIsaac Newton氏の引用を使用して、WebAssemblyコミュニティが独自の肩を構築しなければならない可能性があることを認めた。より多くのツールが必要であり、コミュニティは教育、ドキュメント、開発者の経験などに取り組む必要がある。

Hoffman氏は、各ランタイムレベルでのツールのデモンストレーションで締めくくった。これは、プレゼンテーションの最も重要な部分であるといわれた。最初のデモ (低レベルのランタイム) は、S式に基づいたWebAssemblyテキスト形式を使用したソースコードで2つの32ビット整数 (i32) を追加する単純な関数の機能である:

File: add1.wat
(module
  (func $add (param $lhs i32) (param $rhs i32) (result i32)
    get_local $lhs
    get_local $rhs
    i32.add)
  (export "add" (func $add))
)    
> wasmtime add1.wasm --invoke add 2 2
4

講演の最後のデモで、Hoffman氏は、クラウドでWebAssemblyを使用して開き、コンテナでは利用できないことの可能性を説明する。Hoffman氏は、クラウドでサービスとして実行されているWebAssemblyモジュールが、新しいリソースをプロビジョニングしたりリクエストをドロップしたりすることなく、別のバージョンとライブスワップされていることを示している (ダウンタイムゼロのデプロイ)。Hoffman氏は、サービスで使用されている保存されたKey-Valueを、壊滅的なサービス障害を引き起こすことなくホストランタイムから削除する方法を示した。Hoffman氏はさらに、Key-Valueストアをライブスワップし、次のようにコメントしている:

[Key-Valueストアの削除を参照] ホストは適切なエラーメッセージを表示できるほど十分に稼働しているため、クラスタは、ダウンストリームのサーキットブレーカがあるかどうかのヘルスチェックに失敗したことを壊滅的な障害ではなく応答で認識します […]
[Key-Valueストアスワップを参照] ホストを停止することなく、ビジネスロジックのライブ更新を実行でき、任意の機能プロバイダのライブスワップを実行できます。

追加の技術的な詳細と完全なデモを含む完全な講演は、WebAssembly Summit Youtubeチャンネルで入手できる。

WebAssembly Summitは、2020年2月10日にSilicon Valleyで開催された。WebAssembly Summitは、WebAssemblyに関するすべてのことに関する1日のシングルトラックカンファレンスである。

この記事に星をつける

おすすめ度
スタイル

BT