見出し画像

Web Assemblyのエンタープライズアプリケーション開発での使いどころ

こんにちは!
Buildチームの佐々木です。寒い日と暖かめの日が交互に来て体調を崩しがちな季節ですが、お元気でしょうか。

さて、最近はWebAssemblyが何かと話題ですよね。

Google Meetのバーチャル背景 や、Amazon Prime Videoのプレイヤー に使用されている例は有名ですが、
最近では、Dockerコンテナをwasmにコンパイルしてブラウザ上で動かせるようにした り、それをWeb版VSCodeにつなげてローカルマシンのターミナルとして動かしたり など、もはやなんでもありみたいな状況になっています。(ちなみに、DockerコンテナやVSCodeの例は、NTTの徳永さん(Xアカウント: @TokunagaKohei )が実装した手法です。やってみようと思うのも、それを実現してしまうのも本当にすごいと思います。)

さて今回は、実際にエンタープライズアプリケーション開発でWebAssemblyが必要になりそうな場面とその使い方、注意すべき点などをご紹介したいと思います。

WebAssemblyとは

そもそもWebAssembly("wasm"とも呼ばれる)とは、ブラウザ上の仮想マシンでネイティブバイナリを動かせるようにしましょう、という技術です。

対応状況

以下の対応状況のように、モバイルを含む多くの主要なブラウザで使えます。

WebAssemblyの対応状況(Can I use … より)

WebAssembly を使うメリット

WebAssembly を使うメリットとしては、以下のような点が挙げられます。

  • 単体での実行速度が速い

    • 画像処理やAIでの推論など

    • JavaScriptと行ったり来たりするとめちゃ遅くなるので、可能な限りやり取りが減るように頑張る必要があります。

  • ネイティブの実装を使いまわせる

    • C/C++ ( emscripten ), Rust ( wasm-pack ), Go ( tinygo ) をはじめとして、Unstableなものを含めると色々な言語をwasmにコンパイルできます。( https://github.com/appcypher/awesome-wasm-langs

      • 実際には速度を追求したい場合が多いと考えられるので、RustやC++で書いていくことになると思います。

実際の開発での使いどころ

実際に開発で使う際には、どのような使いどころがあるのでしょうか?

実際のところ、WebAssemblyの処理速度はクライアント端末の性能に依存する部分が大きく、安定した処理速度を求める場合はサーバサイドでやったほうが良かったりします。

しかしながら、

  • リアルタイム性が必要かつ、高い処理能力が必要な場合

    • 「いちいちHTTP通信を飛ばしていては間に合わない」かつ、「通常のJavaScriptでは重過ぎる」処理を、エッジで完結させることで解決できるかもしれません。

      • 画像処理とか、GUIのあるアプリケーションとか

  • 遠隔地や移動体など、通信が途切れることのある場合

    • サーバ側で処理できない場合にも、クライアント側で同じ処理を行うことができます。

上記のようなケースでは、WebAssemblyを用いることで問題を解決できるかもしれません。

注意すべき点

WebAssemblyは便利ですが、RustやC++はエンジニアならだれでも書けるわけではありません。一度作ってしまうと、保守や引継ぎをしていくのが大変になりがちです。
また、現時点の標準的なツールセットで作っても、WebAssemblyのエコシステム自体がまだまだ発展途上のため、将来的に作り直したくなるかもしれません。

また、先述の通り、処理速度はクライアント側の端末の速度に依存します。
社内での利用やIoTなど、ある程度スペックが統一されている場合は取り入れやすいですが、不特定多数のユーザが利用する場合は入念に設計やテストを行う必要があります。

どのようなユースケースにしても、まずは素のJavaScriptや普通のサーバサイドAPIで実現できないかを検討した上で、実装に移すのが良いでしょう。

まとめ

WebAssemblyを使うことで、クロスプラットフォームで高速に動作するWebアプリケーションを実現できます。
とはいえ、WebAssemblyでなんでもできる!とワクワクして逸る心は一旦抑えて、まずそれ以外の手段で実現できないかを考えた上で実装していく必要があるでしょう。

Buildチームでも、従来からのフロントエンド・バックエンドAPIを用いたWebアプリケーション開発を基本としつつ、WebAssemblyでのエッジ処理が必要な案件にも対応できるよう、社内での開発案件で用いてみたり、社内勉強会などで取り上げてエンジニア同士で理解を深めています。

Buildチームでは、WebAssemblyが好きなエンジニアも募集中です。
一緒に働くことにご興味があれば、ぜひカジュアル面談でお話ししましょう!


この記事が参加している募集

仕事について話そう

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!