Các phương pháp hay nhất và hạn chế

Hãy cân nhắc những nguyên tắc sau khi sử dụng BatchJobService.

Cải thiện thông lượng

  • Bạn nên có ít công việc lớn hơn thay vì nhiều công việc nhỏ hơn.

  • Sắp xếp các thao tác đã tải lên theo loại thao tác (ngoại trừ các thao tác phụ thuộc lẫn nhau phải được nhóm liên tiếp trong các lô con nguyên tử). Ví dụ: nếu công việc của bạn chứa các thao tác để thêm chiến dịch chuẩn, nhóm quảng cáo và tiêu chí nhóm quảng cáo, hãy sắp xếp các thao tác trong tệp tải lên sao cho tất cả thao tác chiến dịch đều ở vị trí đầu tiên, tiếp theo là tất cả thao tác nhóm quảng cáo và cuối cùng là tất cả thao tác tiêu chí nhóm quảng cáo.

  • Trong các thao tác cùng loại, bạn có thể cải thiện hiệu suất bằng cách nhóm các thao tác theo tài nguyên mẹ. Ví dụ: nếu bạn có một loạt các đối tượng AdGroupCriterionOperation, thì việc nhóm các thao tác theo nhóm quảng cáo sẽ hiệu quả hơn thay vì trộn lẫn các thao tác ảnh hưởng đến tiêu chí nhóm quảng cáo trong các nhóm quảng cáo khác nhau.

Tính nguyên tử trong việc chia lô

Google Ads API chia các thao tác trong một lô công việc đã gửi thành các lô con nhỏ hơn để xử lý. Mặc dù các lô con tiêu chuẩn thực thi khi bật lỗi một phần, nhưng các lô con cho một số thao tác phụ thuộc lẫn nhau sẽ được xử lý một cách riêng lẻ dưới dạng một giao dịch duy nhất:

Đối với cả AssetGroup và các lô phụ tạo chiến dịch Tối đa hoá hiệu suất Campaign (tổng cộng tối đa 1.000 thao tác cho mỗi lô phụ; mọi thao tác create con vượt quá 999 sẽ chuyển sang lô phụ không phải là lô con tiếp theo):

  • Thao tác create gốc (resource_name trên AssetGroup hoặc Campaign) và các thao tác create con liên tiếp (asset_group trên AssetGroupAsset hoặc campaign trên CampaignAsset) phải chỉ định cùng một mã tạm thời âm.
  • Đặt mọi thao tác AssetOperation (create) tiên quyết cho các tài nguyên Asset mới trước AssetGroupOperation hoặc CampaignOperation (create) gốc, không bao giờ đặt giữa create gốc và các thao tác create liên kết con (thao tác này sẽ ngay lập tức đóng tiểu lô nguyên tử và tách việc tạo tài nguyên gốc khỏi các tài sản được liên kết).

Khi một lô con nguyên tử không thành công, BatchJobResult.status của thao tác vi phạm sẽ chứa lỗi xác thực cơ bản, trong khi các thao tác còn lại trong lô con đó sẽ được khôi phục bằng lỗi giao dịch tương ứng cho lô con đó. Kiểm tra các mục BatchJobResult liền kề dùng chung cùng một mã nhận dạng AdGroup, AssetGroup hoặc Campaign để xác định lỗi nguyên nhân gốc.

Nếu các thao tác liên quan trong bất kỳ nhóm nào trong số này không được thêm liên tiếp, thì Google Ads API sẽ chia các thao tác đó thành các lô phụ riêng biệt, khiến việc sửa đổi không đáp ứng được các yêu cầu tối thiểu về thành phần hoặc khiến cây nhóm trang thông tin không hoàn chỉnh. Hãy xem phần Sử dụng bộ lọc nhóm trang thông tin trong các thao tác hàng loạt và Xử lý hàng loạt chiến dịch Tối đa hoá hiệu suất để biết thông tin chi tiết.

Nhóm logic

