下拉重新整理
rails 公開 dhh architecture monolith microservices citadel outposts rails

DHH 的架構三部曲:Majestic Monolith、Citadel 與 Outposts

DHH 提出的軟體架構演進觀:從壯麗的單體架構出發,經由 Citadel 模式,以 Outposts 有限度地抽離,避免微服務的過度複雜化。

| 匯入於 2026-04-12 |

DHH 的架構三部曲:Majestic Monolith、Citadel 與 Outposts

DHH(David Heinemeier Hansson,Rails 創始人)長期反對盲目採用微服務,提出了一套漸進式的架構演進觀,核心是三個層次:Majestic Monolith → Citadel → Outposts

核心論點

「微服務所帶來的痛苦是巨大的。除了 Majestic Monolith,還應該有人整理出 The Citadel 這個模式。」
— DHH, Twitter

大多數系統不需要微服務。微服務架構在組織規模達到一定程度之前,通常帶來的複雜度遠超過其解決的問題。

架構三層次

graph TD
  A[Majestic Monolith 壯麗的單體] -->|壓力增加 無法應對| B[Citadel 城堡]
  B -->|特定需求 有限抽離| C[Outposts 前哨站]

1. Majestic Monolith(壯麗的單體)

第一選擇,也是預設架構。

所有功能部署在同一個應用程式中,共享同一個資料庫、同一個程式碼庫。

優勢:
- 部署簡單,只有一個服務需要維運
- 跨模組呼叫是本地函式呼叫,無網路延遲
- 交易(Transaction)天然保持一致性
- 重構容易,IDE 可跨模組追蹤

適合: 絕大多數應用程式,尤其是初期與中期規模


2. The Citadel(城堡模式)

當 Monolith 已達極限,但還不需要全面微服務化時的中間路線。

核心單體(Citadel)依然存在且佔據主導地位,但允許少數 Outposts 以獨立服務的形式存在於外圍,處理特定的發散性需求。

graph TD
  subgraph citadel[Citadel 核心城堡]
    M[Rails Monolith]
    M --- DB[(主資料庫)]
    M --- Auth[認證模組]
    M --- Wiki[Wiki 模組]
    M --- Blog[部落格模組]
  end

  subgraph outposts[Outposts 前哨站]
    O1[FHIR Gateway]
    O2[即時推播服務]
    O3[PDF 處理服務]
  end

  M -->|API 呼叫| O1
  M -->|事件推送| O2
  M -->|Job Queue| O3

關鍵原則:
- Citadel 是主體,Outposts 是例外
- Outposts 為了組織、效能或實作需求而存在
- Citadel 永遠可以呼叫 Outposts,但不依賴它們運作


3. Outposts(前哨站)

從 Citadel 抽離出來的個別服務,通常有明確的抽離理由:

抽離理由 範例
技術限制 FHIR 標準需要 Java 的 HAPI FHIR
效能需求 即時 WebSocket 用 Elixir/Phoenix
組織邊界 不同團隊負責不同服務
安全隔離 支付、醫療資料需要獨立部署環境

與微服務的對比

微服務 Citadel
服務數量 數十至數百 1 核心 + 少數周邊
部署複雜度
跨服務通訊 大量 有限
資料一致性 需 Saga/Event Sourcing 單體內天然一致
適用時機 Netflix/Amazon 規模 絕大多數公司

與 NanoClaw 的對應

nicklecheng.turbos.tw 的架構本身就是一個 Citadel 模式的實踐:

graph TD
  subgraph citadel2[Citadel]
    Rails[Rails Blog]
    Rails --- PG[(PostgreSQL)]
    Rails --- Wiki[WikiEntry]
    Rails --- Series[Series/Post]
  end

  subgraph outposts2[Outposts]
    NC[NanoClaw AI Agent]
    Discord[Discord Bot]
  end

  NC -->|SSH / Rails Runner 發布 WikiEntry| Rails
  Discord -->|訊息觸發| NC

Rails 是核心城堡,NanoClaw 是外圍的 Outpost — 只在需要時(發布 wiki)才與核心溝通。


延伸閱讀

  • DHH Twitter thread(2020):The Citadel pattern
  • The Majestic Monolith — DHH, Signal v. Noise
  • 相關案例:Amazon Prime Video 從微服務回歸單體,節省 90% 成本

© 2025-2026 Nickle Cheng Built with Ruby Ruby on Rails