見出し画像

ShippioがモノリスからSOAに移行している理由 (Shippio Tech Blog)

※本記事は2022年9月に公開したTech Blogの和訳です。
記事の内容は公開当時の情報です。

記事を書いた人:Johnny Okura
Tech Blog(Medium)はこちら:https://techblog.shippio.io/

本記事のサマリ

ShippioはモノリシックなRailsアプリケーションから分散型のサービス指向アーキテクチャ(SOA)への移行を進めています。これにより、技術スタックに他の言語を容易に追加し、より多くの人材を集めることができるようになりました。また、プロダクトの改善サイクルが遅れることなく、開発効率が向上しました。移行は最初に予想されたよりも3倍の時間がかかりましたが、採用率や開発効率の面で既に利益を見始めています。

移行の動機

Shippioは2021年の秋にSOAへの移行を決定しました。当時、Shippioはさらなるスケールアップを予定していました。1年間でScrumチームの数を倍増し、プロダクトの種類も増やす予定でした。
Shippioは2016年設立、2018年に初めてのプロダクトをリリースし、翌年の11月にシリーズAの資金調達をしました。製品の再立ち上げやカスタマーペルソナの見直しを経て、2021年には売上の重要なKPIを達成しました。プロダクトマーケットフィットの兆しが見られました。それが移行のタイミングでした。

計画どおりの成長を達成するためには、より多くのエンジニアを採用することが不可欠です。また、エンジニアの数が倍増してもスムーズに開発を行うことができる環境が必要です。しかし、多くのスタートアップと同様に、スピードを重視した開発スタイルによって蓄積された技術的負債が将来のスケールアップを妨げる可能性がある状況に直面していました。

以前のアーキテクチャ

移行前のアーキテクチャは上記の通り、モノリシックなRailsアプリケーションのみが存在していました。一見シンプルに見えますが、実際には非常に複雑なアプリケーションでした。

Shippioデータベースのテーブル

これはある時点でのDBテーブルの全体を示すERDです。中央には巨大なテーブルがあります。これは当社のサービスのコアドメインを担っているShipmentテーブルです。正規化をせずに持続的に拡張された結果、80以上のカラムを持っています。一部はJSONタイプであり、全体像を把握するのが非常に難しいです。チームや製品をさらに追加し続ければ、コンフリクトが発生し、効率が低下することが明らかでした。

変更したこと

これらの課題を解決するために、SOAアプローチを採用し、サービスをドメインに分解することにしました。

2022.08年以降の新しいアーキテクチャ

これが新しいアーキテクチャです。Railsアプリに加えて、以下のコンポーネントが追加されました。

  1. Gateway

  2. New 見積もり

  3. Lambda authorizer

  4. AppSync

  5. Gateway:ShippioのバックエンドにはGraphQL APIを提供しています。新しいサービスでGraphQLを使用することになりましたが、クライアントで単一のエンドポイントにアクセスを統合したかったため、Apollo Federationを採用しました。日本では例が少ないですが、Netflixなどの企業が使用していることで世界的に知られています。

  6. New 見積もり:サービスの分割の最初のステップとして、サービスの見積もり機能を再構築しています。このサービスをgolangを使用してゼロから構築しています。GraphQLサーバーを構築するためにgqlgenを使用しています。ただし、Apollo Federation 2の仕様をサポートがなかった為、メンバーがsqlgenにコントリビュートしました。

  7. Lambda authorizer:サービスの分割を考える際に、AuthN/Zは重要なポイントの1つです。マイクロサービスアーキテクチャでは、専用のサービスを作成するのが一般的ですが、私たちはそれほど最適化を行いませんでした。代わりに、Railsアプリケーションから認証ロジックを抽出し、RubyのLambda関数で実行しました。このLambdaを使用することで、後で説明するAppSyncの接続を認可することもできます。これは暫定的なステップであり、Cognitoへの移行を進めています。

  8. AppSync:このサービスはGraphQLのサブスクリプションを処理しています。Apollo Federationの制限により、GatewayではGraphQLのサブスクリプションを処理できませんでした。そのため、AWS AppSyncに置き換えて、アプリ内のチャットや通知表示などのリアルタイム通信にWebSocketsを使用することにしました。単一のエンドポイントを提供することはできませんでしたが、サービスの分割を通じて関心の分離に繋がりました。