Khi sửa đổi một hệ thống phân cấp nhắm mục tiêu sản phẩm (AssetGroupListingGroupFilterOperation trong chiến dịch Tối đa hoá hiệu suất hoặc AdGroupCriterionOperation trong chiến dịch Mua sắm) hoặc tạo một AssetGroup hoặc Campaign mới cho chiến dịch Tối đa hoá hiệu suất, hãy nhóm tất cả các thao tác nhắm đến cùng một tài nguyên mẹ (AssetGroup, AdGroup hoặc Campaign) một cách liên tục. Điều này giúp giảm tình trạng tranh chấp khoá phụ trợ và giữ các cây phụ thuộc lẫn nhau với nhau.

Tính nhất quán của dữ liệu

Vì cây bộ lọc nhóm trang thông tin và các yêu cầu về thành phần của chiến dịch Tối đa hoá hiệu suất được xác thực ở cuối mỗi giao dịch phụ theo lô nguyên tử, nên hãy tránh chia nhỏ các bản cập nhật cho cùng một tài nguyên mẹ trên các dải không liên tục trong một công việc hoặc trên các công việc đồng thời.

Tránh các vấn đề về tính đồng thời

  • Khi gửi nhiều công việc đồng thời cho cùng một tài khoản, hãy giảm khả năng các công việc hoạt động trên cùng một đối tượng cùng một lúc trong khi vẫn duy trì kích thước công việc lớn. Nhiều công việc chưa hoàn thành có trạng thái RUNNING cố gắng thay đổi cùng một nhóm đối tượng có thể dẫn đến các điều kiện tương tự như bế tắc, dẫn đến tình trạng chậm nghiêm trọng và thậm chí là lỗi công việc.

  • Đừng gửi nhiều thao tác làm thay đổi cùng một đối tượng trong cùng một công việc, vì kết quả có thể không dự đoán được.

Truy xuất kết quả một cách tối ưu

  • Đừng kiểm tra trạng thái công việc quá thường xuyên, nếu không bạn có thể gặp phải lỗi giới hạn tốc độ.

  • Để trống page_size (hoặc đặt thành tối đa là 1000) khi gọi ListBatchJobResults để giảm thiểu các chuyến khứ hồi phân trang và chỉ đặt response_content_type thành MUTABLE_RESOURCE nếu ứng dụng của bạn kiểm tra các trường tài nguyên được trả về ngoài resource_name.

  • Thứ tự kết quả giống với thứ tự tải lên.

Hướng dẫn bổ sung về việc sử dụng

  • Bạn có thể đặt giới hạn trên cho thời gian mà một công việc hàng loạt được phép chạy trước khi bị huỷ. Khi tạo một lô công việc mới, hãy đặt trường metadata.execution_limit_seconds thành giới hạn thời gian mà bạn muốn, tính bằng giây. Không có giới hạn thời gian mặc định nếu bạn không đặt metadata.execution_limit_seconds.

  • Mặc dù giới hạn giao thức là 10.000 thao tác cho mỗi yêu cầu, nhưng bạn nên thêm không quá 1.000 thao tác cho mỗi AddBatchJobOperationsRequest và sử dụng sequence_token để tải các thao tác còn lại lên cùng một công việc. Tuỳ thuộc vào quy mô của các thao tác, việc gửi quá nhiều thao tác trong một AddBatchJobOperationsRequest duy nhất có thể gây ra lỗi BatchJobError.REQUEST_TOO_LARGE. Bạn có thể xử lý lỗi này bằng cách giảm số lượng thao tác và thử lại AddBatchJobOperationsRequest.

