Closed5
Railsでのモジュール分けをどうするか検討する会
Railsを使う上で標準のMVCだけではアプリケーションの規模に比例して、
Fat modelになったりやServiceがたくさん作られたり、
それらが密結合となっていることでバグの温床・改修が難しい・影響範囲がわかりにくいという問題がある。
それをRailsが提供しているRails Engine (公式ガイド)などをつかうことで解決したいが、何が良いのかを検討する。
今回管理画面とAPIを提供するRailsアプリケーションを作りたい
Rails Engine
- ミニチュア版Railsアプリケーション ... Railsとほぼ同じ機能のもの
-
rails plugin new XXX
を実行するとroot直下に作成される - Engine, Gem といった形で切り出すことでBundlerがモジュール間の依存関係を検出できる
- ただし、railsでgemをロードするとどこでも呼び出せてしまうので、自身と依存先だけロードするような仕組みを設ける必要がある
- routingで
/blog
は別のサービスとして切り出したいなどの場合に向いている機能?
--full
と--mountable
の違い
ここがわかりやすかったが以下にまとめておく
-
isolate_namespace
があるかないか
full
module Full
class Engine < ::Rails::Engine
end
end
mountable
module Mountable
class Engine < ::Rails::Engine
isolate_namespace Mountable
end
end
- routes.rbの内容
full
Rails.application.routes.draw do
end
mountable
Mountable::Engine.routes.draw do
end
実際の成果物リポジトリ
今回のケースの場合
API・管理画面とパスは変えてルーティングを別々に管理したいのであれば、
Mountableのほうがよさそう。
そういえばSidekiqの管理画面をつかうときに設定してるあれ、mountしてるけど似た仕組みかな
モジュラーモノリス & ドメイン駆動設計 のサンプルリポジトリ
特徴
-
ActiveSupport::Notifications
をつかっている- Kafkaなどを使ったサンプルもある
- Shopifyが作成したPackwerkをつかってモジュールを分けている
イベント駆動
ActiveSupport::Notifications
はRailsが提供しているPubSubてきなやつ?
以前のプロジェクトでイベント単位でなにかをしたいってときに、
その処理に打ち込んでたのをこれで疎結合にしたい。
実装例
購読するイベント名は正規表現で判定もできるとのこと
ActiveSupport::Notifications.subscribe("test.event") do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
p "Received! (#{event.name}, #{event.payload})"
end
ActiveSupport::Notifications.subscribe(/^test/) do |*args|
event = ActiveSupport::Notifications::Event.new(*args)
p "Test all (#{event.name}, #{event.payload})"
end
ActiveSupport::Notifications.instrument("test.event", { foge: 'fuga' })
// 結果
// "Received! (test.event, {:foge=>\"fuga\"})"
// "Test all (test.event, {:foge=>\"fuga\"})"
instrument
のブロック内でエラーが発生したとき
ActiveSupport::Notifications.instrument("test.event") do
raise "Error"
end
// 結果
// "Received! (test.event, {:exception=>[\"RuntimeError\", \"Error\"], :exception_object=>#<RuntimeError: Error>})"
今回、そこまでモジュールをGemレベルで分けれるほどの依存関係ではないので、
Packwerkを使ってモジュール分けを行ったりすることにする
このスクラップは2022/12/13にクローズされました