B08 · 後端架構決策 詳細 ROADMAP
計畫文件,不會被 Quartz 渲染。 回主 roadmap →
backend/ROADMAP.md
章節目標
Architecture decisions 是後端的大題目——單體 vs 微服務、事件驅動 vs 同步、Serverless vs Server、DDD 分層到哪、什麼時候拆什麼時候合。本章不教設計模式細節(那在 architecture-patterns/),而是「遇到真實 trade-off 時怎麼判斷」。
🌱 基本介紹
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 01 | 後端架構決策是什麼 | 01-what-is-architecture-decision | 🌱 | ADR(Architecture Decision Record)概念、決策成本、可逆性 |
❓ 為什麼需要
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 02 | 為什麼不能抄大公司架構 | 02-why-not-copy-faang | 🌱 | Netflix / Uber 的微服務是 100+ 人團隊 / 1B+ users 場景;你 5 人團隊硬抄只會死;conway’s law |
| 03 | 為什麼「微服務」常被誤解 | 03-why-microservice-misunderstood | 🌱 | 以為拆成多個 service 就是微服務;缺了 service boundary / 共用資料庫 / 沒 deploy 獨立;tight coupling 比 monolith 還嚴重 |
| 04 | 為什麼先 Monolith 再拆比較好 | 04-why-monolith-first | 🌱 | 找不到對的 boundary 就拆 = 錯拆;Martin Fowler 的 monolith-first;proto 案例 |
🕰️ 演進
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 05 | 後端架構演進史 | 05-architecture-evolution | 🌱 | LAMP 單體 → SOA → Microservice(2014+)→ Serverless(2015+)→ Service Mesh → Modular Monolith 回潮(2022+) |
| 06 | Monolith → Microservice 轉型 | ⛔️ micro-service/28-monolith-to-microservice | 🌿 | 跨系列 |
🧠 知識型
F08-A 核心架構決策
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 07 | Monolith vs Microservice | ⛔️ micro-service/01-why-api-stress-test / 28 | 🌿 | 跨系列 |
| 08 | 什麼時候該拆微服務 | ⛔️ micro-service/39-when-to-split | 🌿 | 跨系列 |
| 09 | 微服務拆分模式 | ⛔️ micro-service/40-microservice-split-patterns | 🌿 | 跨系列 |
| 10 | Modular Monolith | 10-modular-monolith | 🌱 | 拆 module 但不拆 process、boundary 先練 code-level;shopify / basecamp 案例 |
| 11 | Serverless vs Server | ⛔️ cloud/02-serverless-vs-server | 🌿 | 跨系列 |
F08-B 通訊模式
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 12 | 同步 vs 非同步通訊 | 12-sync-vs-async-comm | 🌱 | REST / gRPC 同步 vs Event-driven 非同步、何時選哪種 |
| 13 | Event-driven Architecture | ⛔️ micro-service/35-event-driven-basics / 36-event-driven-pitfalls | 🌿 | 跨系列 |
| 14 | BFF(Backend for Frontend) | 14-bff-pattern | 🌱 | BFF 的 Why、怎麼設計、跟 API Gateway 邊界 |
| 15 | API Gateway 模式 | ⛔️ infra/21-api-gateway | 🌿 | 跨系列 |
| 16 | Service Mesh | 16-service-mesh | 🌱 | Istio / Linkerd、sidecar、跟 K8s 整合、2026 現況 |
| 16-2 | MVC vs Event-driven 架構風格(應用內部) | 16-2-mvc-vs-event-driven | 🌱 | 應用層內部架構選擇:MVC(Controller 同步 call Service)vs Event-driven(Event Bus / 非同步 handler 處理);什麼場景該 MVC、什麼場景該 Event-driven;兩者混合模式;跟 B12 Queue #13 / B08 #13 Event-driven 的區別(application-level vs system-level) |
F08-C 資料一致性
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 17 | 分散式交易的真相 | 17-distributed-transaction | 🌱 | 2PC 為什麼沒人用、Saga pattern、Outbox pattern、eventual consistency 的接受 |
| 17-2 | 資料一致性 / Saga 實戰 | ⛔️ micro-service/46-data-consistency-saga | 🌿 | 跨系列 |
| 17-3 | Eventual Consistency 實戰 | ⛔️ micro-service/47-eventual-consistency | 🌿 | 跨系列 |
| 18 | Saga Pattern | 18-saga | 🌱 | Choreography vs Orchestration、補償交易、失敗處理 |
| 19 | Outbox Pattern | 19-outbox | 🌱 | 跟業務 tx 同一個 DB 交易寫 outbox table,後台 worker 送 MQ;避免 dual-write 一致性問題 |
| 20 | CQRS(Command Query Responsibility Segregation) | 20-cqrs | 🌱 | 讀寫分離;什麼規模值得 |
F08-D DDD 視角(後端實用版)
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 21 | DDD 給後端工程師 | 21-ddd-for-backend | 🌱 | Bounded Context、Aggregate、Entity / Value Object;不是必要但有助於決定服務邊界 |
| 22 | Bounded Context 跟微服務邊界的關係 | 22-bounded-context-vs-service | 🌱 | 1:1 是誤解;一個 context 可能多個 service、多個 context 可能在同一個 service |
F08-E 實戰選型
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 23 | 真實案例 anti-pattern 集合 | ⛔️ micro-service/29-real-world-antipatterns / 30-lessons-learned | 🌿 | 跨系列 |
| 24 | 架構決策記錄(ADR)怎麼寫 | 24-adr-writing | 🌱 | Michael Nygard ADR 模板、team 知識沉澱、決策可追溯 |
F08-F Monolith → Microservice 轉換準備清單
本節是 實戰 checklist——要從單體拆成微服務,這些東西必須先準備好,不然拆出去只會痛。
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 25 | 結構化 Log + Log Formatter 統一 | 25-unified-log-formatter | 🌱 | 3 個 service 寫 3 種 log → 跨服務 debug 地獄;JSON 格式統一、欄位 convention、共用 logger library |
| 26 | Correlation ID / Trace ID 貫穿 | 26-correlation-id-propagation | 🌱 | HTTP header + middleware 自動注入、跨 service 傳遞、log 關聯;proto 用 request_id middleware 實作 |
| 27 | Error Code 與 Exception 階層統一 | 27-unified-error-hierarchy | 🌱 | 每個 service 錯誤格式要一致;client 統一處理;跟 i18n / monitoring 配合 |
| 28 | Shared Types / Schema 管理 | 28-shared-types-schema | 🌱 | Internal package 抽 types / proto / OpenAPI;避免 copy-paste;版本 lock;breaking change 流程 |
| 29 | Shared Middleware 抽取策略 | 29-shared-middleware-extraction | 🌱 | Auth / logging / rate limit 不要每服務重寫;shared package vs service mesh 處理;proto shared/middleware/ 11 個案例 |
| 30 | API Versioning 跨服務策略 | 30-api-versioning-cross-service | 🌱 | 每服務獨立 semver 還是全域版號;consumer / producer 版本相容;breaking change 傳播 |
| 31 | 認證架構收斂 | 31-auth-architecture-consolidation | 🌱 | 誰發 token / 誰驗 / internal service auth 選型;跟 B10 #24–28 連動;常見陷阱(每服務自己發 token) |
| 32 | Health Probe Standardization | 32-health-probe-standard | 🌱 | /health/live / /health/ready 統一規範;K8s probe 一致;跟 Gateway / LB 整合 |
| 33 | Service Discovery / DNS | 33-service-discovery | 🌱 | K8s Service / Consul / etcd;static config vs dynamic;internal DNS 慣例 |
| 34 | Secret / Config 集中管理 | 34-secret-config-centralized | 🌱 | 每服務自己 .env → Vault / K8s Secret / AWS Secrets Manager;rotation 跨服務;ConfigMap 分層 |
| 35 | Clock Skew / Time 處理 | 35-clock-skew-handling | 🌱 | 跨節點時戳不同步、NTP 的限制;JWT expiration / distributed lock TTL 都受影響 |
| 36 | CI/CD Per Service | 36-cicd-per-service | 🌱 | Monorepo vs Multirepo 選擇;selective build(只 build 改動服務);image tagging 策略 |
| 37 | Monitoring / Alerting Per Service | 37-monitoring-per-service | 🌱 | 每服務獨立 dashboard、SLO / SLI、on-call rotation;alert 不淹沒 |
| 38 | Capacity Planning 跨服務 | 38-cross-service-capacity | 🌱 | 新服務上線前怎麼預估 resource;query rate / latency budget;跟 B19 壓測配合 |
| 39 | Conway’s Law + 組織配合 | 39-conway-law | 🌱 | 團隊邊界決定服務邊界;反向 Conway 刻意調組織;跨團隊協作機制 |
F08-G 微服務架構 Patterns
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 40 | Sidecar Pattern 深入 | 40-sidecar-pattern | 🌱 | Istio envoy / Dapr / 自寫 sidecar;responsibility offload;跟 Service Mesh (#16) 的關係 |
| 41 | Ambassador / Adapter Pattern | 41-ambassador-adapter | 🌱 | Ambassador proxy 外部 service、Adapter 接 legacy system;跟 BFF 的區別 |
| 42 | BFF vs API Gateway 邊界 | 42-bff-vs-gateway-boundary | 🌱 | Gateway 統一入口(路由 / auth)vs BFF per-client(aggregation / transformation);誰做什麼;Multi-BFF 策略(Web / Mobile / Partner) |
F08-H 跨地域部署(Multi-region)
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 43 | Multi-region 架構模式 | 43-multi-region-patterns | 🌱 | Active-Active vs Active-Passive / Pilot Light;read local write home / full replication;成本 trade-off |
| 44 | Region Routing 與 Failover | 44-region-routing-failover | 🌱 | GeoDNS / Anycast / CloudFront;latency routing vs weight;failover RTO 驗證 |
| 45 | Data Residency 與跨區資料 | 45-data-residency | 🌱 | GDPR / 中國 PIPL 資料地域限制;怎麼做跨區 replication 同時滿足法規;encryption boundary |
🔧 小實作注意事項
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 46 | 畫架構圖的工具跟習慣 | 46-architecture-diagramming | 🌱 | C4 model、D2 / PlantUML / Mermaid、diagram-as-code;避免 PowerPoint 圖 rot |
| 47 | 用 ADR 記錄 proto 架構演進 | 47-proto-adr-case-study | 🌱 | 從單體 FastAPI 到三 service + Kong gateway 的決策過程 |
💣 Anti-pattern
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 48 | 架構 Anti-patterns | 48-architecture-antipatterns | 🌱 | 無 boundary 微服務(共用 DB)、Distributed Monolith(強耦合的多 service)、早期 over-engineering、沒 ADR 決策無 trace、抄大公司架構、Service 間用 DB call 而非 API |
🧰 對應檢查工具
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| 49 | 架構相關工具 | 49-architecture-tooling | 🌱 | ArchUnit(Java 架構 unit test)、NetArchTest(.NET)、dependency graph 工具、Structurizr / D2 / Mermaid |
📎 補充
| # | 主題 | Slug | Stage | 大綱 |
|---|---|---|---|---|
| S01 | 架構風格應用 | → architecture-patterns/ | 🌿 | 跨系列 |
| S02 | Conway’s Law 實戰 | s02-conways-law | 🌱 | 組織結構決定架構、反向 Conway 刻意調組織來改架構 |
| S03 | Macro vs Micro 架構 | s03-macro-vs-micro-architecture | 🌱 | Gregor Hohpe 提出、公司級架構 vs 單 app 架構 |
章節進度統計
- 知識主題:28 + 3 補充 = 31 項
- 🌿 growing:6(跨系列)
- 🌱 seed:25
跨系列連結
- →
architecture-patterns/(Layered / Clean / DDD / CQRS / Event Sourcing 等風格) - →
micro-service/01、28、35–36、39–40、46–47(微服務實戰素材 + Saga / eventual consistency) - →
backend/api-design/B09(架構影響 API 設計) - →
cloud/02-serverless-vs-server - →
infra/21-api-gateway - →
standards/05-good-infra-setup