Trong bài viết ngắn này, chúng ta sẽ khám phá mô hình C4 là gì, các cấp độ khác nhau của nó và cách áp dụng nó vào thực tế.
Nó bao gồm 4 cấp độ chính:
- Context
- Container
- Components
- Code
- Exit within a specific context - Tồn tại trong một bối cảnh cụ thể
- Consist of one or more containers - Bao gồm một hoặc nhiều vùng chứa (mobile app, web apps, etc.)
- With each container containng one or more components - Với mỗi vùng chứa chứa một hoặc nhiều thành phần
- Each components being implemented by some code elememnts (classes, functions, etc.) - Mỗi thành phần được triển khai bởi một số phần tử mã.
Mô hình C4 là một phương pháp "trừu tượng-trước-hết" (abstraction-first) để vẽ kiến trúc phần mềm, dựa trên các trừu tượng phản ánh cách các kiến trúc sư và nhà phát triển phần mềm nghĩ và xây dựng phần mềm. Tập hợp nhỏ các trừu tượng và loại biểu đồ làm cho mô hình C4 dễ học và sử dụng. Lưu ý rằng bạn không cần sử dụng tất cả 4 cấp độ biểu đồ; chỉ cần những cái mang lại giá trị - các biểu đồ ngữ cảnh hệ thống và ngữ cảnh container thường đủ cho nhiều nhóm phát triển phần mềm.
Abstractions
Một người đại diện cho một trong những người dùng con người trong hệ thống phần mềm của bạn (Ví dụ: Diễn viên, vai trò, cá tính, v.v.)
Software System
Một hệ thống phần mềm là mức trừu tượng cao nhất và mô tả một cái gì đó mang lại giá trị cho người sử dụng của nó, cho dù họ là con người hay không. Điều này bao gồm cả hệ thống phần mềm mà bạn đang mô hình, và các hệ thống phần mềm khác mà hệ thống phần mềm của bạn phụ thuộc vào (hoặc ngược lại) (or vice versa).
Thật không may, thuật ngữ "hệ thống phần mềm" là khó nhất để định nghĩa trong các lớp trừu tượng của mô hình C4, và điều này không được giúp đỡ bởi sự thật là mỗi tổ chức cũng sẽ có thuật ngữ riêng (terminology - thuật ngữ) để mô tả cùng một thứ, thường sử dụng các thuật ngữ như "ứng dụng", "sản phẩm", "dịch vụ", v.v.. Một cách để nghĩ về nó là một hệ thốn phần mềm là một thứ mà nhóm phát triển phần mềm duy nhât đang xây dựng, sở hữu, có trách nhiệm và có thể nhìn thấy các chi tiết triển khai bên trong của nó. Có thể mã của hệ thống phần mềm đó nằm ở trong(reside - cư trú tại, ở tại) một kho mã nguồn duy nhất, và bất kì ai trong nhóm cũng có quyền sửa đổi nó (entitle - quyền, cho phép).
Container (Applications and Data stores)
Trong mô hình C4, một vùng chứa đại diện cho một ứng dụng hoặc một kho lưu trữ dữ liệu. Một vùng chứa là là thứ cần được chạy để cho hệ thống phần mềm tổn thể hoạt động. Nói một cách thực tế, một vùng chứa giống như:
- Ứng dụng web phía máy chủ: Một ứng dụng web Java EE chạy trên Apache Tomcat, một ứng dụng ASP.NET MVC chạy trên Microsoft IIS, một ứng dụng Ruby on Rails chạy trên WEBrick, một ứng dụng Node.js, v.v.
- Ứng dụng web phía máy khách: Một ứng dụng JavaScript chạy trong trình duyệt web sử dụng Angular, Backbone.JS, jQuery, v.v.
- Ứng dụng máy tính để bàn phía máy khách: Một ứng dụng máy tính để bàn Windows viết bằng WPF, một ứng dụng máy tính để bàn OS X viết bằng Objective-C, một ứng dụng máy tính để bàn đa nền tảng viết bằng JavaFX, v.v.
- Ứng dụng di động: Một ứng dụng Apple iOS, một ứng dụng Android, một ứng dụng Microsoft Windows Phone, v.v.
- Ứng dụng console phía máy chủ: Một ứng dụng độc lập (ví dụ: "public static void main"), một quy trình hàng loạt, v.v.
- Hàm serverless: Một hàm serverless đơn lẻ (ví dụ: Amazon Lambda, Azure Function, v.v.).
- Cơ sở dữ liệu: Một lược đồ hoặc cơ sở dữ liệu trong hệ quản trị cơ sở dữ liệu quan hệ, kho tài liệu, cơ sở dữ liệu đồ thị, v.v. như MySQL, Microsoft SQL Server, Oracle Database, MongoDB, Riak, Cassandra, Neo4j, v.v.
- Kho blob hoặc nội dung: Một kho blob (ví dụ: Amazon S3, Microsoft Azure Blob Storage, v.v.) hoặc mạng phân phối nội dung (CDN) (ví dụ: Akamai, Amazon CloudFront, v.v.).
- Hệ thống tệp: Một hệ thống tệp cục bộ hoàn chỉnh hoặc một phần của hệ thống tệp mạng lớn hơn (ví dụ: SAN, NAS, v.v.).
- Shell script: Một shell script đơn lẻ viết bằng Bash, v.v.
- etc
Component
Từ "component" là một thuật ngữ quá tải lớn trong ngành phát triển phần mềm, nhưng trong hoàn cảnh này, một vùng chứa là một nhóm các chức năng liên quan được đóng gói vào đằng sau một giao diện được định nghĩa rõ ràng. Nếu bạn sử dụng ngôn ngữ như Java hay C#, cách đơn giản nhất để nghĩ về vùng chứa là nó là một bộ sưu tập các lớp triển khai đăng sau một giao diện. Các yếu tố như cách các vùng chứa được đóng gói (Ví dụ một vùng chứa so với nhiều cùng chứa trên mỗi tập tin JAR, DLL, thư viện chia sẻ, v.v.) là một vấn đề riêng biệt và độc lập (orthogonal - trực giao).
Một điểm quan trọng cần chú ý rằng là tất cả các thành phần bên trong một vùng chứa thường chạy trong cùng một không gian xử lý. Trong mô hình C4, các thành phần không phải các đơn vị triển khai riêng biệt.
System Context diagram
Sơ đồ bối cảnh hệ thống là một điểm bắt đầu tốt để lập sơ đồ và ghi lại một hệ thống phần mềm, cho phép bạn lùi lại và xem một bức tranh toàn cảnh. Vẽ một sơ đồ thể hiển thị thống của bạn dưới dạng một hộp ở giữa, được bao quanh bởi các người dùng của nó và các hệ thống khác mà nó tương tác.
Ở đây, chi tiết không quan trọng vì đây là chế độ xem thu nhỏ của bạn hiển thị một bức tranh toàn cảnh về bối cảnh hệ thống (landscape - phong cảnh, người làm vườn, cắt cỏ). Nên tập trung vào con người (actors, roles, personas, etc.) và các hệ thống phần mềm hơn là các công nghệ, các giao thức và các chi tiết cấp thấp khác. Nó là loại sơ đồ mà bạn có thể hiển thị cho những người không rành về kỹ thuật.
Phạm vi: Một hệ thống phần mềm duy nhất
Các yếu tố chính: Hệ thống phần mềm nằm trong phạm vi
Các yếu tố hỗ trợ: Con người (ví dụ: người dùng, tác nhân, vai trò hay cá tính) và các hệ thống phần mềm (các phụ thuộc bên ngoài) được kết nối trực tiếp tới hệ thống phần mềm trong phạm vi. Thông thường các hệ thống phần mềm khác này nằm bên ngoài phạm vi hoặc ranh giới của hệ thống phần mềm của bạn, và bạn không có trách nhiệm hay quyền sở hứu chúng (boundary - ranh giới, biên giới).
Đối tượng dự định: Tất cả mọi người, cả những người có kiến thức và không có kiến thức kỹ thuật, thuộc hay không thuộc nhóm phát triển phần mềm.
Đề xuất cho hầu hết các nhóm: Có
Container diagram
Khi bạn hiểu cách hệ thống của mình phù hợp như thế nào với môi trường CNTT tổng thể, một bước kế tiếp rất hữu ích là phóng to vào ranh giới hệ thống với một sơ đồ vùng chứa. Một "vùng chứa" giống như một máy chủ ứng dụng web, ứng dụng một trang, ứng dụng máy tính để bàn, ứng dụng điện thoại, lược đồ cơ sở dữ liệu, tập tin hệ thống, v.v. Về cơ bản (essentially - thiết yếu, cần thiết, chủ yếu), một vùng chứa là một đơn vị có thể chạy / triển khai riêng biệt (ví dụ một không gian xử lý riêng biệt) mà nó thực thi mã hoặc lưu trữ dữ liệu.
Sơ đồ vùng chứa hiển thị các hình dạng cao cấp của kiến trúc phần mềm và cách các trách nhiệm được phân bổ trên đó. Nó cũng hiển thị các lựa chọn công nghệ chính và cách các vùng chứa giao tiếp với nhau. Đó là một sơ đồ đơ giản, tập trung vào công nghệ cấp cao, hữu ích đối với các nhà phát triển phần mềm cũng như nhân viên hỗ trợ / vận hành.
Phạm vi: Một hệ thống phần mềm duy nhất
Các yếu tố chính: Hệ thống phần mềm nằm trong phạm vi
Các yếu tố hỗ trợ: Con người và hệ thống phần mềm được kết nối trực tiếp tới các vùng chứa.
Đối tượng dự định: Những người biết kĩ thuật thuộc hoặc không thuộc nhóm phát triển phần mềm; bao gồm các kiến trúc sư phần mềm, các nhà phát triển và các nhân viên vận hành / hỗ trợ.
Đề xuất cho hầu hết các nhóm: Có
Lưu ý: Sơ đồ này không đề cập đến việc phân cụm, cân bằng tải, sự sao chép, chuyển đổi dự phòng (failover) v.v. bởi vì nó có thể sẽ khác nhau giữa các môi trường (ví dụ môi trường sản suất, dàn dựng, phát triển, vv..). Thông tin này được nắm bắt tốt hơn thông qua một hay nhiều sơ đồ triển khai.
Component diagram
Tiếp theo bạn có thể phóng to và phân tách từng vùng chứa hơn nữa để xác định các khối xây dựng cấu trúc chính và sự tương tác của chúng.
Sơ đồ thành phần hiển thị cách một vùng chứ được tạo ra bởi một số "thành phần", mỗi thành phần đó là gì, trách nhiệm của chúng và các chi tiết về công nghệ / sự triển khai.
Phạm vi: Một vùng chứa duy nhất
Các yếu tố chính: Các thành phần bên trong vùng chứa thuộc phạm vi
Các yếu tố hỗ trợ: Các vùng chứa (bên trong hệ thống phần mềm thuộc phạm vi) cộng với con người và các hệ thống phần mềm kết nối trực tiếp đến các thành phần.
Đối tượng dự định: Các kiến trúc sư phần mềm và các nhà phát triển
Đề xuất cho hầu hết các nhóm: Không, chỉ tạo sơ đồ thành phần nếu bạn thấy chúng mang lại giá trị, và cân nhắc việc tự động hóa việc tạo sơ đồ thành phần để có tài liệu lâu dài.
Code diagram
Cuối cùng, bạn có thể phóng to vào mỗi thành phần để hiển thị cách nó được triển khai dưới dạng mã, sử dụng các lớp sơ đồ UML, các sơ đồ quan hệ thực thể hoặc các sơ đồ tương tự.
Đây là một cấp độ chi tiết tùy chọn và thường có sẵn theo yêu cầu từ các công cụ như IDE. Lý tưởng nhất (ideally) là biểu đồ này sẽ được tạo tự động bằng các công cụ (ví dụ như IDS hoặc công cụ mô hình UML), và bạn nên xem xét chỉ hiển thị những thuộc tính và phương thức cho phép bạn kể câu chuyện mà bạn muốn kể. Cấp độ chi tiết này không được đề xuất cho những thành phần ngoài những thành phần trọng hoặc các thành phần phức tạp nhất.
Phạm vi: Một thành phần duy nhất
Các yếu tố chính: Các phần tử mã (ví dụ: classes, interfaces, objects, functions, database tables, etc) bên trong thành phần thuộc phạm vi.
Đối tượng dự định: Các kiến trúc sư phần mềm và các nhà phát triển
Đề xuất cho hầu hết các nhóm: Không, đặc biết đối với tài liệu tồn tại lâu dài bởi vì IDE có thể tạo ra mức độ chi tiết này theo yêu cầu.
(Hết phần 1)