DDDDbox Tech Blog

建築設計クラウドサービス『DDDDbox』のテックブログ

なぜ自社プロダクト開発にRustを選んだのか

ferris

こんにちは、株式会社AMDlabのDDDDbox事業部で日々開発を行っている鈴木です。

私たちが開発しているWEBBIMは、建物のボリューム検討、建物のモデリング、図面出力といった建築設計における実務作業に役立つ機能を多く搭載した、ブラウザで動く3D BIMアプリケーションです。

「ブラウザでリアルタイムに反応する3D BIMシステムを実現するには何が必要か?」という課題への私たちの回答として、Rust があります。 私たちは、フロントエンド(WebAssembly)とバックエンドの両方でRustを採用することにしました。

カジュアル面談などでもRustに関してよく質問されるので、今回の記事では、WEBBIMの大まかなアーキテクチャと、なぜRustを選んだのか、実際に使ってみてどうだったのかを整理してみようと思います。

目次

  1. DDDDbox-WEBBIMのアーキテクチャ
  2. フロントエンドのRust
  3. バックエンドのRust
  4. Rust採用のトレードオフ
  5. まとめ
  6. 参考文献

DDDDbox-WEBBIMのアーキテクチャ

まず、WEBBIMのシステム構成を簡単に説明します。

graph TD
    subgraph フロントエンド
        B[React]
        C[WASM Rust]
        B <--> C
    end

    B <-->|GraphQL| D[BFF Go]
    D -->|gRPC| E[バックエンド Rust]
    D -->|REST| G[バックエンド Pythonなど]
    E --> F[(Database)]

フロントエンドは、ReactからWebAssemblyにコンパイルされたRustコードを呼び出して何らかの計算結果を取得し、その結果をThree.js(react-three-fiber)で描画する、といった流れです。 大幅に負荷の高い処理はWebWorkerを使って処理しています。

バックエンドは、メインのDBに接続するサーバーがgRPCサーバーになっており、こちらはRust(tonic)を使用しています。

通信部分は主にGraphqlとgRPCとWebSocketを使用しており、一部にRESTも使用しています。

フロントエンドのRust

WebAssemblyの概要

WebAssemblyは、コンパクトなバイナリー形式の低レベルなアセンブリー風言語で、ブラウザ上でネイティブに近いパフォーマンスを実現する技術です。2025年現在、主要ブラウザでは標準サポートされています。

WebAssembly はブラウザにバイナリ形式で配布されるので、ブラウザは「テキスト(JS)」をパースする必要がありません。 高速にかつ高効率でコンパイルできるため、CPUを多く使う処理ではJavaScriptに比べて高いパフォーマンスを発揮します。

Rustを選んだ3つの理由

1. GCガベージコレクション)問題の回避

3Dモデリングのシステムを作るということで、メモリ管理が重要になってきます。

いくつかのプロトタイプを作成していく中で、一番の課題となっていたのが、JavaScriptガベージコレクションGC)による予測不能な一時停止でした。

例えば、数百万頂点の建物モデルを操作している最中に、GCが実行されると数百ミリ秒から数秒の停止が発生します。これは3Dビューでの操作体験を完全に壊してしまいます。

そこで、本格的な開発に入る前にWebAssembly(Rust)について技術検証を行いました。

その検証結果として、Rustは基本的にビルド時にメモリ管理が完結し、実行時のGC停止は発生しないため、フレーム落ちのない滑らかな3D操作が実現できるという結果が得られました。 (なお、2025年にはWasmGCが標準化されましたが、Rustは元々GCを必要としない設計です)

2. ネイティブに近いパフォーマンス

Rustで書かれたコードをWebAssemblyにコンパイルすると、C/C++に匹敵する実行速度が得られます。

Rustはコンパイル時に余計なランタイムやGCガベージコレクション)がなく、メモリ管理も静的で高速です。

複雑なジオメトリ計算やブーリアン演算も快適に動作するようになり、ブラウザとは思えないくらいの速度が出ます。

3. メモリ安全性

Rustの所有権システムは、コンパイル時にメモリ安全性を保証します。バッファオーバーフローやダングリングポインタといったバグを未然に防いでくれます。

特にWebAssemblyのサンドボックス環境では、メモリ安全性が重要です。Rustのコンパイラが静的に安全性を検証してくれるため、実行時エラーのリスクが大幅に減少します。

ReactとThree.jsとの統合

私たちが今つくっているアーキテクチャでは、UIはReactで構築し、3D描画はThree.js(react-three-fiber)を使用しています。react-three-fiberを活用することで、ReactのコンポーネントモデルとThree.jsのレンダリングを効率的に統合できます。

Rustで計算したジオメトリデータは、SharedArrayBufferを使ってゼロコピーでJavaScriptに渡し、react-three-fiberで描画します。この仕組みにより、大量のメッシュデータを効率的に扱うことができます。

実例プロジェクト

Rust(WebAssembly)を用いたCAD系のアプリケーションとしては、複数の実例があります:

  • CADmium1: Rust製B-repカーネル「Truck」を使ったオープンソースのブラウザCAD。現在はプロジェクトが終了している。
  • Chili3D2: OpenCascade(OCCT)をWebAssembly化したブラウザ3D CAD。リボンUIとパラメトリックモデリングを実現
  • Graphite3: Rust+WASMによる2D画像編集ツール。複雑な画像処理をブラウザで快適に実行

