2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
バックエンドをRustに書き換えるのってどれくらいかかるんですか?(全1記事)
リンクをコピー
記事をブックマーク
松本健太郎氏:私からは、まさにバックエンドをRustに書き換えるということで、実例報告的なことをやりたいと思っています。よろしくお願いします。
本日は、どういうことをしたかというところと、それをやるにあたっての意思決定。実際にやってみてどういうところが問題になったか。あとは、特にTypeScriptとの連携周り、どういう工夫をしたかをお話しできればと思います。
自己紹介です。松本健太郎と言います。
今回は、まだプロトタイプ開発中で、たくさんのお客さんがついているアプリケーションではありません。もともとNext.jsでアプリケーションが書かれていて、バックエンドがMySQLというものを、APIの部分だけactix-webを使った、Rust実装に変えました。
APIの本数は10本ぐらいで、そんなに複雑なロジックがあるものではありません。データベースからデータを取ってきたり、データベースにデータを入れたりするシンプルなものでした。
「そもそもなんで書き換えるの?」という話が出てきたのか。初期開発をしていたNode.jsに詳しい業務委託のエンジニアの方がチームを抜ける時に、次はどういうメンバーを入れて、どういう言語で開発していくのかを話すタイミングがありました。
estie(※株式会社estie)としてはRustに力を入れていきたいタイミングでもあったし、そもそもRustが書けるエンジニアのkenkooooさんが社内にいました。私もわりとリソースを入れられる状態だったので、候補に上がってきたのかなと思っています。
一応他の言語応検討はしたのですが、TypeScriptでいくのか、Rustで書き直すのかを中心に議論を進めました。estieでは、各プロダクトでどんな言語を使っていくか、けっこう現場のメンバーに権限委譲されています。チームのメンバーを中心に、メリット・デメリットを整理して、CTOや他のチームのエンジニアからも意見をもらいながら整理していきました。
最終的には、長期的な視点を持って意思決定をしました。特にアプリケーションの開発効率や安全性では、Rust優位の面もあります。また、エンジニア採用の観点から見ても、Rustのほうが興味を持ってもらえるのではないか。TypeScriptが書けるエンジニアはたくさんいるけれど、Rustが書ける職のほうが採用しやすいのではないかという仮説もありました。
主に3つ、これが解決できるだろうかという観点がありました。1つ目が、型定義が二重管理になってしまうのではないか、という問題です。Rustで実装されたAPIをTypeScriptから呼ぶと、両方の言語で型定義が必要になります。Rust側をエンジニアが実装をして、TypeScript側でもエンジニアが実装するということは避けたいと思っていました。
これはRustの構造をベースにTypeScript側のコードを自動生成できる仕組みを入れることで解決しました。後半で説明します。
次に、Rust用のコンテナが必要になる問題です。Node.jsだと1つのコンテナでよかったのですが、Rust用のコンテナがもう1個必要になるのではないかという指摘がありました。これは、kenkooooさんのチームでも運用が始まっていて、それと同じようにいけるという判断をしました。
もう1つ、Rustが書けるエンジニアをアサインできるのか、という問題がありました。これは、比較的興味を持っている人がアサインできればキャッチアップしてもらえそうだな、という感覚がありました。
前職でも、興味のある方に入ってもらえれば、キャッチアップしてすぐに立ち上がってもらえていたし、estieのslackにはRustの質問に答えるチャンネルがあるので、そういうところから進めていってもらえるのではということで、ここもクリアになりました。
「実際に書き換えてみましょう」というフェーズをお話しします。実際のところ、実稼働丸3日ぐらいで再実装できました。着手前は、5日〜7日ぐらいかかるかなと思っていたのですが、思いのほかkenkooooさんのチームのノウハウを活かすことができ、同じようなスタックで進められました。
すでに「この組み合わせでけっこういい感じに動くぜ」というのが明らかになっていて、必要なものが実装されていたので、それを流用できるなど、メリットが受けられる状態になっているな、と感じました。
一方で、プロトタイプをRustで書くこと自体の是非がまだわかっていない状態です。これは時間をかけて実際に運用を回してみないとわからないのかな、と思っています。
保守しにくいコードを書きにくくする効果はあると思うのですが、何回も書き直したり、微修正を繰り返していったりする中で、どれぐらいそこが守られていくのかを、今後は確かめていきたいと思います。
フロントエンド側との連携についてお話をします。先ほどもお伝えしたとおり、Rust側でAPIを実装すると、リクエストの型とレスポンスの型を定義する必要があります。
TypeScript側でもAPIのリクエストとレスポンスの型を書く必要がありますが、両方人手でやるのはなかなか大変なので、なにかうまい方法を入れたいなと思いました。
別のプロジェクトではts_rsというモジュールを使っていたのですが、クライアントのコードを生成するOpenAPIを使うために、今回のプロジェクトではpaperclipというクレートを導入しました。
先にts_rsの説明をします。非常にシンプルなモジュールで、ts_rsの「ts」を融通してアトリビュートを書くと、そのRustで書いた構造体がTypeScriptのコードとして出力される、というものです。
実際に、この左側のRustのコードを書いてcargo testを打つと、bindings/User.tsというファイルが自動で生成されて、RustのstructがTypeScriptのコードとして右図の内容が書き込まれます。簡単に動かせるので、興味ある方はお手元で動かしてみてもらえればと思います。
ただ、もうちょっと、いろいろとやってほしいんだよなあというところがあります。OpenAPIの定義ファイルを作れば、OpenAPIの定義ファイルからTypeScript側でやりたいことができるということで、今回はpaperclipという別のクレートを使用しました。
先ほどkenkooooさんの発表の中で、「actix-webは非常に少ないコード量で実装ができていいね」と話されていましたが、そのactix-webの、マクロを置き換えるようなかたちでpaperclipのものを使うと、最終的にOpenAPI形式の定義が自動生成されるというものです。
上から順番に見ていくと、paperclip由来のマクロや関数を融通して、構造体にはこれがAPIのものであるという印を付けていきます。関数はこちらですね。構造体と関数で付けるものが違いますが、それを付けていきます。
これまではサービスを書くだけでしたが、その前後にAPIをラップしてやるのと、それをどのエンドポイントで出力するのかを書きます。(スライドを示して)これぐらいの差がありますが、だいたいactix-webの記法のまま、同じように書けます。
これをビルドすると、先ほどのエンドポイントでswagger、OpenAPIの定義ファイルを出力できます。これは非常に便利かなと思います。
もうちょっと大きくなって、クレートを分割した時とかにどう書けるのかを、この先調査して使っていくことになるのかな、と感じています。
では今回のまとめです。私たちのチームは将来にベットするかたちで、まずはRustで書いてみるという実験のコストを支払ったと言えます。
今回のイベントは、多くの方に集まってもらっていて、仕事でRustを書きたいエンジニアもけっこういるのかなと思っているので、そういう方はぜひチームに入ってもらえればうれしいです。
社内にいくつもRustで開発しているチームがあるのも魅力的だと思います。スタックが共有できたり、ノウハウを共有できたりというところで、効果がすでに現れてきていると思っています。
後発の私たちのチームは、まだ恩恵を受けているだけの状態なので、これから他のチームに波及効果を出していけるようにがんばりたいです。
最後に。チームメンバーを募集しています。MeetyのURLを作っているので、ご興味を持った方がいれば申し込んでほしいと思っています。以上です。ありがとうございました。
関連タグ:
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05