← C4 Model: vẽ kiến trúc phần mềm

Bài 6 · Vận dụng · 20 phút

Level 4 & sơ đồ bổ trợ

Biên soạn bởi Nguyễn Anh Tuấn

Level 4 (Code) bằng sơ đồ lớp UML - thường tự sinh hoặc bỏ qua; và ba sơ đồ bổ trợ: System Landscape, Dynamic (luồng chạy), Deployment (ánh xạ hạ tầng).

Sau Component, mức zoom cuối là Code: zoom vào MỘT component để thấy nó được hiện thực bằng những lớp (class), interface, hàm nào - thường vẽ bằng sơ đồ lớp UML.

Nhớ lại sơ đồ Component (mức 3) - API của Ngân Hàng Số gồm các component như Transfer Service. Mức Code zoom vào MỘT component đó để thấy nó là vài class (như Transfer Service dưới đây):

Component - bên trong API Application

[Component: Spring MVC]

Sign-in Controller

Xử lý đăng nhập, cấp token.

[Component: Spring MVC]

Accounts Controller

Trả về số dư & lịch sử.

[Component: Lớp nghiệp vụ]

Transfer Service

Thực hiện chuyển khoản.

[Component: Lớp tích hợp]

Core Banking Facade

Bọc giao tiếp với hệ thống lõi.

[Component: Lớp truy cập]

Database Gateway

Đọc/ghi cơ sở dữ liệu.

[Hệ thống ngoài]

Hệ thống lõi (Core Banking)

Tài khoản & giao dịch.

GọiGọiGọiGọiLấy số dư [XML/HTTPS]

Một component 'Transfer Service' gồm vài class (minh hoạ mức Code)

// Component "Transfer Service" - ben trong, no la vai class:
interface TransferPolicy {
  check(amount: number, balance: number): boolean;
}

class DailyLimitPolicy implements TransferPolicy { /* ... */ }

class TransferService {
  constructor(private policy: TransferPolicy) {}
  transfer(from: string, to: string, amount: number) { /* ... */ }
}
  • Mức Code = các phần tử trong mã nguồn: class, interface, hàm.
  • Một component (mức 3) thường gồm vài class ở mức Code (mức 4).
  • Đây là mức chi tiết nhất - và cũng đổi nhanh nhất.
  • Quá chi tiết: vẽ ra cũng ít người đọc, mà tốn công.
  • Lạc hậu tức thì: đổi một class là sơ đồ đã sai.
  • Đã có công cụ: IDE/plugin tự sinh sơ đồ UML từ code khi bạn THẬT SỰ cần.

Trung thực

Trong thực tế, gần như không ai vẽ tay mức Code và lưu lại. Mô hình C4 của phần lớn đội dừng ở Component. Đừng thấy "mức 4" mà tưởng phải vẽ cho đủ bộ - nhớ lại tinh thần "vẽ vừa đủ".

Bốn mức Context/Container/Component/Code trả lời câu "hệ thống này GỒM gì". Nhưng có những câu hỏi khác cần loại sơ đồ khác. C4 gợi ý ba sơ đồ bổ trợ:

System LandscapeNhiều hệ thống của cả tổ chức cùng một bức - toàn cảnh ai nối ai.
DynamicMột kịch bản chạy theo thứ tự, các bước được đánh số.
DeploymentÁnh xạ container xuống hạ tầng: máy chủ, cloud, thiết bị.

System Landscape zoom ra XA hơn cả Context: thay vì một hệ thống ở giữa, nó cho thấy nhiều hệ thống của tổ chức và quan hệ giữa chúng. Hữu ích cho kiến trúc sư doanh nghiệp muốn thấy bức tranh tổng.

Dynamic không nói "gồm gì" mà nói "chạy ra sao": chọn một kịch bản (vd đăng nhập, chuyển khoản) rồi đánh số các bước theo thứ tự dữ liệu chảy qua các phần tử.

  • Landscape: nhiều hệ thống, mức cao hơn Context - bản đồ cả vùng thay vì một thành phố.
  • Dynamic: dùng chính phần tử của mô hình, thêm số thứ tự bước - kể một câu chuyện.
  • Cả hai đều TÙY CHỌN: chỉ vẽ khi có câu hỏi cụ thể cần tới.

Các mức Context/Container/Component cố tình không nói "cái gì chạy ở đâu". Deployment lấp chỗ đó: nó ánh xạ mỗi container tới một node hạ tầng - máy chủ vật lý, máy ảo, container hạ tầng, vùng cloud, hay thiết bị của người dùng.

  • Node = nơi chạy: máy chủ, máy ảo, cluster, vùng cloud, điện thoại người dùng.
  • Một container có thể chạy trên nhiều node (vd API nhân bản trên 3 máy chủ để chịu tải).
  • Đây là sơ đồ ops chờ đợi - và là chỗ Docker/Kubernetes thực sự xuất hiện đúng nghĩa.

