Phản hồi lỗi chuẩn
Nếu yêu cầu API Báo cáo thành công, API sẽ trả về một 200
.
Nếu xảy ra lỗi với một yêu cầu, API sẽ trả về mã trạng thái HTTP, trạng thái và lý do trong phản hồi dựa trên loại lỗi.
Ngoài ra, phần nội dung của phản hồi còn chứa nội dung mô tả chi tiết về nguyên nhân gây ra lỗi. Dưới đây là ví dụ về một phản hồi lỗi:
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED"
}
}
Bảng lỗi
Mã | Trạng thái | Nội dung mô tả | Việc nên làm |
---|---|---|---|
400 | INVALID_ARGUMENT |
Yêu cầu không hợp lệ; một đối số bắt buộc có thể bị thiếu, vượt quá giới hạn hoặc có giá trị không hợp lệ. | Xem thông báo lỗi để biết chi tiết. Lỗi này sẽ không thành công nữa nếu ứng dụng thử lại. |
401 | UNAUTHENTICATED |
Ứng dụng không được xác thực đúng cách. | Đừng thử lại mà không khắc phục sự cố. Bạn cần nhận mã thông báo xác thực mới. |
403 | PERMISSION_DENIED |
Cho biết yêu cầu đối với dữ liệu mà người dùng không có quyền truy cập. | Đừng thử lại mà không khắc phục sự cố. Bạn cần có đủ quyền để thực hiện thao tác trên thực thể được chỉ định. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d |
Cho biết rằng hạn mức số yêu cầu mỗi ngày cho mỗi dự án đã hết. | Đừng thử lại mà không khắc phục sự cố. Bạn đã dùng hết hạn mức hằng ngày. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 |
Cho biết rằng đã dùng hết hạn mức số yêu cầu trong mỗi 100 giây cho mỗi dự án. | Thử sử dụng lại phương pháp thời gian đợi luỹ thừa. Bạn cần giảm tốc độ gửi yêu cầu. |
429 | RESOURCE_EXHAUSTED AnalyticsDefaultGroupUSER-100 |
Cho biết rằng đã hết hạn mức số yêu cầu cho mỗi 100 giây cho mỗi người dùng cho mỗi dự án. | Thử sử dụng lại phương pháp thời gian đợi luỹ thừa. Bạn cần giảm tốc độ gửi yêu cầu. |
429 | RESOURCE_EXHAUSTED DiscoveryGroupCLIENT_PROJECT-100 |
Cho biết rằng hạn mức yêu cầu mỗi 100 giây khám phá đã hết. | Phản hồi khám phá không thay đổi thường xuyên; lưu phản hồi khám phá vào bộ nhớ đệm cục bộ hoặc thử lại bằng tính năng thời gian đợi luỹ thừa. Bạn cần giảm tốc độ gửi yêu cầu. |
500 | INTERNAL |
Đã xảy ra lỗi máy chủ nội bộ ngoài dự kiến. | Đừng thử lại truy vấn này nhiều lần. |
503 | BACKEND_ERROR |
Máy chủ đã trả về một lỗi. | Đừng thử lại truy vấn này nhiều lần. |
503 | UNAVAILABLE |
Dịch vụ này không thể xử lý yêu cầu. | Đây rất có thể là một tình trạng tạm thời và có thể được khắc phục bằng cách thử lại bằng phương pháp thời gian đợi luỹ thừa. |
Triển khai thuật toán thời gian đợi luỹ thừa
Thời gian đợi luỹ thừa là quá trình máy khách định kỳ thử lại một yêu cầu không thành công trong một khoảng thời gian tăng dần. Đây là một chiến lược xử lý lỗi tiêu chuẩn cho các ứng dụng mạng. API Báo cáo được thiết kế với kỳ vọng rằng các ứng dụng chọn thử lại các yêu cầu không thành công sẽ thực hiện bằng cách sử dụng thuật toán thời gian đợi luỹ thừa. Ngoài việc là "bắt buộc", việc sử dụng thuật toán thời gian đợi luỹ thừa giúp tăng hiệu quả sử dụng băng thông, giảm số lượng yêu cầu cần thiết để nhận được phản hồi thành công và tối đa hoá công suất yêu cầu trong các môi trường đồng thời.
Quy trình triển khai thuật toán thời gian đợi luỹ thừa đơn giản như sau.
- Gửi yêu cầu đến API
- Nhận phản hồi lỗi có mã lỗi có thể thử lại
- Đợi 1 giây +
random_number_milliseconds
giây - Thử gửi lại yêu cầu
- Nhận phản hồi lỗi có mã lỗi có thể thử lại
- Đợi 2 giây +
random_number_milliseconds
giây - Thử gửi lại yêu cầu
- Nhận phản hồi lỗi có mã lỗi có thể thử lại
- Đợi 4 giây +
random_number_milliseconds
giây - Thử gửi lại yêu cầu
- Nhận phản hồi lỗi có mã lỗi có thể thử lại
- Đợi 8 giây +
random_number_milliseconds
giây - Thử gửi lại yêu cầu
- Nhận phản hồi lỗi có mã lỗi có thể thử lại
- Chờ 16 giây +
random_number_milliseconds
giây - Thử gửi lại yêu cầu
- Nếu bạn vẫn gặp lỗi, hãy dừng lại và ghi lại lỗi đó.
Trong quy trình trên, random_number_milliseconds
là một số mili giây ngẫu nhiên nhỏ hơn hoặc bằng 1000. Việc này là cần thiết để tránh một số lỗi khoá nhất định trong một số quá trình triển khai đồng thời.
random_number_milliseconds
phải được xác định lại sau mỗi lần chờ.
Lưu ý: thời gian chờ luôn là (2 ^ n) + random_number_milliseconds
, trong đó n là một số nguyên tăng đơn điệu được xác định ban đầu là 0. n được tăng thêm 1 cho mỗi lần lặp (mỗi yêu cầu).
Thuật toán sẽ được đặt để kết thúc khi n là 5. Mức trần này chỉ được áp dụng để ngăn ứng dụng thử lại vô hạn, dẫn đến độ trễ tổng cộng khoảng 32 giây trước khi một yêu cầu bị coi là "lỗi không thể khôi phục".
Đoạn mã Python sau đây là cách triển khai quy trình ở trên để khôi phục sau các lỗi xảy ra trong phương thức có tên là makeRequest
.
import random import time from apiclient.errors import HttpError def makeRequestWithExponentialBackoff(analytics): """Wrapper to request Google Analytics data with exponential backoff. The makeRequest method accepts the analytics service object, makes API requests and returns the response. If any error occurs, the makeRequest method is retried using exponential backoff. Args: analytics: The analytics service object Returns: The API response from the makeRequest method. """ for n in range(0, 5): try: return makeRequest(analytics) except HttpError, error: if error.resp.reason in ['userRateLimitExceeded', 'quotaExceeded', 'internalServerError', 'backendError']: time.sleep((2 ** n) + random.random()) else: break print "There has been an error, the request never succeeded."