Language🛠️ 開発体験(DX)

STORES

STORES、Goで作られたシステムをRuby on Railsへ「逆方向」移植中

GoRuby on Rails

社内のGoとRubyの習熟度・エコシステム投資の差が広がり、Goの高速性・省メモリの利点も活かせていなかったため、GraphQL stitchingでサービスを止めずに段階的にRailsへ移植している。

課題

社内のGoとRubyの習熟度・エコシステム投資の差が広がり、Go側の開発基盤が未成熟だった

アプローチ

GraphQL stitchingで個別のquery/mutationを細かい単位でRailsへ置き換える

効果

サービス無停止でベース実装が完了し、個別の移植を継続中

背景

STORESでは店舗運営関連プロダクトの統合プロジェクトが進行しており、その一部としてGoで作られたシステムをRuby on Railsへ移植している。言語選定の見直しに至った理由は複数ある。まず、社内のバックエンド開発におけるGoとRubyの習熟度・エコシステムへのリソース投入の差が大きくなってきたこと。次に、Go側の開発基盤が整備されておらず、一般的なWebフレームワークであれば最初から提供されている機能が存在しないこと。さらに、一般的なWebアプリケーションにおいては極端な高負荷にならない限り言語の遅さがボトルネックにならないため、Goの高パフォーマンスと省メモリのメリットを活かせていなかったこと。加えてテスト負荷が高く、型による安全性よりもテスト不足によるリスクの方が大きいと判断されたこと。最後に、移植先システムから移植元システムの情報にアクセスしたい場面が非常に多く、API経由のアクセスが開発効率を落としていたことが挙げられている。

移行のプロセス

移植はサービスを停止させずに進める方針が取られている。移植元のシステムがGraphQLを採用していたため、GraphQL stitchingを用いて個別のqueryやmutationを細かい単位で段階的にRails側の実装へ置き換えていく形を採った。

  • サービス無停止で、細かい単位での段階的な移植を行う
  • GraphQL stitchingにより、移植済みのquery/mutationから順次Railsへルーティングする
  • 移植元システムと移植先システムのデータを扱うため、Railsに組み込まれている複数データベース対応の機能を利用する

これにより、統合対象のシステム同士でAPIを介さずに情報へアクセスできる構成を目指している。

結果

記事の執筆時点では、移植のためのベース実装が完了し、個別のmutationやqueryの移植作業を粛々と進めている段階にある。具体的な数値は公開されていないが、GraphQL stitchingによってサービスを止めることなく段階的な置き換えが進行しており、詳細については後続の記事で紹介される予定だとしている。

学び

言語そのものの性能特性よりも、組織内の習熟度・開発基盤の成熟度・システム間の境界の引き方といった開発体制側の要因が、実際の開発効率を左右するという判断が示されている。一般的なWebアプリケーションでは言語の実行速度がボトルネックになりにくい、という前提に立った選定が行われた点が特徴的である。

2025-06-27
他の事例も見る