Sam Newman nhấn mạnh 3 khái niệm cốt lõi nhất định phải hiểu trong hệ thống phân tán là Timeouts (timeout), Retries (thử lại) và Idempotency (tính idempotent).
Ông cho rằng cần xử lý chính xác các khái niệm nền tảng này trước, còn quan trọng hơn cả những thuật toán phân tán phức tạp như Paxos hay Raft.
Ba tiền đề cơ bản của hệ thống phân tán
- Thông tin không được truyền đi ngay lập tức.
- Hệ thống phía bên kia có thể không phản hồi.
- Tài nguyên là hữu hạn.
Ba điều này là nguyên nhân gốc rễ tạo ra mọi độ phức tạp của hệ thống phân tán.
Timeouts (timeout)
Nếu một yêu cầu không hoàn tất trong khoảng thời gian nhất định thì cần phải dừng nó lại.
Nếu chiếm dụng tài nguyên quá lâu, hệ thống có thể bị quá tải và gây bất tiện cho người dùng.
Newman giải thích rằng “timeout là việc ưu tiên sức khỏe của toàn bộ hệ thống hơn là thành công của một yêu cầu đơn lẻ”.
Điểm quan trọng
- Nắm được thời gian thực thi trung bình và kỳ vọng của người dùng
- Giá trị cấu hình phải có thể thay đổi linh hoạt mà không cần sửa mã
Retries (thử lại)
Thử lại quá mức có thể trở thành một cuộc tấn công DoS tự gây ra đối với hệ thống.
Thử lại là cần thiết, nhưng phải đồng thời cân nhắc giới hạn ở phía client và server cùng với network jitter.
Newman cảnh báo rằng thêm jitter là tốt, nhưng exponential backoff đôi khi lại có thể làm tăng gánh nặng cho hệ thống.
Idempotency (tính idempotent)
Dù gửi yêu cầu nhiều lần thì kết quả vẫn phải giống nhau.
Đây chủ yếu là trách nhiệm ở phía server và là điều kiện tiên quyết để việc thử lại được an toàn.
Kịch bản thực tế
- Trường hợp yêu cầu không đến được server: không có gì xảy ra
- Trường hợp server đã xử lý nhưng phản hồi bị ngắt: thay đổi đã được áp dụng nhưng client không biết → cần tính idempotent
Cách triển khai
- Dùng request ID: gán định danh để client có thể cho biết đây là yêu cầu lặp lại
- Cách dùng fingerprint: xác định trùng lặp dựa trên hash của nội dung yêu cầu, v.v. (không nên dùng thông tin thời gian)
Kết luận
Bắt đầu bằng việc trích dẫn câu nói “lặp lại cùng một hành động nhưng mong đợi kết quả khác là điên rồ”,
nhưng Newman cho rằng trong hệ thống phân tán, thử lại đôi khi lại là một lựa chọn hợp lý.
Tuy nhiên, ông nhấn mạnh rằng thử lại nhất định phải được thực hiện an toàn, và để làm được điều đó thì timeout và tính idempotent phải được thiết kế cùng nhau.
1 bình luận
cầu dao mạch~