移行の際に直面した課題

SOAへの移行は、最初に計画されたよりも3倍の時間がかかりました。2人で2ヶ月かかる予定だったものが、3人で6ヶ月かかりました。移行作業のスコープを過小評価し、途中で作業を追加したことが遅延の原因でした。分散システムでは、アプリケーションを簡略化する代わりに、CI/CDパイプライン、監視メカニズム、認証/認可、開発環境のセットアップ(ローカル、クラウド)など、システムの他の部分に複雑さが吸収される必要があります。これらを詳細に特定することができませんでした。
また、移行プロセス中に特定された問題(例:サブスクリプションなど)のためのバッファもありませんでした。

さらに、移行プロセスに関連する他のインフラストラクチャに関連するタスクを追加しました。最初はterraformを使用してインフラストラクチャの設定を管理していましたが、複雑になりすぎたため、CDKに置き換えました。
これを機に、AWSアカウント設定も複数アカウントに変更しました。CDKのコードがあったため、比較的迅速にプロセスを進めることができましたが、メンバーに変更を伝え、CI/CDパイプラインを設定するのには時間がかかりました。はい、同時にこなしていくにはタスクが多すぎました。

結果はどうだったか

採用や開発効率の面で肯定的な効果を感じていますが、一方で一部の操作が複雑化しました。

現在、Shippioには2つのScrumチームがあります。(注釈:現在は3つのScrumチーム)1つのチームはRailsを使用して顧客向けの新機能を開発し、もう1つのチームはgolangで見積もりシステムを再構築しています。それぞれが独立したライフサイクルで開発しているため、コンフリクトはほとんど発生しません。

また、SOAおよびGolangへの移行は、採用面でも非常にポジティブな効果があると感じています。特に若いエンジニアの中には、新しい技術を使用する機会を得るためにShippioで働きたいという興味を持ってくれる人が多いです。

一方で、システムの運用効率の観点からは、分散システムによるオーバーヘッドがあります。顧客やCSチームからの問い合わせに対応するためにアプリケーションログをチェックすることが一般的ですが、システムが複数のコンポーネントで構築されているため、単一のリクエストを追跡するのが難しい場合があります。

私たちはトレーシングにDatadog APM、およびGraphQLのモニタリングにApollo Studioを使用しています。どちらも有料のツールですが、システムのスケールが小さいため、従量課金は非常にコスト効果が高いです。

将来の課題

Shippioでは他にも取り組みたいことがたくさんあります。ビジネスの観点からは、物流業者向けの新プロダクトの開発が進んでいます。アプリケーションの観点からは、フロントエンドはユニットテストの拡大とTypeScriptへの移行による品質向上に取り組んでいますが、バックエンドはまだ見積り機能の後にどのようにサービスを分割し、複雑で大規模な貿易ドメインを適切に表現するためにどのようなモデルが必要かという全体設計に追いついていません。

Shipmentテーブルはまだ大規模であり、分割の余地がたくさんあります。
開発者の生産性に関しては、クラウドでの作業を可能にする環境の構築や、必要な時だけ実行可能な一時的なQA環境の構築、フィーチャートグルを使ったリリースの制御などの取り組みがあります。

最後に

正直なところ、現時点ではまだSOAの恩恵を100%感じられる段階には達していません。しかし、今後数年のことを考えると、この時期にスケールの基盤を築くことができたことはよかったと思います。スケジュールの遅延がいくつかあったにもかかわらず、このプロジェクトの必要性を理解しサポートしてくれた経営陣や同僚には感謝の気持ちでいっぱいです。

— — — — — —
この記事を読んでShippioで働くことにご興味をお持ちいただいた方は、採用サイトや問い合わせ先からお気軽にエントリー・ご連絡ください。

▼募集中のポジション
https://recruit.shippio.io

▼問い合わせ
LinkedIn: https://www.linkedin.com/company/shippioinc/
HR team e-mail address: shippiohr@shippio.io
— — — — — —


この記事が気に入ったらサポートをしてみませんか?