Phản hồi lỗi

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

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.

  1. Gửi yêu cầu đến API
  2. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  3. Đợi 1 giây + random_number_milliseconds giây
  4. Thử gửi lại yêu cầu
  5. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  6. Đợi 2 giây + random_number_milliseconds giây
  7. Thử gửi lại yêu cầu
  8. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  9. Đợi 4 giây + random_number_milliseconds giây
  10. Thử gửi lại yêu cầu
  11. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  12. Đợi 8 giây + random_number_milliseconds giây
  13. Thử gửi lại yêu cầu
  14. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  15. Chờ 16 giây + random_number_milliseconds giây
  16. Thử gửi lại yêu cầu
  17. 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."