Các điểm hạn chế

  • Mỗi BatchJob hỗ trợ tối đa một triệu thao tác. Nếu vượt quá giới hạn này khi gọi AddBatchJobOperations, bạn sẽ nhận được lỗi ResourceCountLimitExceededError.RESOURCE_LIMIT (với ResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOB trong ErrorDetails.resource_count_details).

  • Mỗi tài khoản có thể có tối đa 100 lệnh đang hoạt động hoặc đang chờ xử lý cùng một lúc. Khi tạo một lô công việc bằng MutateBatchJob, nếu vượt quá hạn mức này, bạn sẽ nhận được lỗi ResourceCountLimitExceededError.RESOURCE_LIMIT (với ResourceLimitType.BATCH_JOBS_PER_CUSTOMER trong ErrorDetails.resource_count_details).

  • Những lệnh đang chờ xử lý đã tồn tại hơn 7 ngày sẽ tự động bị xoá.

  • Mỗi AddBatchJobOperationsRequest có giới hạn cố định là 10.000 thao tác biến đổi cho mỗi yêu cầu. Nếu vượt quá 10.000 thao tác trong một yêu cầu,hệ thống sẽ trả về lỗi BatchJobError.REQUEST_TOO_LARGE.

  • Đối với trường page_size trong ListBatchJobResultsRequest:

  • Mỗi AddBatchJobOperationsRequest có kích thước tối đa là 41.937.920 byte. Nếu vượt quá giới hạn này, bạn sẽ nhận được lỗi BatchJobError.REQUEST_TOO_LARGE (hoặc INTERNAL_ERROR nếu bị từ chối ở lớp truyền tải). Bạn có thể xác định kích thước được chuyển đổi tuần tự của yêu cầu trước khi gửi và thực hiện hành động thích hợp nếu yêu cầu đó quá lớn:

    Java

    
    static final int MAX_REQUEST_BYTES = 41_937_920;
    
    // ... (code to get the AddBatchJobOperationsRequest object)
    
    int sizeInBytes = request.getSerializedSize();
    

    C#

    
    const int MAX_REQUEST_BYTES = 41_937_920;
    
    // ... (code to get the AddBatchJobOperationsRequest object)
    
    int sizeInBytes = request.CalculateSize();
    

    PHP

    
    const MAX_REQUEST_BYTES = 41937920;
    
    // ... (code to get the AddBatchJobOperationsRequest object)
    
    $size_in_bytes = $request->byteSize();
    

    Python

    
    MAX_REQUEST_BYTES = 41_937_920
    
    # ... (code to get the AddBatchJobOperationsRequest object)
    
    size_in_bytes = type(request).pb(request).ByteSize()
    

    Ruby

    
    MAX_REQUEST_BYTES = 41_937_920
    
    # ... (code to get the AddBatchJobOperationsRequest object)
    
    size_in_bytes = request.to_proto.bytesize
    

    Perl

    
    use JSON::XS;
    use constant MAX_REQUEST_BYTES => 41937920;
    
    # ... (code to get the AddBatchJobOperationsRequest object)
    
    # The Perl client library uses REST/JSON; UTF-8 JSON byte length provides a
    # conservative upper-bound estimate of the serialized request size.
    my $json_encoder = JSON::XS->new->utf8->convert_blessed;
    my $size_in_bytes = length($json_encoder->encode($request));
    

Kích thước của một thao tác biến đổi

Mặc dù yêu cầu tổng thể có thể lên đến 41.937.920 byte, nhưng kích thước được chuyển đổi tuần tự của một MutateOperation duy nhất trong lô bị giới hạn ở 10.484.504 byte (10 MiB trừ 1.256 byte). Nếu vượt quá giới hạn này, bạn sẽ nhận được lỗi BatchJobError.REQUEST_TOO_LARGE. Xin lưu ý rằng mặc dù tài liệu tham khảo cho BatchJobError.REQUEST_TOO_LARGE trích dẫn ngưỡng 10.484.504 byte, nhưng AddBatchJobOperations vẫn trả về mã lỗi này khi vượt quá bất kỳ ngưỡng nào trong số 3 ngưỡng yêu cầu (tổng số 41.937.920 byte yêu cầu, 10.484.504 byte cho một thao tác hoặc 10.000 thao tác cho mỗi lệnh gọi), với trường message của lỗi chỉ định giới hạn nào đã bị vi phạm.