Thiết kế cho sự cố nghĩa là coi lỗi là trạng thái vận hành bình thường, không phải ngoại lệ. Ở quy mô đủ lớn, luôn có node chết, đĩa hỏng, mạng chậm ở đâu đó tại mọi thời điểm.
Nguyên tắc nền:
- Mọi lời gọi qua mạng đều có thể thất bại, chậm, hoặc thành công nhưng phản hồi bị mất — nên thao tác ghi phải idempotent, nếu không retry sẽ tạo dữ liệu trùng.
- Suy giảm có kiểm soát: khi thành phần phụ hỏng thì tắt tính năng đó và giữ luồng chính. Ví dụ mất dịch vụ gợi ý thì hiển thị danh sách phổ biến thay vì trả lỗi cả trang.
- Cẩn thận với fallback: đường fallback ít khi được chạy nên hiếm khi được kiểm chứng, và có thể tự nó gây quá tải khi kích hoạt đồng loạt.
Load shedding là chủ động từ chối một phần request khi quá tải, thay vì nhận hết rồi chậm đều và hỏng toàn cục. Điểm mấu chốt: từ chối phải rẻ và nhanh, và nên ưu tiên theo loại request — giữ lời gọi của người dùng đang chờ, bỏ trước các job nền và request đã quá deadline. Kèm theo là giới hạn kích thước hàng đợi: hàng đợi dài chỉ tích lũy request mà bên gọi đã bỏ.
Chaos engineering là thí nghiệm có kiểm soát trên hệ thống thật để kiểm chứng những giả định trên. Quy trình: nêu giả thuyết về trạng thái ổn định (ví dụ tỷ lệ đặt hàng thành công không đổi), tiêm lỗi thực tế (giết instance, thêm độ trễ mạng, ngắt một AZ), chạy trên lưu lượng thật với phạm vi ảnh hưởng nhỏ, và luôn có nút dừng. Giá trị nằm ở chỗ phát hiện những phụ thuộc ẩn mà sơ đồ kiến trúc không thể hiện.