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:
- Các thao tác
AdGroupCriterionOperationliên tiếp (create,updatevàremove) cho tiêu chíLISTING_GROUP(AdGroupCriterion.listing_group) nhắm đến cùng mộtAdGroup(thất bại vớiCriterionError.LISTING_GROUP_ERROR_IN_ANOTHER_OPERATIONnếu có bất kỳ thao tác nào trong nhóm thất bại). - Các thao tác
AssetGroupListingGroupFilterOperationliên tiếp (create,updatevàremove) nhắm đến cùng mộtAssetGroup(thất bại vớiBatchJobError.ASSET_GROUP_LISTING_GROUP_FILTER_TRANSACTION_FAILUREnếu có bất kỳ thao tác nào trong nhóm thất bại). - Một
AssetGroupOperation(create) ngay sau đó là tối đa 999 thao tácAssetGroupAssetOperation(create) nhắm đến cùng mộtAssetGroup(thao tác sẽ thất bại vớiBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREnếu có bất kỳ thao tác nào trong nhóm thất bại). MỗiAssetGroupOperation(updatehoặcremove) thực thi trong tiểu lô gồm một thao tác độc lập riêng. - Một chiến dịch Tối đa hoá hiệu suất
CampaignOperation(create) có Nguyên tắc sử dụng thương hiệu được bật (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(thao tác sẽ thất bại vớiBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREnếu có thao tác nào trong nhóm thất bại). Bạn có thể tạo chiến dịch Tối đa hoá hiệu suất cho 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ô con nguyên 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
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 các tài nguyênAssetmới trướcAssetGroupOperationhoặcCampaignOperation(create) gốc, không bao giờ đặt giữacreategốc và các thao táccreateliê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
RUNNINGcố 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ọiListBatchJobResultsđể giảm thiểu các chuyế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 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_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 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
AddBatchJobOperationsRequestvà 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ộtAddBatchJobOperationsRequestduy nhất có 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 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ỗiResourceCountLimitExceededError.RESOURCE_LIMIT(vớiResourceLimitType.BATCH_JOBS_PER_CUSTOMERtrongErrorDetails.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
AddBatchJobOperationsRequestcó 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ỗ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à giá trị tối đa của1000. - Nếu
page_sizevượt quá1000hoặc nhỏ hơn0, 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 ở 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.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ù 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.