Không đặt timeout nghĩa là chấp nhận chờ vô hạn. Khi service phía dưới treo, mỗi request đang chờ vẫn giữ một thread, một kết nối và một chỗ trong connection pool. Chỉ vài chục giây, pool cạn và service của bạn ngừng phục vụ cả những request không liên quan tới nhánh hỏng. Đây là con đường điển hình dẫn tới lỗi lan truyền: một dịch vụ chậm kéo theo toàn bộ chuỗi gọi phía trên.
Chọn giá trị timeout:
- Lấy từ phân phối latency thực đo được, không đoán. Một mốc dùng được là p99 nhân hệ số nhỏ (khoảng 1.5-2 lần). Đặt quá dài thì vô nghĩa; đặt quá ngắn thì cắt oan phần đuôi hợp lệ và tự tạo tải retry.
- Timeout phải giảm dần theo chiều sâu chuỗi gọi: nếu API bên ngoài có ngân sách 2 s, lời gọi nội bộ bên trong không được để 3 s. Truyền deadline còn lại xuống dưới để lời gọi sâu không làm việc cho một request mà bên trên đã bỏ.
- Phân biệt connect timeout và read timeout; nhiều thư viện chỉ đặt mặc định cho cái đầu.
Đi kèm timeout:
- Retry có giới hạn với exponential backoff và jitter — chỉ retry lỗi tạm thời và thao tác idempotent.
- Circuit breaker để ngừng gọi khi tỷ lệ lỗi vượt ngưỡng, tránh dồn thêm tải vào dịch vụ đang hỏng.
- Giới hạn số lần retry toàn chuỗi, vì retry ở nhiều tầng nhân lên theo cấp số nhân.