Exponential Backoff & Jitter: Chìa Khóa Vàng Giúp Ứng Dụng Của Bạn Bất Chấp Lỗi Mạng!
Lê Lân
2
Thuật Toán Exponential Backoff Trong Retry Request: Giải Pháp Tối Ưu Cho Hệ Thống Phân Tán
Mở Đầu
Trong thế giới lý tưởng, mọi yêu cầu mạng sẽ hoàn thành ngay lập tức và thành công. Nhưng trong thực tế, API có thể lỗi, mạng đứt kết nối, máy chủ có thể bị quá tải hoặc gặp sự cố tạm thời. Thay vì bỏ cuộc ngay sau lần thử đầu tiên thất bại, việc retry với chiến lược thông minh sẽ giúp ứng dụng của bạn trở nên kiên cường và ổn định hơn.
Thuật toán Exponential Backoff đã được chứng minh là một phương pháp hiệu quả và tôn trọng tài nguyên hệ thống khi retry các yêu cầu mạng hay API. Bài viết sẽ giải thích chi tiết tại sao yêu cầu mạng thường thất bại, những vấn đề khi retry sơ khai, cơ chế hoạt động của exponential backoff, cách thêm jitter, ví dụ triển khai thực tế và các best practice mà bạn cần biết khi áp dụng.
Tại Sao Yêu Cầu Mạng Thường Thất Bại? 🚧
API hoặc các dịch vụ bên dưới có thể gặp các lỗi tạm thời khiến câu request không thành công như:
🌐 Timeout mạng: kết nối bị ngắt quãng hoặc mất thời gian phản hồi lâu
📶 Sự cố internet tạm thời: đứt cáp, mất tín hiệu hoặc chuyển vùng
🚦 Rate limiting (429 Too Many Requests): máy chủ giới hạn số lượng yêu cầu trong một khoảng thời gian
🔧 Quá tải máy chủ (5xx errors): server xử lý không kịp hoặc đang bảo trì
Trong các trường hợp này, việc thử lại request sau một khoảng thời gian chờ hợp lý thường sẽ thành công.
Vấn Đề Với Retry Đơn Giản ✅
Nếu mọi client đều cố gắng retry ngay tức thì sau khi thất bại, server sẽ bị quá tải do lượng request đồng thời tăng đột biến. Hiện tượng này còn gọi là thundering herd problem (bầy cừu đồng loạt lao vào làm server quá tải). Kết quả là hệ thống càng thêm suy yếu dẫn đến lỗi nghiêm trọng hơn.
Chúng ta cần một cách retry thông minh hơn — không retry ngay lập tức mà có sự điều chỉnh về thời gian chờ giữa các lần thử, giúp giảm tải cho server trong giai đoạn phục hồi.
Exponential Backoff Là Gì? ⏳
Exponential backoff là thuật toán tăng thời gian chờ giữa các lần retry theo hàm mũ để tránh gây tắc nghẽn cho hệ thống.
Công Thức Tính Thời Gian Chờ
Trong đó:
baseDelay là khoảng thời gian chờ cơ bản (ví dụ 500ms)
attemptNumber là số lần retry đã thực hiện
Ví Dụ Thời Gian Chờ Với Base Delay = 500ms
Lần retry
Thời gian chờ (ms)
1
500
2
1,000
3
2,000
4
4,000
5
8,000
Việc tăng dần thời gian chờ giúp giảm nhanh số request đồng thời, tạo cơ hội cho server phục hồi.
Thêm Jitter Để Tránh Đồng Bộ Hóa 🔀
Khi tất cả client đều retry theo cùng một chu kỳ, chúng sẽ đồng loạt gửi request sau khoảng thời gian chờ nhất định gây ra hiện tượng “đồng hồ sinh học” (synchronized retries), làm tăng áp lực lên server.
Jitter là cách thêm yếu tố ngẫu nhiên vào thời gian delay giúp phân tán request đồng thời tránh tắc nghẽn.
Trong hệ thống phân tán hiện đại, lỗi không phải là ngoại lệ mà là điều được mong đợi. Việc cập nhật chiến lược retry thông minh với thuật toán exponential backoff kèm jitter giúp hệ thống trở nên kiên cường hơn, thân thiện hơn với server và phù hợp triển khai trong môi trường thực tế.
Đừng retry một cách mù quáng! Hãy cân nhắc kỹ thuật thuật toán, giới hạn retry và tránh đồng bộ để có hiệu quả tối ưu. Việc xử lý lỗi có dụng ý cũng là cách giúp ứng dụng của bạn hoàn thiện và tạo ra trải nghiệm người dùng tốt hơn.