Mẹo

Deployment là cầu nối tự nhiên giữa kiến trúc và vận hành. Nếu đội ops hay hỏi "cái này chạy ở đâu, chịu tải sao", một sơ đồ Deployment đáng giá hơn nhiều lời.
"Hệ thống làm gì, ai dùng?"Context
"Hệ thống gồm khối chạy nào?"Container
"Bên trong một container có gì?"Component
"Toàn cảnh tổ chức ra sao?"System Landscape
"Luồng X chạy theo thứ tự nào?"Dynamic
"Cái gì chạy ở đâu?"Deployment

Bước tiếp theo

Có đủ các loại sơ đồ rồi, nhưng vẽ thế nào để người khác đọc hiểu mà không cần bạn đứng cạnh giải thích? Đó là bài Ký pháp & sơ đồ tự đứng vững.

Câu hỏi thường gặp

Không. Trong thực tế gần như luôn bỏ qua. Nó quá chi tiết và đổi liên tục theo code, nên vẽ tay là phí công. Khi thật sự cần xem quan hệ lớp, hãy để IDE tự sinh sơ đồ UML từ code.

Context có ĐÚNG MỘT hệ thống làm tâm điểm. System Landscape zoom ra xa hơn nữa: nhiều hệ thống của cả tổ chức cùng xuất hiện, để thấy bức tranh toàn cảnh ai nối với ai. Landscape giống "tấm bản đồ cả vùng", còn Context là "một thành phố".

Gần giống về mục đích (kể một luồng theo thứ tự), nhưng Dynamic trong C4 dùng chính các phần tử của mô hình (person, container, component) và đánh số các bước. Nó trả lời "khi X xảy ra, dữ liệu chạy qua đâu theo thứ tự nào".

Chủ yếu cho vận hành (ops) và những ai lo hạ tầng. Nó cho thấy mỗi container thực sự chạy ở đâu: máy chủ nào, vùng cloud nào, thiết bị nào - thứ mà Context/Container/Component cố tình không nói.

Không cần thuộc lòng. Chỉ cần nhớ: khi câu hỏi vượt khỏi "hệ thống này gồm gì" (vd "toàn cảnh tổ chức", "luồng đăng nhập chạy sao", "cái gì chạy ở đâu") thì có một loại sơ đồ hợp cho câu đó.

Tick những điều em tự tin làm được. Càng lên cao, em càng hiểu sâu.

Tick những điều em tự tin làm được sau khi học bài này. 0/6

Trả lời vài câu để chắc rằng em đã nắm bài.

Câu 1/3 Điểm: 0

Vì sao mức Code (mức 4) gần như luôn được bỏ qua trong thực tế?

  1. 1

    Vẽ hay bỏ mức Code?

    Cho một component "Transfer Service" gồm 5 class. Quyết định có nên vẽ sơ đồ Code cho nó không, và nếu cần xem quan hệ lớp thì mèo con làm cách nào.

    Hoàn thành khi: Quyết định rõ (thường là bỏ qua); nêu được cách thay thế (IDE tự sinh khi cần).

  2. 2

    Landscape hay Context?

    Cho hai câu hỏi: (a) "Công ty mình có những hệ thống nào, nối với nhau ra sao?", (b) "Hệ thống đặt hàng phục vụ ai?". Mỗi câu hợp với sơ đồ nào?

    Hoàn thành khi: Gán đúng: (a) System Landscape, (b) System Context; giải thích ngắn.

  3. 3

    Kể một luồng bằng Dynamic

    Chọn một kịch bản (vd "khách hàng chuyển khoản"). Viết các bước theo thứ tự, đánh số, nêu mỗi bước phần tử nào gọi phần tử nào.

    Hoàn thành khi: Có ≥4 bước đánh số; mỗi bước rõ "ai → ai: làm gì".

  4. 4

    Phác một Deployment

    Với một hệ thống tự chọn, kể mỗi container chạy ở đâu: máy chủ/cloud/thiết bị nào.

    Hoàn thành khi: Mỗi container được ánh xạ tới một node hạ tầng; có ít nhất 3 ánh xạ.

  5. 5

    Chọn sơ đồ cho câu hỏi

    Cho 4 câu hỏi về một hệ thống, gán mỗi câu với một trong: Context, Container, Component, Dynamic, Deployment, Landscape.

    Hoàn thành khi: Gán đủ 4 câu; mỗi gán có lý do một dòng.

  6. 6

    Bộ sơ đồ tối thiểu

    Cho một dự án nhỏ của mèo con, đề xuất bộ sơ đồ TỐI THIỂU nên có và giải thích vì sao không cần các loại còn lại.

    Hoàn thành khi: Đề xuất 1-2 sơ đồ; lập luận vì sao đủ và vì sao bỏ phần còn lại.