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

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

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

  • Bạn nên ưu tiên một vài công việc lớn hơn là nhiều công việc nhỏ.

  • 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ô phụ 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, nhóm quảng cáo và tiêu chí nhóm quảng cáo chuẩn, 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 gốc. Ví dụ: nếu bạn có một loạt đố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 so với việc kết hợp các thao tác ảnh hưởng đến tiêu chí của 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 phân tách lô

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

Đối với cả lô phụ tạo Campaign AssetGroup và Tối đa hoá hiệu suất (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 nguyên tử 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 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 liên kết con create (thao tác này sẽ ngay lập tức đóng lô phụ nguyên tử và tách việc tạo tài nguyên gốc khỏi các thành phần được liên kết).

Khi một lô phụ 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ô phụ đó được khôi phục kèm theo lỗi giao dịch tương ứng cho lô phụ đó. Kiểm tra các mục BatchJobResult liền kề có cùng mã nhận dạng AdGroup, AssetGroup hoặc Campaign để xác định nguyên nhân gốc rễ gây ra lỗi.

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 nội dung sửa đổi không đáp ứng 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 bài viết Sử dụng bộ lọc nhóm trang thông tin trong công việc theo lô và Xử lý hàng loạt trong 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 hệ phân cấp nhắm mục tiêu theo 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 mới hoặc Campaign của 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 gốc (AssetGroup, AdGroup hoặc Campaign) liên tiếp. Điều này giúp giảm tranh chấp khoá phần phụ trợ và giữ các cây phụ thuộc lẫn nhau lại 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à 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 theo lô phụ nguyên tử, nên hãy tránh chia nhỏ nội dung cập nhật cho cùng một tài nguyên gốc trên các phạm vi 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 tập hợp đối tượng có thể dẫn đến tình trạng giống như bế tắc, khiến công việc bị chậm nghiêm trọng và thậm chí là không thành công.

  • Đừ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 lường trước được.

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

  • Đừng thăm dò trạng thái công việc quá thường xuyên, nếu không, bạn có nguy cơ gặp lỗi giới hạn tốc độ.

  • Để trống page_size (hoặc đặt thành giá trị tối đa là 1000) khi gọi ListBatchJobResults để giảm thiểu số lầ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 sử dụng bổ sung

  • Bạn có thể đặt giới hạn trên cho thời gian cho phép chạy một công việc theo lô trước khi bị huỷ. Khi tạo một công việc theo lô 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 của giao thức là 10.000 thao tác cho mỗi yêu cầu, nhưng bạn không nên thêm quá 1.000 thao tác cho mỗi AddBatchJobOperationsRequest và nên 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 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 công việc đang hoạt động hoặc đang chờ xử lý cùng một lúc. Nếu bạn vượt quá giới hạn này khi tạo một công việc theo lô bằng MutateBatchJob, thì hệ thống sẽ trả về lỗi ResourceCountLimitExceededError.RESOURCE_LIMIT (với ResourceLimitType.BATCH_JOBS_PER_CUSTOMER trong ErrorDetails.resource_count_details).

  • Các công việc đ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 tối đa là 10.000 thao tác thay đổ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 ở tầng truyền tải). Bạn có thể xác định kích thước 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ù tổng kích thước yêu cầu 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 trong lô được giới hạn ở mức 10.484.504 byte (10 MiB trừ đi 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 sẽ trả về cùng một mã lỗi này khi vượt quá bất kỳ ngưỡng nào trong số ba ngưỡng yêu cầu (tổng số byte yêu cầu là 41.937.920, 10.484.504 byte cho một thao tác hoặc 10.000 thao tác cho mỗi lệnh gọi), trong đó trường message của lỗi chỉ định giới hạn nào đã bị vi phạm.