#distributed-systems
#architecture
#backend
Hiểu về Hệ thống Phân tán: Hướng dẫn Thực hành
Tìm hiểu các nguyên tắc cơ bản của hệ thống phân tán, bao gồm thuật toán đồng thuận, định lý CAP và các mẫu thiết kế thực tế.
2 phút đọc
Mục lục
Giới thiệu
Hệ thống phân tán có mặt ở khắp nơi. Mỗi khi bạn gửi tin nhắn, thanh toán hoặc xem video, bạn đang tương tác với các hệ thống phân tán. Nhưng điều gì khiến chúng trở nên thách thức?
Định lý CAP
Định lý CAP phát biểu rằng một hệ thống phân tán chỉ có thể đảm bảo hai trong ba đặc tính:
- Consistency (Nhất quán): Mọi lần đọc đều nhận được dữ liệu mới nhất
- Availability (Sẵn sàng): Mọi yêu cầu đều nhận được phản hồi
- Partition Tolerance (Chịu phân vùng): Hệ thống tiếp tục hoạt động dù mạng bị phân vùng
// Ví dụ: Chọn nhất quán thay vì sẵn sàng
async function writeWithConsistency(key: string, value: string) {
const ackCount = await Promise.all(
replicas.map((r) => r.write(key, value))
);
const majority = Math.floor(replicas.length / 2) + 1;
if (ackCount.filter(Boolean).length < majority) {
throw new Error("Không đạt được đồng thuận");
}
}
Thuật toán Đồng thuận
Raft
Raft là thuật toán đồng thuận được thiết kế để dễ hiểu. Nó tách biệt các yếu tố chính:
- Bầu chọn Leader - Một node được bầu làm leader
- Sao chép Log - Leader gửi entries cho followers
- An toàn - Nếu server đã áp dụng một log entry, không server nào khác áp dụng entry khác cho cùng index
Circuit Breaker Pattern
Ngăn chặn lỗi lan truyền bằng cách phát hiện khi service không khỏe:
class CircuitBreaker {
private failures = 0;
private state: "closed" | "open" | "half-open" = "closed";
async call<T>(fn: () => Promise<T>): Promise<T> {
if (this.state === "open") {
throw new Error("Circuit đang mở");
}
try {
const result = await fn();
this.onSuccess();
return result;
} catch (error) {
this.onFailure();
throw error;
}
}
}
Kết luận
Xây dựng hệ thống phân tán về cơ bản là đánh đổi. Hiểu được các đánh đổi này — nhất quán vs. sẵn sàng, độ trễ vs. throughput — là điều phân biệt kỹ sư giỏi và kỹ sư xuất sắc.