Skip to main content

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à OperationalStructural. Đâ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ế

Tìm Hiểu Kiến Trúc Phần Mềm (Software Architecture) Qua Góc Nhìn Của Một Kiến trúc sư phần mềm (Software Architect)

Architecture Characteristics là gì? Các đặc tính kiến trúc trong phần mềm (Phần 3): Trade-off và Least Worst Architecture

Architecture Characteristics là gì? Các đặc tính kiến trúc trong phần mềm (Phần 2) – Cloud và Cross-Cutting

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àotạ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

Popular posts from this blog

Cloud Native là gì? Tư duy thiết kế hệ thống hiện đại cho thời đại đám mây

Cloud Native đang trở thành nền tảng của hầu hết các hệ thống hiện đại từ Netflix, Amazon đến Google. Nhưng Cloud Native thực sự là gì? Liệu việc đưa ứng dụng lên AWS hay Google Cloud đã đủ để gọi là Cloud Native chưa? Trong bài viết này, chúng ta sẽ tìm hiểu nguồn gốc của khái niệm Cloud Native, bài học từ sự cố AWS năm 2015, và những đặc tính quan trọng giúp các hệ thống hiện đại đạt được khả năng mở rộng, chống chịu và triển khai liên tục. 1. Bài học từ sự cố AWS: Lỗi là “Luật”, không phải “Ngoại lệ” Vào năm 2015, Amazon Web Services (AWS) gặp sự cố sập mạng chấn động. Trong khi các “ông lớn” như Airbnb hay Nest đều bị tê liệt, thì Netflix chỉ bị ảnh hưởng rất nhỏ và phục hồi gần như ngay lập tức. AWS phân vùng các dịch vụ mà nó cung cấp thành các vùng (region) và vùng khả dụng (Availability Zone - AZ). Các vùng ánh xạ đến các khu vực địa lý (như Virginia, California, Oregon) và AZ cung cấp thêm dự phòng và cô lập trong một vùng duy nhất. Hình bên dưới hoàn toàn là giả định (nhưng v...

Kiến trúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 3: Continuous Intelligence và AI thời gian thực

Khi hệ thống đã có khả năng thu thập dữ liệu liên tục và phân tích sự kiện theo thời gian thực, câu hỏi tiếp theo là: liệu máy tính có thể tự đưa ra quyết định thay con người hay không? Kiếntrúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 1: Giá trị củaStreaming và Kiến trúc Streaming Ingest Kiếntrúc cho xử lý dữ liệu luồng (Streaming Architecture) - Phần 2: Real-timeDashboards và Stream Analytics Đó chính là mục tiêu của Continuous Intelligence – giai đoạn cao nhất trong kiến trúc xử lý dữ liệu luồng. Thay vì chỉ hiển thị cảnh báo trên dashboard, hệ thống có thể liên tục huấn luyện mô hình AI, thực hiện suy luận (Inference) ngay khi dữ liệu phát sinh và tự động kích hoạt các hành động phù hợp. Trong bài viết cuối cùng của series Kiến trúc cho xử lý dữ liệu luồng , chúng ta sẽ cùng khám phá cách xây dựng một hệ thống dữ liệu thông minh có khả năng học hỏi, thích nghi và phản ứng gần như theo thời gian thực. 5. Continuous Intelligence (Trí tuệ liên tục) Đây là cấp...

Reinforcement Learning (Học tăng cường) là gì? Hiểu bản chất qua giải thích về cách AI tự học

Nếu học có giám sát giúp AI học từ những đáp án đã biết trước, còn học không giám sát giúp AI tự khám phá cấu trúc của dữ liệu, thì học tăng cường (Reinforcement Learning - RL) lại đi theo một hướng hoàn toàn khác: AI học bằng chính trải nghiệm của mình. Deep Reinforcement Learning là gì? Vì sao AI cần kết hợp Học sâu với Học tăng cường Reinforcement Learning (Học tăng cường) hoạt động như thế nào? Dynamic Programming, Monte Carlo và các ứng dụng thực tế Thay vì được hướng dẫn từng bước, tác nhân (agent) liên tục tương tác với môi trường, thử nhiều hành động khác nhau và nhận phần thưởng hoặc hình phạt. Sau hàng nghìn, thậm chí hàng triệu lần thử nghiệm, AI dần học được chiến lược tối ưu để đạt mục tiêu. Trong bài viết này, chúng ta sẽ cùng tìm hiểu bản chất của học tăng cường, các thành phần quan trọng như Agent, Environment, Reward, Action và Observation, đồng thời minh họa bằng ví dụ trực quan để thấy AI thực sự "học" như thế nào. 1. Học có giám sát (Supervised learni...