また、Figmaも同様のアーキテクチャを採用しているそうです。

バックエンドのRust

前述の通り、バックエンドのサーバーはRustを選定しています。

選定時に、他の有力な言語候補としてはGoがあったのですが、以下で説明するいくつかのメリットや背景があったことで、Rustを選定しました。

WASM側とのコード再利用

建物の面積計算や体積計算、シーン内にあるオブジェクトの復元や操作といったジオメトリに関わるロジックは、フロントエンドのみならずバックエンドでも必要になる可能性がありました。 バックエンドで建物データを復元して、データ編集を行いたい、などの場合です。

この時にバックエンドもRustであれば、同じコードベースを共有でき、開発効率を上げることができます。

BIMの大量メタデータに対応

BIMアプリケーションは、建物の構造、材料、寸法、部材など膨大なメタデータを扱います。1つの建物プロジェクトで数百MBから数GBのデータを処理することも想定しています。

それらの大量データを扱う可能性がある中で、GCに頼らないRustの厳格なメモリ管理により、メモリリークやダングリングポインタなどのバグを未然に防ぐことができるRustは非常に安心感があります。

この点も重視しました。

AI支援開発との相性

最近では、Claude CodeやCodex などを使ってコードを書くことが増えましたが、選定時はGitHub Copilotを主に使っていました。

当時は現在ほどのコード生成AIではありませんでしたが、それでもAIが生成したコードに対して、動的型付け言語では実行時まで発見されないバグも、Rustではコンパイラがビルド時に厳格なチェックを行い、メモリの扱いのエラーやNull参照などを検出できるのは大きなメリットでした。

独自の所有権システムによるメモリ安全性は、AIが生成したコードに対しても保証されます。

私自身、全てのプログラミング言語に精通しているわけではありませんが、Rustのビルドが通ったときの安心感は、経験してきた他の言語と比較すると圧倒的に高いです。

RustはこういったAIツールとの相性も良いです。

開発チームの知見

私たちのチームには、Rustにある程度馴染みのある開発者が確保できていました。また、WebAssembly側でRustが必須である以上、チームとしてRustの知見を蓄積していく方が長期的に有利だと判断しました。

一度学習すれば、フロントエンドとバックエンドの両方で活用できるため、学習投資の効果が高いとも言えます。

Rust採用のトレードオフ

ここまで良い話ばかりしてきましたが、Rustにも課題はあります。

学習曲線が急

Rustの最大の課題は、所有権、借用、ライフタイムという独自の概念を習得する必要があることです。

特にJavaScriptPythonから来た開発者にとって、メモリ管理を意識する必要があることは大きな違いです。初期は「コンパイラと戦う」体験をすることになり、最初の数週間は生産性が低下することを覚悟する必要があります。

最近ではAIにある程度教えてもらうことも可能なので、このデメリットは少し軽減されています。

ビルド時間が長い

大規模プロジェクトでは、ビルド時間が長くなりがちです。そのためCI/CDなどでの時間が長くなり、PRマージやデプロイの待ち時間が長くなります。

緩和策としては、高速なリンカ(mold、lld)への変更や、プロジェクトの分割、インクリメンタルコンパイルの活用などがあります。これらを組み合わせることで、実用的な範囲に収めることが期待できますが、他言語と比較するとやはりデメリットであることは否めません。

エコシステムの成熟度

最近のニュースでGoogle Cloud用 Rust SDKが利用可能になるなど、Rustのエコシステムは急速に成長していますが、特定分野ではまだライブラリが不足しています。

私たちのケースでは、BIM/CAD関連の幾何学系のライブラリは独自で実装しなければいけない部分がありますし、一部のロジックはPythonサーバを使うなどして開発効率が落ちないように工夫しています。

まとめ

今回は、DDDDbox/WEBBIM開発でRustを採用した理由と、実際の経験をまとめてみました。

初期の学習コストは高いですが、一度習得すれば、ビルドが通ることによる大きな心理的安心が得られ、長期的な開発効率は向上します。

パフォーマンスと安全性の両立、そしてWebAssemblyでのモジュールとバックエンドモジュールの連携などを考えると、Rustは戦略的に正しい選択だったと確信しています。

AMDlabでは、このような建築×3D×Rustの開発に一緒に取り組むエンジニアを募集しています!

少しでもご興味をお持ちいただけましたら、カジュアルにお話するだけでも大丈夫ですのでお気軽にご連絡ください!

中途求人ページ: https://www.amd-lab.com/recruit-list/mid-career

カジュアル面談がエントリーフォームからできるようになりました。 採用種別を「カジュアル面談(オンライン)」にして必要事項を記載の上送信してください!

エントリーフォーム: https://www.amd-lab.com/entry


参考文献


  1. CADmium - GitHub - Rust製のオープンソースブラウザCAD。
  2. Chili3D - OpenCascadeをWebAssembly化したブラウザ3D CAD。
  3. Graphite - GitHub - Rust+WASMによる2D画像編集ツール。