Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Qiitaアーキテクチャの15年史:モノリスRailsから巨大化するサービスの技術負債をどう解...

Avatar for Tomoya Chiba Tomoya Chiba
November 19, 2025
200

 Qiitaアーキテクチャの15年史:モノリスRailsから巨大化するサービスの技術負債をどう解消するか

アーキテクチャ Conference 2025 (https://architecture-con.findy-tools.io/2025) での発表資料です。

Avatar for Tomoya Chiba

Tomoya Chiba

November 19, 2025
Tweet

Transcript

  1. Tomoya Chiba (Qiita,GitHub: @tomoasleep X: @nemunemu3desu) Architecture Conference 2025 #

    Qiita アーキテクチャの15 年史:モノリスRails か ら巨大化するサービスの技術負債をどう解消するか 1
  2. Ruby on Rails を中心としたモノリシックアーキテクチャ 複数サービス (Qiita, Qiita Team) を同一コードベースで運用 フロントエンドでは近年は

    React 中心 インフラ AWS ECS 上で稼働 MySQL, Redis, Elasticsearch 等を利用 ### Qiita が採用しているアプリケーション構成 6
  3. 15 年の事例を全部 30 分の発表に持ってくるのは無理だった ブースや Ask the Speaker で色々話せます! Qiita

    の気になるところ Rails フロントエンドの変遷 GraphQL Ruby 使ってる話 Qiita の ECS への移管 ...etc ### 11
  4. Rails の基本構成は Model, View, Controller サービスの成長とともに Rails の Model は色々出来、肥大化したり辛くなりがち

    Model から操作を Service に抽出し、 Controller と Model の中間に置く #### Fat Model が辛くなるとは 19
  5. class Article < ApplicationRecord # Validation validates :body, presence: true,

    if: :update_by_post? # Callback after_save :send_mention_mail, if: :update_by_post? end 特定のケースだけ、値をチェックしたい or 通知を送りたい、となると複雑化 #### ( 極端な) Model のアンチパターン 20
  6. class PostArticleService def call(**attributes) # (Post 時の Validation 処理 が入る)

    fail ArgumentError, "body is required" if attributes[:body].blank? # Model の操作 article.update!(**attributes) # (Post 時の Callback 処理 が入る) send_mention_mail(article) end end Model の持っている責務を Service に移す #### Service 層のコードのイメージ 21
  7. 大型の新機能開発で、今後の Fat Model 化を防ぐために Service 層を導入してみ ることに Controller から Model

    を直接使わず、 Service 経由にする 結果: 開発で「迷い」が生じて遅くなってしまい、導入中止 「ちょうどよい Service 層」を作るのにチームで迷ってしまった #### ということで Qiita でも導入してみる 22
  8. Service "" 層"" として強制するとデメリットも有る Model が薄くなりすぎて、重複コードが増える可能性がある ( ドメインモデル貧 血症) Service

    側の分、通常よりも書くコードが増える 元々 MVC で簡潔に書けていたものが、冗長に ( 例: CreateXXXService) #### Service 層は万能ではない 23
  9. 「ちょうどよい Service 層」をチームで作れず、コードがぶれた Model と Service のどっちに書くべき?の基準を作れなかった 社内にノウハウが無いため「ちょうどよい Service 層」を皆で模索してしまっ

    た 新機能では「Fat Model 問題」はまだ起きてないので、基準が作りにくい 新機能の設計で悩むべき時間を奪ってしまうことに → 最終的に、 「サービス層は無い方が良い」となり中止 #### メンバー間の活用認識が揃わなかった 24
  10. 40

  11. Service 層、モジュラーモノリス、どちらが良い悪いではない Service 層: 操作 (Service) のクラス化という発想自体は、Fat Model を整理する上で 有用

    冗長化、 Model との棲み分け モジュラーモノリス: 単位それぞれで見通しが良くなる、複数チームなら独立して開発しやすく 分割しすぎると、何をどこに置くべきかで無駄に悩んでしまう オーバーに適用すると、考えることが増えてしまう、という点では共通 ### 違いは手法の良し悪しではない 46
  12. Service 層 vs モジュラーモノリス すべての操作に導入 vs 適用する箇所を絞って導入 複数人開発にいきなり実 践 vs

    少人数でノウハウを貯めてから実 践 ゴールを明確にして適用する場所を絞ったか、 「迷う部分」を少人数のうちに減ら せたか、が差 #### 適用範囲と導入方法の違い 47