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:
AdGroupCriterionOperationthao tác liên tiếp (create,updatevàremove) cho tiêu chíLISTING_GROUP(AdGroupCriterion.listing_group) nhắm đến cùng mộtAdGroup(không thành công vớiCriterionError.LISTING_GROUP_ERROR_IN_ANOTHER_OPERATIONnếu có bất kỳ thao tác nào trong nhóm không thành công).- Các thao tác
AssetGroupListingGroupFilterOperationliên tiếp (create,updatevàremove) nhắm đến cùng mộtAssetGroup(không thành công vớiBatchJobError.ASSET_GROUP_LISTING_GROUP_FILTER_TRANSACTION_FAILUREnếu có thao tác nào trong nhóm không thành công). - Một thao tác
AssetGroupOperation(create) ngay sau đó là tối đa 999 thao tácAssetGroupAssetOperation(create) nhắm đến cùng mộtAssetGroup(không thành công vớiBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREnếu có bất kỳ thao tác nào trong nhóm không thành công). MỗiAssetGroupOperation(updatehoặcremove) thực thi trong lô phụ thao tác đơn độc lập của riêng nó. - Một thao tác
CampaignOperation(create) cho chiến dịch Tối đa hoá hiệu suất đã bật Nguyên tắc trình bày thương hiệu (brand_guidelines_enabledđược đặt thànhtruehoặc không được đặt, vì giá trị mặc định làtruetrừ phi được đặt rõ ràng thànhfalsehoặc tạo chiến dịch Tối đa hoá hiệu suất cho mục tiêu về du lịch) ngay sau đó là tối đa 999 thao tácCampaignAssetOperation(create) nhắm đến cùng mộtCampaign(không thành công với lỗiBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREnếu có bất kỳ thao tác nào trong nhóm không thành công). Bạn có thể tạo chiến dịch Tối đa hoá hiệu suất cho ngành bán lẻ (có nguồn cấp dữ liệu Merchant Center) mà không cần liên kết tài nguyênCampaignAssetthương hiệu trong cùng một lô phụ nguyên 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
creategốc (resource_nametrênAssetGrouphoặcCampaign) và các thao táccreatecon liên tiếp (asset_grouptrênAssetGroupAssethoặccampaigntrênCampaignAsset) 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ênAssetmới trướcAssetGroupOperationhoặcCampaignOperation(create) gốc, không bao giờ đặt giữacreategốc và các thao tác liên kết concreate(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
RUNNINGcố 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ọiListBatchJobResultsđể giảm thiểu số lần khứ hồi phân trang và chỉ đặtresponse_content_typethànhMUTABLE_RESOURCEnếu ứng dụng của bạn kiểm tra các trường tài nguyên được trả về ngoàiresource_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_secondsthà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 đặtmetadata.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
AddBatchJobOperationsRequestvà nên sử dụngsequence_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ộtAddBatchJobOperationsRequestcó thể gây ra lỗiBatchJobError.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ạiAddBatchJobOperationsRequest.
Các điểm hạn chế
Mỗi
BatchJobhỗ trợ tối đa một triệu thao tác. Nếu vượt quá giới hạn này khi gọiAddBatchJobOperations, bạn sẽ nhận được lỗiResourceCountLimitExceededError.RESOURCE_LIMIT(vớiResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOBtrongErrorDetails.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ỗiResourceCountLimitExceededError.RESOURCE_LIMIT(vớiResourceLimitType.BATCH_JOBS_PER_CUSTOMERtrongErrorDetails.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
AddBatchJobOperationsRequestcó 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ỗiBatchJobError.REQUEST_TOO_LARGE.Đối với trường
page_sizetrongListBatchJobResultsRequest:- Nếu
page_sizekhông được đặt hoặc là0, thì giá trị mặc định sẽ là tối đa1000. - Nếu
page_sizevượt quá1000hoặc nhỏ hơn0, thì API sẽ trả về lỗiBatchJobError.INVALID_PAGE_SIZE.
- Nếu
Mỗi
AddBatchJobOperationsRequestcó 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ỗiBatchJobError.REQUEST_TOO_LARGE(hoặcINTERNAL_ERRORnế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.bytesizePerl
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.