EmotionTechテックブログ

株式会社エモーションテックのProduct Teamのメンバーが、日々の取り組みや技術的なことを発信していくブログです。

Rustでマイクロサービス開発はじめました

はじめに

こんにちは、テックリードのかどたみです。

「冷やし〇〇はじめました」の幟が街を彩って久しくも、まだまだ暑い日が続きますね。 突然ですが、皆さんは今夏新しくはじめたことはありますか? 弊社ではタイトルの通りRustでマイクロサービスの開発をはじめました。

この記事では、マイクロサービス化やRustに至った考えとRustで開発をしてみた感想を述べたいと思います。

なぜマイクロサービス化するのか?

 弊社ではサービス開始当初からRuby on Railsを用いて開発が進められ、現在でも機能の追加が続いています。モノリスとしてどんどん大きくなっているのですが、大きくなることによって以下のような課題が出てきています。

  • 新しいメンバーがコードを把握するのにかなり時間を要する
  • 改修の影響範囲が大きくなり、見積もり難度が上がっている
  • テストやビルドに時間がかかり、細かな修正でもリリースのコストが高い
  • 新しい技術に挑戦しづらくなり、メンバーの成長が鈍化していく

これらの課題を解決するためにマイクロサービスの検討を始めました。 もちろんマイクロサービス化には様々なデメリットも有ることは承知しています。

そのデメリットを踏まえた上でもチームとしてはメリットのほうが大きいと思いますし、デメリットによって発生する課題を解決することによる成長もメリットに含まれると判断し、マイクロサービス化をはじめることにしました。

なぜRustなのか?

 まず、ざっくりとした分類として静的型付け言語にチャレンジしていきたいというのが有りました。弊社のフロントエンドにはTypeScriptを利用しているのですが、やはりコンパイルしないと動きすらしない静的型付け言語の方が個人的には安心できます。また、既存のプロダクトが動的型付け言語のRubyであるため、異なる性質の言語で知見を貯めたり、文化に触れることでの成長も促進できるのではないかという仮説のもと静的型付け言語を選択しました。その段階でRust, Go, Scala, TypeScript(Node.js)が候補として挙がっていました。

 次の観点としてはインフラ寄りのSREが勉強するモチベーションが上がるかという点です。マイクロサービスを運用していくということでかなり管理対象が増えてしまうSREチームですが、せっかくSREをしていただくのであればバックエンドのコードも読みやすくインフラ業務でも知見になる言語の方が良いと思います。その観点でTypeScriptとScalaは除外し、インフラツールでも幅広く利用されているRustかGoの二択になりました。

 RustかGoかという二択の中で、特に速さが謳われているRustは魅力的でした。弊社のプロダクトはアンケートを収集して分析につなげるものなのですが、インセンティブ付きアンケートの大量配信時にかなりの高トラフィックとなりサービス提供が不安定になることが課題となっています。負荷を減らすという観点でプログラムの速さはとても重要です。また、我々は設計を蔑ろにした結果痛い目を見てきた過去があるので、設計を考える上で重要な抽象化において発生するメモリの使用もゼロコスト抽象化によって抑えられることもかなりメリットでした。 また、自分の観測範囲においてはRustのほうが勢いがあるように感じました。GoogleFacebookといった世界規模のテックカンパニーが利用していたり、最も愛されている言語1位であるという事実もあり、これから勉強をする上での個人的なモチベーションになりやすそうだったというのもあります。これらの観点を踏まえて弊社のマイクロサービス化はRustで始めることにしました。

実際Rustを使ってみて

 特性として例外がなかったり、traitの示すものが他の言語と違ったりしますが、他のたくさんの言語を参考に作られているということも有り、ラムダ式などの便利な構文は一通りサポートされていますし、構文や書きっぷりの面で違和感はなく、かなり書きやすい言語だなと思います。エディタのプラグインやRust自体のformatterもとても良くできているので、規約をわざわざ作らなくても一定のレベルのコードが書けると思いました。ただ、やはり所有権については意識しておかなければならず、ただ動くコードを書くだけだと、メモリを浪費してしまうコードになる危険性はあると感じます。そこはしっかりレビューをしていかなければならないですが、実行速度と安全性を手に入れるには安い対価だと思っています。

 留意点として2021年8月現在では、まだバックエンド開発のノウハウが体系化されていない様にも思われます。特にテストに関してはxunit系やテストデータを作成できるcrate(Rustのライブラリの総称)がメンテされていなかったり、フレームワーク自体のドキュメントにテストに関する記述が不足しており、開発を始めるにあたって整備するのにかなり手間がかかる印象です。それでも整備してしまえば、開発に集中できるので初期コストとしては許容範囲かなと思います。

おわりに

いかがでしたでしょうか?

今回はマイクロサービス化とRustを選定した理由をお話させていただきました。まだ開発段階で本番運用までは至ってませんが、Rustはかなりパワフルで魅力的な言語であると思います。概念なども学んでいて楽しい言語なので、読者の皆様も是非一度学んでみてはいかがでしょうか?次回以降設計やテストについて弊社のRustでの開発方法を共有できればと思います。

Emotion Techでは顧客体験、従業員体験の改善をサポートし、世の中の体験を変えるプロダクトを開発しています。プロダクトに興味のある方、Rustをつかって「イキイキ」と働けるチームでプロダクトをより爆速にしていきたい方がいらっしゃいましたら、ぜひ採用ページからご応募をお願いいたします。

hrmos.co

hrmos.co

hrmos.co