# Ba bước nào để cải thiện tính khả dụng của hệ thống  ?

Là một Senior Software Engineer, để cải thiện **tính khả dụng (availability)** của một hệ thống, chúng ta cần tập trung vào **khả năng hệ thống phục vụ liên tục, không bị gián đoạn**, ngay cả khi gặp sự cố phần cứng, lỗi phần mềm, hoặc lưu lượng tăng cao.

Dưới đây là **ba bước cơ bản nhưng quan trọng nhất** để cải thiện tính khả dụng của hệ thống:

***

#### **1. Tăng cường dự phòng (Redundancy)**

> **Mục tiêu**: Không có điểm đơn (Single Point of Failure).

* **Triển khai nhiều instance/service** trên nhiều máy chủ hoặc container.
* **Dự phòng cơ sở dữ liệu**:
  * Sử dụng cơ chế **replication** (ví dụ: Master-Slave hoặc Multi-Master).
* **Load Balancer**:
  * Sử dụng để phân phối request giữa các instance và phát hiện instance bị lỗi.

📌 *Ví dụ*: Trong hệ thống sử dụng Spring Boot, bạn có thể triển khai nhiều instance của cùng một service phía sau một load balancer như Nginx hoặc một service discovery như **Eureka + Ribbon**.

***

#### **2. Triển khai cơ chế phát hiện lỗi và tự phục hồi (Failure Detection & Recovery)**

> **Mục tiêu**: Hệ thống phải tự động phát hiện lỗi và tiếp tục hoạt động.

* **Health check endpoints** (`/actuator/health` trong Spring Boot).
* Sử dụng **Kubernetes liveness/readiness probes** để tự động restart pod bị lỗi.
* Thiết lập **circuit breaker** (ví dụ: Resilience4j, Hystrix) để cô lập lỗi.
* **Retry + Timeout** logic hợp lý ở client side.

📌 *Ví dụ*: Dùng Spring Cloud Resilience4j để fallback khi một service khác không phản hồi, tránh làm sập toàn bộ hệ thống.

***

#### **3. Thiết kế hệ thống theo hướng chịu lỗi (Fault-Tolerant Architecture)**

> **Mục tiêu**: Ngay cả khi có lỗi, hệ thống vẫn phục vụ được (ít nhất là một phần chức năng).

* **Tách biệt các service quan trọng (Service Isolation)**:
  * Ví dụ: Đặt các service như thanh toán, đăng nhập, tìm kiếm tách biệt, có thể hoạt động độc lập.
* Sử dụng **message queue** (Kafka, RabbitMQ) để giảm phụ thuộc đồng bộ giữa các service.
* Áp dụng **graceful degradation** – nếu một phần hệ thống bị lỗi, phần còn lại vẫn hoạt động (ví dụ: tắt phần gợi ý sản phẩm nhưng vẫn cho phép thanh toán).

📌 *Ví dụ*: Nếu hệ thống đánh giá sản phẩm bị lỗi, vẫn cho phép người dùng mua sản phẩm bình thường.

***

#### Kết luận

| Bước                            | Mục tiêu                     | Công cụ/Thực tiễn                              |
| ------------------------------- | ---------------------------- | ---------------------------------------------- |
| 1. Redundancy                   | Không có điểm chết           | Load Balancer, Replication                     |
| 2. Failure Detection & Recovery | Phát hiện lỗi và tự phục hồi | Health Checks, Retry, Circuit Breaker          |
| 3. Fault-Tolerant Design        | Hệ thống vẫn chạy khi có lỗi | Queue, Service Isolation, Graceful Degradation |

Nếu bạn đang xây hệ thống microservices như bạn đang làm với OCOP, việc kết hợp **Spring Cloud**, **Eureka**, **Gateway**, **Resilience4j**, và triển khai trên **Docker + Kubernetes** sẽ giúp bạn đạt tính khả dụng cao.
