Architecture Characteristics là gì? Các đặc tính kiến trúc trong phần mềm (Phần 1): Operational và Structural
Khi tìm hiểu về Software Architecture, nhiều lập trình viên thường tập trung vào các mẫu kiến trúc như Layered Architecture, Microservices hay Event-Driven Architecture. Tuy nhiên, trước khi quyết định lựa chọn bất kỳ kiến trúc nào, kiến trúc sư phần mềm cần trả lời một câu hỏi quan trọng hơn: hệ thống cần được tối ưu cho điều gì? Câu trả lời nằm ở các Architecture Characteristics (đặc tính kiến trúc) — những thuộc tính quyết định hệ thống sẽ vận hành ra sao, thay vì chỉ mô tả hệ thống phải làm gì.
Trong bài viết này, chúng ta sẽ tìm hiểu khái niệm Architecture Characteristics, ba tiêu chí để nhận diện một đặc tính kiến trúc và hai nhóm đặc tính quan trọng nhất là Operational và Structural. Đây là nền tảng giúp bạn hiểu vì sao các quyết định kiến trúc lại khác nhau giữa từng hệ thống và từng bối cảnh kinh doanh.Architecture Quantum là gì? Giải thích Lượng tử Kiến trúc trong Software Architecture
Architecture Quantum (Lượng tử kiến trúc) qua 8 ví dụ thực tế
1. Architecture Characteristics (Đặc tính kiến trúc) là gì?
Trong khi các yêu cầu nghiệp vụ (domain requirements) xác định hệ thống làm cái gì (ví dụ: cho phép đặt hàng), thì các đặc tính kiến trúc xác định hệ thống vận hành như thế nào và tại sao nó thành công.
Một hệ thống có thể hỗ trợ
hàng chục đặc tính khác nhau, nhưng kiến trúc sư không nên tham lam. Mỗi
đặc tính được thêm vào sẽ làm tăng độ phức tạp của thiết kế.
Nguyên tắc "Ít hơn
là tốt hơn": Kiến trúc sư nên nỗ lực chọn ra số lượng
đặc tính ít nhất có thể thay vì nhiều nhất có thể. Việc cố gắng hỗ trợ
quá nhiều thứ sẽ dẫn đến những giải pháp chung chung, cồng kềnh và khó vận
hành.
Phân biệt Đặc tính Tường minh và Ngầm định
- Đặc tính tường minh (Explicit):
Những thứ xuất hiện rõ ràng trong tài liệu yêu cầu, như "phải chịu tải
được 100.000 người dùng đồng thời".
- Đặc tính ngầm định (Implicit): Những thứ hiếm khi được ghi ra nhưng mặc định phải có, như tính khả dụng (availability), độ tin cậy (reliability) và bảo mật. Kiến trúc sư phải dùng kiến thức miền nghiệp vụ để "khơi gợi" ra những đặc tính này (ví dụ: một hệ thống giao dịch chứng khoán mặc định phải có độ trễ cực thấp dù khách hàng có yêu cầu hay không).
2. Nhóm Đặc tính Vận hành (Operational)
Nhóm này tập trung vào
các khả năng vận hành của hệ thống khi chạy:
Availability (Tính khả dụng)
Đây là khả năng hệ thống
luôn sẵn sàng phục vụ người dùng khi họ cần. Một hệ thống có tính khả dụng cao
sẽ giảm thiểu thời gian ngừng hoạt động (downtime), giúp người dùng có thể truy
cập và sử dụng dịch vụ gần như liên tục.
Ví dụ, một trang thương mại
điện tử hoạt động 24/7 cần đảm bảo khách hàng vẫn có thể tìm kiếm sản phẩm, đặt
hàng và thanh toán vào bất kỳ thời điểm nào. Nếu hệ thống ngừng hoạt động trong
vài giờ vào dịp khuyến mãi lớn, doanh nghiệp có thể mất rất nhiều doanh thu và
làm giảm lòng tin của khách hàng.
Continuity (Tính liên tục)
Là khả năng duy trì các
hoạt động kinh doanh quan trọng ngay cả khi xảy ra những sự cố lớn như mất điện,
thiên tai, cháy nổ, tấn công mạng hoặc sự cố tại trung tâm dữ liệu. Nếu
Availability tập trung vào việc giảm downtime trong vận hành hàng ngày thì
Continuity tập trung vào việc đảm bảo doanh nghiệp vẫn có thể tiếp tục hoạt động
trong các tình huống khẩn cấp.
Ví dụ, một ngân hàng có
trung tâm dữ liệu chính tại Hà Nội. Nếu trung tâm này gặp sự cố nghiêm trọng, hệ
thống sẽ tự động chuyển sang trung tâm dữ liệu dự phòng ở thành phố khác để
khách hàng vẫn có thể giao dịch mà chỉ bị gián đoạn trong thời gian rất ngắn.
Performance (Hiệu suất)
Là khả năng xử lý công việc
nhanh chóng và hiệu quả. Đặc tính này phản ánh tốc độ phản hồi của hệ thống, số
lượng yêu cầu có thể xử lý trong một khoảng thời gian và mức độ sử dụng tài
nguyên như CPU, bộ nhớ và mạng.
Ví dụ, khi người dùng tìm
kiếm một sản phẩm trên website, kết quả nên xuất hiện trong vòng vài trăm mili
giây thay vì phải chờ nhiều giây. Một hệ thống có hiệu năng tốt sẽ phục vụ nhiều
người dùng đồng thời mà vẫn duy trì tốc độ phản hồi ổn định.
Recoverability (Khả năng phục hồi)
Là khả năng khôi phục hệ
thống về trạng thái hoạt động bình thường sau khi xảy ra sự cố. Điều này bao gồm
việc phục hồi dữ liệu, khởi động lại các dịch vụ và giảm thiểu thời gian gián
đoạn.
Ví dụ, nếu một máy chủ cơ
sở dữ liệu gặp lỗi phần cứng, hệ thống có thể tự động chuyển sang bản sao dự
phòng, sau đó khôi phục dữ liệu bị mất từ bản sao lưu hoặc nhật ký giao dịch.
Người dùng có thể chỉ nhận thấy một khoảng gián đoạn rất ngắn.
Reliability/Safety (Độ tin cậy/An toàn)
Là một đặc tính kiến trúc
(architecture characteristic) mô tả khả năng của hệ thống hoạt động chính xác, ổn
định và an toàn ngay cả khi xảy ra lỗi, sự cố hoặc các tình huống bất thường. Mục
tiêu của đặc tính này là đảm bảo người dùng có thể tin tưởng vào kết quả mà hệ
thống tạo ra, đồng thời giảm thiểu nguy cơ gây thiệt hại về dữ liệu, tài sản hoặc
con người.
Mặc dù thường được nhắc
cùng nhau, Reliability (độ tin cậy) và Safety (độ an toàn) là hai khái niệm
khác nhau.
Reliability
tập trung vào việc hệ thống có thực hiện đúng chức năng đã thiết kế hay không.
Một hệ thống có độ tin cậy cao sẽ hoạt động liên tục trong thời gian dài, ít gặp
lỗi và khi xảy ra sự cố vẫn có khả năng phục hồi để tiếp tục cung cấp dịch vụ.
Ví dụ, một hệ thống ngân hàng trực tuyến phải luôn tính toán chính xác số dư
tài khoản, không làm mất giao dịch ngay cả khi máy chủ gặp sự cố hoặc mất kết nối
mạng.
Safety
lại quan tâm đến việc hệ thống có gây ra hậu quả nguy hiểm hay không khi xảy ra
lỗi. Một hệ thống có thể không còn hoạt động bình thường nhưng vẫn phải đảm bảo
không gây tổn hại cho con người hoặc tài sản. Chẳng hạn, phần mềm điều khiển
thang máy nếu phát hiện cảm biến cửa gặp lỗi sẽ không cho phép thang máy di
chuyển thay vì tiếp tục vận hành trong trạng thái nguy hiểm. Tương tự, phần mềm
điều khiển máy truyền dịch trong bệnh viện nếu không xác định được chính xác tốc
độ truyền thuốc sẽ tự động dừng bơm và phát cảnh báo thay vì tiếp tục truyền với
tốc độ không kiểm soát.
Nói cách khác,
Reliability trả lời câu hỏi "Hệ thống có tiếp tục hoạt động đúng
không?", còn Safety trả lời câu hỏi "Nếu hệ thống hoạt động sai thì hậu
quả có được kiểm soát không?" Một hệ thống có thể rất đáng tin cậy nhưng
chưa chắc đã an toàn. Ví dụ, một robot công nghiệp có thể hoạt động liên tục
nhiều tháng không gặp lỗi (độ tin cậy cao), nhưng nếu khi cảm biến phát hiện
người đi vào vùng nguy hiểm mà robot vẫn tiếp tục chuyển động thì hệ thống đó
không an toàn. Ngược lại, một hệ thống có thể thường xuyên dừng hoạt động khi
phát hiện dấu hiệu bất thường (độ tin cậy không cao) nhưng lại rất an toàn vì
luôn ưu tiên tránh gây tai nạn.
Tóm lại,
Reliability/Safety không chỉ hướng tới việc hệ thống hoạt động ổn định mà còn đảm
bảo rằng khi lỗi là điều không thể tránh khỏi, hệ thống vẫn bảo vệ dữ liệu, tài
sản và con người khỏi những hậu quả nghiêm trọng. Đây là một trong những đặc
tính kiến trúc quan trọng nhất đối với các hệ thống tài chính, y tế, giao
thông, công nghiệp và mọi lĩnh vực mà một lỗi nhỏ cũng có thể dẫn đến thiệt hại
lớn.
Robustness (Tính vững chắc)
Là khả năng tiếp tục hoạt
động đúng hoặc ở mức chấp nhận được ngay cả khi gặp dữ liệu không hợp lệ, lỗi
phần mềm, lỗi phần cứng hoặc các điều kiện bất thường mà hệ thống không mong muốn.
Ví dụ, một dịch vụ nhận dữ
liệu từ nhiều hệ thống bên ngoài không nên bị sập chỉ vì một bản ghi có định dạng
sai. Thay vào đó, hệ thống nên bỏ qua bản ghi lỗi, ghi log và tiếp tục xử lý
các bản ghi còn lại.
Scalability (Khả năng mở rộng)
Là khả năng đáp ứng khối
lượng công việc ngày càng tăng mà vẫn duy trì hiệu năng ở mức chấp nhận được.
Khi số lượng người dùng hoặc dữ liệu tăng lên, hệ thống có thể mở rộng tài
nguyên thay vì phải thiết kế lại từ đầu.
Ví dụ, một nền tảng xem
video có thể chỉ phục vụ vài nghìn người dùng lúc mới ra mắt. Sau vài năm, lượng
người dùng tăng lên hàng chục triệu. Nếu kiến trúc có khả năng mở rộng tốt,
doanh nghiệp chỉ cần bổ sung thêm máy chủ hoặc tài nguyên điện toán để đáp ứng
nhu cầu mà không phải viết lại toàn bộ hệ thống.
Có hai cách mở rộng phổ
biến. Theo chiều dọc - Vertical Scaling (Scale Up) là tăng tài nguyên
cho một máy chủ, chẳng hạn nâng cấp CPU hoặc RAM. Theo chiều ngang - Horizontal
Scaling (Scale Out) là bổ sung thêm nhiều máy chủ để cùng xử lý khối lượng
công việc. Trong các hệ thống hiện đại, Horizontal Scaling thường được ưu tiên
vì cho phép mở rộng linh hoạt và tăng khả năng chịu lỗi.
Tóm lại: Availability
chú trọng việc hệ thống luôn hoạt động; Continuity đảm bảo hoạt động
kinh doanh vẫn tiếp diễn trong các tình huống thảm họa; Performance tập
trung vào tốc độ và hiệu quả xử lý; Recoverability nhấn mạnh khả năng
khôi phục sau sự cố; Robustness giúp hệ thống chịu được các điều kiện bất
thường mà không bị sập; còn Scalability đảm bảo hệ thống có thể phát triển
cùng với nhu cầu ngày càng tăng của người dùng và dữ liệu. Chúng thường được kết
hợp trong kiến trúc phần mềm hiện đại để xây dựng những hệ thống vừa nhanh, ổn
định, linh hoạt và có khả năng vận hành lâu dài.
3. Nhóm Đặc tính Cấu trúc (Structural)
Nhóm này tập trung vào
các khía cạnh bên trong và cấu trúc mã nguồn:
Configurability (Khả năng cấu hình)
Là khả năng thay đổi hành
vi của hệ thống thông qua các thiết lập cấu hình mà không cần sửa mã nguồn hoặc
triển khai lại phần mềm. Một hệ thống có khả năng cấu hình tốt cho phép quản trị
viên hoặc người dùng điều chỉnh các tham số để đáp ứng những nhu cầu khác nhau
mà không phải nhờ đến lập trình viên.
Ví dụ, một hệ thống quản
lý bán hàng có thể cho phép cấu hình thuế suất, đơn vị tiền tệ, ngôn ngữ, quy
trình phê duyệt đơn hàng hoặc thời gian hết hạn phiên đăng nhập thông qua file
cấu hình hoặc giao diện quản trị. Khi doanh nghiệp thay đổi chính sách thuế, quản
trị viên chỉ cần cập nhật cấu hình thay vì yêu cầu nhóm phát triển sửa mã nguồn.
Extensibility (Khả năng mở
rộng chức năng)
Là khả năng bổ sung các
tính năng mới mà không phải thay đổi đáng kể các thành phần hiện có của hệ thống.
Một hệ thống có khả năng mở rộng chức năng tốt sẽ dễ thích nghi với các yêu cầu
kinh doanh mới và giảm nguy cơ làm hỏng những chức năng đã hoạt động ổn định.
Ví dụ, một nền tảng
thương mại điện tử ban đầu chỉ hỗ trợ thanh toán bằng thẻ tín dụng. Sau này
doanh nghiệp muốn bổ sung ví điện tử hoặc chuyển khoản ngân hàng. Nếu kiến trúc
được thiết kế theo hướng mở rộng, nhóm phát triển chỉ cần thêm một mô-đun thanh
toán mới mà không phải sửa đổi toàn bộ hệ thống thanh toán hiện tại.
Installability (Khả năng cài đặt)
Là khả năng cài đặt, triển
khai và cấu hình hệ thống một cách dễ dàng, nhanh chóng và ít xảy ra lỗi. Một hệ
thống có Installability tốt giúp giảm công sức của đội ngũ vận hành và rút ngắn
thời gian đưa phần mềm vào sử dụng.
Ví dụ, một ứng dụng web
hiện đại có thể được triển khai chỉ bằng một lệnh Docker Compose hoặc
Kubernetes Manifest thay vì phải cài đặt thủ công hàng chục thành phần như web
server, cơ sở dữ liệu, thư viện và các biến môi trường.
Leverageability / Reuse
(Khả năng tái sử dụng)
Là khả năng sử dụng lại
các thành phần, thư viện, dịch vụ hoặc mô-đun trong nhiều hệ thống khác nhau. Mục
tiêu là giảm thời gian phát triển, giảm chi phí bảo trì và nâng cao tính nhất
quán giữa các ứng dụng.
Ví dụ, một doanh nghiệp
có thể xây dựng một dịch vụ xác thực người dùng (Authentication Service) dùng
chung cho tất cả các ứng dụng như website, ứng dụng di động và cổng quản trị.
Thay vì mỗi nhóm phát triển tự xây dựng chức năng đăng nhập riêng, tất cả đều sử
dụng cùng một dịch vụ.
Localization (Khả năng bản địa hóa)
Là khả năng điều chỉnh hệ
thống để phù hợp với ngôn ngữ, văn hóa và quy định của từng quốc gia hoặc khu vực
mà không cần thay đổi logic nghiệp vụ.
Ví dụ, cùng một hệ thống
thương mại điện tử nhưng người dùng Việt Nam sẽ thấy giá bằng đồng Việt Nam, định
dạng ngày theo kiểu "dd/MM/yyyy" và giao diện tiếng Việt, trong khi
người dùng Nhật Bản sẽ thấy đồng Yên, định dạng ngày khác và giao diện tiếng Nhật.
Maintainability (Khả năng
bảo trì)
Là khả năng sửa lỗi, cải
tiến và bổ sung tính năng của hệ thống một cách dễ dàng với chi phí và rủi ro
thấp. Đây là một trong những đặc tính quan trọng nhất vì phần lớn chi phí của
phần mềm phát sinh sau khi hệ thống đã được đưa vào vận hành.
Ví dụ, nếu một quy định
pháp luật thay đổi khiến cách tính thuế phải được cập nhật, một hệ thống có
Maintainability cao sẽ chỉ cần sửa đổi một số mô-đun liên quan thay vì phải chỉnh
sửa ở nhiều nơi trong mã nguồn.
Portability (Khả năng di chuyển)
Là khả năng chạy hệ thống
trên nhiều nền tảng, hệ điều hành, môi trường hoặc nhà cung cấp hạ tầng khác
nhau với ít hoặc không cần thay đổi mã nguồn.
Ví dụ, một ứng dụng được
đóng gói bằng Docker có thể chạy trên máy tính của lập trình viên, trên máy chủ
nội bộ hoặc trên các nền tảng đám mây khác nhau như AWS, Azure hay Google Cloud
mà không cần sửa đổi chương trình.
Upgradeability (Khả năng nâng cấp)
Là khả năng nâng cấp phần
mềm lên phiên bản mới mà không gây gián đoạn lớn đến hoạt động của hệ thống hoặc
ảnh hưởng đến dữ liệu và người dùng.
Ví dụ, một dịch vụ trực
tuyến có thể triển khai phiên bản mới theo từng nhóm máy chủ bằng kỹ thuật
rolling update. Trong suốt quá trình nâng cấp, người dùng vẫn tiếp tục sử dụng
dịch vụ mà hầu như không nhận thấy sự thay đổi.
Nhìn chung, các đặc tính này đều hướng tới khả năng tiến hóa (evolvability) của phần mềm. Tuy nhiên, mỗi đặc tính tập trung vào một khía cạnh khác nhau: Configurability giúp thay đổi hành vi thông qua cấu hình; Extensibility tạo điều kiện bổ sung chức năng mới; Installability đơn giản hóa việc triển khai; Leverageability/Reuse tận dụng lại các thành phần sẵn có; Localization hỗ trợ nhiều quốc gia và khu vực; Maintainability giảm chi phí bảo trì lâu dài; Portability cho phép phần mềm hoạt động trên nhiều môi trường; còn Upgradeability đảm bảo việc nâng cấp diễn ra an toàn và liên tục. Khi được kết hợp hợp lý, chúng giúp hệ thống có tuổi thọ cao, dễ thích ứng với thay đổi và giảm đáng kể chi phí phát triển cũng như vận hành trong suốt vòng đời của phần mềm.
Comments
Post a Comment