Phản hồi lỗi

Phản hồi về lỗi chuẩn

Nếu yêu cầu API Báo cáo thành công, API này 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ề 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ệ; đố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ệ. Hãy xem lại thông báo lỗi để biết thông tin chi tiết. Lỗi này sẽ tiếp tục xảy ra nếu ứng dụng thử lại.
401 UNAUTHENTICATED Khách hàng không được xác thực đúng cách. Đừng thử lại mà không khắc phục vấn đề. 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 vấn đề. Bạn cần có đủ quyền để thực hiện thao tác trên thực thể đã chỉ định.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-1d Cho biết rằng số yêu cầu mỗi ngày cho mỗi dự án hạn mức đã hết. Đừng thử lại mà không khắc phục vấn đề. Bạn đã sử dụng hết hạn mức hằng ngày.
429 RESOURCE_EXHAUSTED AnalyticsDefaultGroupCLIENT_PROJECT-100 Cho biết rằng hạn mức yêu cầu mỗi 100 giây của mỗi dự án đã hết. Thử lại bằng cách sử dụng 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ạn mức yêu cầu/100 giây của mỗi người dùng trong mỗi dự án đã hết. Thử lại bằng cách sử dụng 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 của chiến dịch Khám phá đã hết. Phản hồi khám phá không thường xuyên thay đổi. Hãy lưu phản hồi khám phá vào bộ nhớ đệm cục bộ hoặc thử lại bằng cách sử dụng thuật toán 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ộ không mong muốn. Không thử truy vấn này nhiều lần.
503 BACKEND_ERROR Máy chủ trả về một lỗi. Không thử truy vấn này nhiều lần.
503 UNAVAILABLE Dịch vụ 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 thuật toán 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 những khách hàng chọn thử lại các yêu cầu không thành công sẽ 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 còn 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 để có được phản hồi thành công và tối đa hoá thông lượng 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. Chờ 1 giây + random_number_milliseconds giây
  4. Thử yêu cầu lại
  5. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  6. Chờ 2 giây + random_number_milliseconds giây
  7. Thử yêu cầu lại
  8. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  9. Chờ 4 giây + random_number_milliseconds giây
  10. Thử yêu cầu lại
  11. Nhận phản hồi lỗi có mã lỗi có thể thử lại
  12. Chờ 8 giây + random_number_milliseconds giây
  13. Thử yêu cầu lại
  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ử yêu cầu lại
  17. Nếu bạn vẫn gặp lỗi, hãy dừng lại và ghi lại thông báo 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 1.000. Điều này là cần thiết để tránh một số lỗi khoá trong một số phương thức triển khai đồng thời. Bạn phải định nghĩa lại random_number_milliseconds sau mỗi lần chờ.

Lưu ý: thời gian chờ luôn là (2 ^ n) + random_number_milliseconds, trong đó n là số nguyên tăng đơn điệu ban đầu được xác định 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ỉ để ngăn ứng dụng thử lại vô hạn, và 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".

Mã Python sau đây là cách triển khai quy trình trên để khôi phục từ các lỗi xảy ra trong một 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."