Chuyển đến nội dung chính

Bài 23: Mono-Repo vs Multi-Repo — Source Code Organization

So sánh Mono-Repo vs Multi-Repo cho Microservices + Micro Frontend. Turborepo, Nx workspace setup. Shared packages management. Code ownership (CODEOWNERS). Dependency management strategies.

🏗️ Kiến trúc — Bài 23 Bài 23: Mono-Repo vs Multi-Repo — Source Code Organization

Thiết kế hệ thống Microservices & Micro Frontend — Từ cơ bản đến Production

Phần 8: CI/CD & Deployment Strategies

xdev.asia

Giới thiệu

Cách tổ chức source code quyết định developer experience, CI/CD complexity, và team collaboration. Bài này so sánh Mono-Repo vs Multi-Repo và hướng dẫn chọn phù hợp.

Monorepo vs Multi-repo — so sánh chiến lược quản lý code


1. Multi-Repo

1.1 Mô hình

github.com/company/
├── product-service/       (repo riêng)
├── order-service/         (repo riêng)
├── cart-service/          (repo riêng)
├── product-mfe/           (repo riêng)
├── cart-mfe/              (repo riêng)
├── shell-app/             (repo riêng)
├── shared-ui/             (repo riêng, npm package)
└── shared-types/          (repo riêng, npm package)

1.2 Ưu & Nhược điểm

Ưu điểmNhược điểm
Clear ownershipShared code khó manage (npm publish)
Independent CI/CDCross-repo changes phức tạp
Smaller repos = fast cloneDependency version drift
Fine-grained access controlConsistency khó enforce

2. Mono-Repo

2.1 Mô hình

github.com/company/platform/
├── apps/
│   ├── shell-app/
│   ├── product-mfe/
│   ├── cart-mfe/
│   └── order-mfe/
├── services/
│   ├── product-service/
│   ├── order-service/
│   └── cart-service/
├── packages/
│   ├── shared-ui/
│   ├── shared-types/
│   └── eslint-config/
├── turbo.json / nx.json
└── package.json (workspace root)

2.2 Ưu & Nhược điểm

Ưu điểmNhược điểm
Shared code dễ dàng (internal packages)Repo lớn → clone chậm
Atomic cross-package changesCI complexity (affected detection)
Consistent tooling & configsAccess control coarse-grained
Refactoring dễBuild time long (cần caching)

3. Decision Matrix

FactorMulti-RepoMono-Repo
Team size50+ devs, nhiều team< 50 devs, few teams
Shared codeÍt sharedNhiều shared packages
Deploy independence✅ Tự nhiên✅ Với affected detection
Cross-cutting changes❌ Multiple PRs✅ Single PR
CI/CDSimple per repoComplex nhưng powerful
OnboardingDễ (1 service/repo)Medium (big repo)

4. Mono-Repo Tools

4.1 Turborepo

// turbo.json
{
  "pipeline": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**", ".next/**"]
    },
    "test": {
      "dependsOn": ["build"]
    },
    "lint": {}
  }
}
# Build chỉ affected packages
turbo build --filter=...[origin/main]

# Build product-mfe và dependencies
turbo build --filter=product-mfe...

4.2 Nx

# Affected commands (chỉ build/test code thay đổi)
nx affected --target=build --base=main
nx affected --target=test --base=main

# Dependency graph
nx graph

4.3 Key Features

FeatureTurborepoNx
Affected detection✅ Git-based✅ Dependency graph
Remote caching✅ Vercel✅ Nx Cloud
Task orchestration✅ Pipeline✅ Task graph
Code generation❌✅ Generators
Plugin ecosystemLimitedRich (React, Node, etc.)

5. Code Ownership (CODEOWNERS)

# .github/CODEOWNERS
apps/product-mfe/    @team-product
apps/cart-mfe/       @team-cart
services/product-*/  @team-product
services/order-*/    @team-order
packages/shared-ui/  @team-platform
packages/shared-*/   @team-platform
turbo.json           @team-platform

→ PR tự động assign reviewers based on changed files.


6. Khuyến nghị

E-Commerce Platform (series này):

Mono-Repo (Turborepo):
├── apps/           (Shell + MFEs)
├── services/       (Microservices)
├── packages/       (shared-ui, shared-types, eslint-config)
└── infra/          (Terraform, K8s manifests)

Lý do:
- Nhiều shared code (UI, types, configs)
- Cross-cutting changes thường xuyên
- Lợi ích từ affected detection & remote caching
- Team size < 50 devs

Tóm tắt

  • Multi-Repo: clear ownership, simple CI, nhưng shared code khó
  • Mono-Repo: shared code dễ, atomic changes, cần tooling (Turborepo/Nx)
  • Dùng Turborepo/Nx cho affected detection + remote caching
  • CODEOWNERS cho code ownership trong mono-repo

Bài tiếp theo: Bài 24: CI/CD Pipeline cho Microservices & Micro Frontend