Railsを活用したWebサービスが大規模になってきた場合に、最近モジュラモノリスが採用されるのを良く耳にする気がしますが、現状その概要やRailsにおいてどのように実装されているのか、あまり分かっていなかったのでメモ🗒
モジュラモノリスとは?
モジュラーモノリス とは、単一プロセスが別々のモジュールで構成され、それぞれ独立して作業できるものの、デプロ イのために結合する必要があるシステムだ。
Sam Newman著、島田 浩二訳 (2020年12月発行) モノリスからマイクロサービスへ ――モノリスを進化させる実践移行ガイド オライリー・ジャパン
モジュラモノリスとは上記の通り、単一プロセスで動作するアプリケーションを一定のモジュール単位に分割し、それらの依存を分離することでモジュール単位での開発を実現するアーキテクチャのようです。
マイクロサービスとの比較
Webサービスが大規模になてきた場合に採用されるアーキテクチャとしてマイクロサービスがあります。
マイクローサービスを採用することにより、独立したデプロイや柔軟な技術選択を実現できる一方、下記のようなサービス間の通信によるレイテンシの悪化やサービスを跨いだ開発コストの増加といったリスクもあります。
ネットワーク越しのコンピューター間通信は、瞬時には行われない。これは、レイテンシー、 とりわけローカル内の処理をはるかに上回るレイテンシーを気にする必要があることを意味する。 レイテンシーが変動し、システムの動作を予測不可能にすることがあるのを考えると、事態はさら 悪化する。また、ネットワーク障害によってパケットが失われたり、ネットワークケーブルが切 断されたりするという事象にも対処する必要がある。
Sam Newman著、島田 浩二訳 (2020年12月発行) モノリスからマイクロサービスへ ――モノリスを進化させる実践移行ガイド オライリー・ジャパン
複数のサービスにわたる大規模なリファクタリングは面倒で、依存するすべてのサービスにおける変更やデプロイの調整も必要になります。
[翻訳] Shopifyにおけるモジュラモノリスへの移行 - Qiita
モジュラモノリスは、任意のコンテキストで別のサービスではなくモジュールに切り出し、それらの依存性を分離し境界を設けることによって、 各モジュールへの認知負荷を下げるといったマイクロサービスで得られるメリットの一部を享受しつつ、レイテンシといったデメリットを抑制したアーキテクチャパターンだと思いました。
Railsにおける実装パターン
Ruby on Railsにおいてモジュラモノリスのアーキテクチャに関する記事を記載します。(見つけ次第追記)
Shopify
メモ
- ディレクトリ、moduleといった言語レベルでシンプルに境界を表現しているっぽい。依存の分離を行うための仕組みは別途用意して運用している模様。
- Railsのルートディレクト直下に各種分割されたモジュール単位で app 配下(assets, controller, model, view 等)及び test を持つような構成を取っている模様。
- Gemfileとかdatabaseは共有してそうだった。
Rails Engine
メモ
- Railsエンジンを使ってモジュール分割するパターン、Railsエンジンを使うと単体での動作確認とか依存性の分離とかはしやすそう。
- RailsエンジンなのでGemfileとかもモジュール毎に分離しやすそう。
- Railsエンジンを採用したとしてもフロントエンドまわりはbuild結果をルートのRailsアプリのpublic配下にモジュール単位でディレクト切って、そこに配置するみたいなことは検討しないとダメそう
おわりに
モジュラモノリス、あまり今まで実態がよく分かっていなかったのですが調べてみると、やり方はいろいろあれどモノリスなWebアプリケーションを適切なコンテキストの元分割し依存性を分離しましょうということだと理解した。 いずれマイクロサービスにするにしろ依存性を分離することは必要なので、モノリスからの移行先としてモジュラモノリスは有用そうに思った。