هنگام استفاده از BatchJobService این دستورالعملها را در نظر بگیرید.
بهبود توان عملیاتی
تعداد کمتر شغلهای بزرگتر نسبت به تعداد زیاد شغلهای کوچکتر ترجیح داده میشوند.
عملیات آپلود شده را بر اساس نوع عملیات مرتب کنید (به جز عملیاتهای وابسته به هم که باید به صورت متوالی در زیرگروههای اتمی گروهبندی شوند). برای مثال، اگر کار شما شامل عملیاتهایی برای اضافه کردن کمپینهای استاندارد، گروههای تبلیغاتی و معیارهای گروه تبلیغاتی است، عملیات را در آپلود خود طوری مرتب کنید که ابتدا همه عملیاتهای کمپین ، سپس همه عملیاتهای گروه تبلیغاتی و در نهایت همه عملیاتهای معیار گروه تبلیغاتی قرار گیرند.
در عملیاتهای هم نوع، گروهبندی آنها بر اساس منبع والد میتواند عملکرد را بهبود بخشد. برای مثال، اگر مجموعهای از اشیاء
AdGroupCriterionOperationدارید، گروهبندی عملیات بر اساس گروه تبلیغاتی کارآمدتر از ترکیب عملیاتی است که بر معیارهای گروه تبلیغاتی در گروههای تبلیغاتی مختلف تأثیر میگذارند.
اتمی بودن در تقسیم دستهای
رابط برنامهنویسی کاربردی گوگل ادز، عملیات موجود در یک کار دستهای ارسالی را برای پردازش به زیردستههای کوچکتر تقسیم میکند. در حالی که زیردستههای استاندارد با فعال بودن خطای جزئی اجرا میشوند، زیردستههای مربوط به عملیاتهای وابسته به هم خاص، به صورت اتمی و به عنوان یک تراکنش واحد پردازش میشوند:
- عملیات متوالی
AdGroupCriterionOperation(create،updateوremove) برای معیارهایLISTING_GROUP(AdGroupCriterion.listing_group) که همانAdGroupرا هدف قرار میدهند (اگر هر عملیاتی در گروه با شکست مواجه شود، باCriterionError.LISTING_GROUP_ERROR_IN_ANOTHER_OPERATIONناموفق میشود). - عملیات متوالی
AssetGroupListingGroupFilterOperation(create،updateوremove) کهAssetGroupیکسانی را هدف قرار میدهند (در صورت عدم موفقیت هر عملیاتی در گروه، باBatchJobError.ASSET_GROUP_LISTING_GROUP_FILTER_TRANSACTION_FAILUREمواجه میشوند). - بلافاصله پس از یک
AssetGroupOperation(create) تا سقف ۹۹۹ عملیاتAssetGroupAssetOperation(create) که همانAssetGroupهدف قرار میدهند، انجام میشود (اگر هر عملیاتی در گروه با شکست مواجه شود، باBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREمواجه میشود). هرAssetGroupOperation(updateیاremove) در زیرگروه عملیاتی مستقل خود اجرا میشود. - یک Performance Max
CampaignOperation(create) با دستورالعملهای برند فعال (brand_guidelines_enabledرویtrueتنظیم شده یا بدون تنظیم باقی مانده است، زیرا به طور پیشفرض رویtrueتنظیم میشود مگر اینکه صریحاً رویfalseتنظیم شود یا یک Performance Max برای کمپین اهداف سفر ایجاد کند) بلافاصله پس از آن تا 999 عملیاتCampaignAssetOperation(create) که همانCampaignهدف قرار میدهند، انجام میشود (اگر هر عملیاتی در گروه با شکست مواجه شود، باBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREناموفق میشود). کمپینهای Retail Performance Max (با فید مرکز بازرگانان) را میتوان بدون پیوند دادن منابعCampaignAssetبرند در همان زیرگروه اتمی ایجاد کرد.
برای هر دو زیرگروه ایجاد Campaign AssetGroup و Performance Max (حداکثر ۱۰۰۰ عملیات در هر زیرگروه؛ هر عملیات create فرزند فراتر از ۹۹۹ به زیرگروه غیر اتمی بعدی منتقل میشود):
- عملیات
createوالد (resource_nameرویAssetGroupیاCampaign) و عملیاتcreateفرزند متوالی آن (asset_groupرویAssetGroupAssetیاcampaignرویCampaignAsset) باید شناسه موقت منفی یکسانی را مشخص کنند. - هرگونه عملیات پیشنیاز
AssetOperation(create) برای منابعAssetجدید را قبل ازAssetGroupOperationوالد یاCampaignOperation(create) قرار دهید، هرگز بینcreateوالد و عملیاتcreateپیوند فرزند آن قرار ندهید (که بلافاصله زیرگروه اتمی را میبندد و ایجاد منبع والد را از داراییهای پیوند شدهاش جدا میکند).
وقتی یک زیر-دسته اتمی با شکست مواجه میشود، BatchJobResult.status عملیات متخلف حاوی خطای اعتبارسنجی مربوطه است، در حالی که عملیات باقیمانده در آن زیر-دسته با خطای تراکنش مربوطه برای آن زیر-دسته به عقب برگردانده میشوند. ورودیهای BatchJobResult مجاور را که دارای شناسه AdGroup ، AssetGroup یا Campaign یکسان هستند، بررسی کنید تا علت اصلی خطا را شناسایی کنید.
اگر عملیات مرتبط در هر یک از این گروهها به صورت متوالی اضافه نشوند، API گوگل ادز آنها را در زیرگروههای جداگانه تقسیم میکند و باعث میشود اصلاح با حداقل الزامات دارایی مطابقت نداشته باشد یا درختهای گروه فهرستبندی ناقص باقی بمانند. برای جزئیات بیشتر به «استفاده از فیلترهای گروه فهرستبندی در کارهای دستهای» و «پردازش دستهای حداکثر عملکرد» مراجعه کنید.
گروهبندی منطقی
هنگام تغییر سلسله مراتب هدفگیری محصول ( AssetGroupListingGroupFilterOperation در کمپینهای Performance Max یا AdGroupCriterionOperation در کمپینهای Shopping) یا ایجاد یک AssetGroup یا Performance Max Campaign جدید، تمام عملیاتی را که منبع والد یکسانی ( AssetGroup ، AdGroup یا Campaign ) را هدف قرار میدهند، به صورت متوالی گروهبندی کنید. این کار باعث کاهش تداخل قفل در backend و حفظ یکپارچگی درختهای وابسته به هم میشود.
سازگاری دادهها
از آنجا که فهرستبندی درختهای فیلتر گروهی و الزامات داراییهای Performance Max در پایان هر تراکنش زیر-دستهای اتمی اعتبارسنجی میشوند، از تقسیم بهروزرسانیها به همان منبع والد در محدودههای ناپیوسته در یک کار یا در کارهای همزمان خودداری کنید.
از مشکلات همزمانی جلوگیری کنید
هنگام ارسال چندین کار همزمان برای یک حساب کاربری، احتمال اجرای همزمان کارها روی اشیاء مشابه را کاهش دهید و در عین حال حجم بالای کارها را حفظ کنید. بسیاری از کارهای ناتمام با وضعیت در
RUNNINGکه سعی در تغییر مجموعه اشیاء مشابه دارند، میتوانند منجر به شرایط شبیه به بنبست شوند و در نتیجه باعث کندی شدید و حتی شکست کارها شوند.چندین عملیات که یک شیء را در یک کار تغییر میدهند، ارسال نکنید، زیرا نتیجه میتواند غیرقابل پیشبینی باشد.
بازیابی نتایج به صورت بهینه
وضعیت کار را خیلی مرتب بررسی نکنید، وگرنه با خطاهای مربوط به محدودیت نرخ مواجه میشوید.
هنگام فراخوانی
ListBatchJobResultsبرای به حداقل رساندن رفت و برگشتهای صفحهبندی،page_sizeبدون تغییر بگذارید (یا آن را روی حداکثر1000تنظیم کنید)، و تنها در صورتیresponse_content_typeرا رویMUTABLE_RESOURCEتنظیم کنید که برنامه شما فیلدهای منبع برگشتی فراتر ازresource_nameرا بررسی کند.ترتیب نتایج مشابه ترتیب آپلود است.
راهنمایی استفاده اضافی
شما میتوانید برای مدت زمانی که یک کار دستهای اجازه اجرا دارد، قبل از لغو شدن، یک حد بالا تعیین کنید. هنگام ایجاد یک کار دستهای جدید، فیلد
metadata.execution_limit_secondsرا روی محدودیت زمانی دلخواه خود، بر حسب ثانیه، تنظیم کنید. اگرmetadata.execution_limit_secondsتنظیم نشده باشد، هیچ محدودیت زمانی پیشفرضی وجود ندارد.اگرچه محدودیت پروتکل ۱۰۰۰۰ عملیات در هر درخواست است، اما توصیه میکنیم بیش از ۱۰۰۰ عملیات در هر
AddBatchJobOperationsRequestاضافه نکنید و ازsequence_tokenبرای آپلود بقیه عملیات به همان job استفاده کنید. بسته به اندازه عملیات، ارسال عملیات زیاد در یکAddBatchJobOperationsRequestمیتواند باعث خطایBatchJobError.REQUEST_TOO_LARGEشود. میتوانید با کاهش تعداد عملیات و تلاش مجدد برایAddBatchJobOperationsRequest، این خطا را مدیریت کنید.
محدودیتها
هر
BatchJobتا یک میلیون عملیات را پشتیبانی میکند. تجاوز از این محدودیت هنگام فراخوانیAddBatchJobOperationsخطایResourceCountLimitExceededError.RESOURCE_LIMIT(همراه باResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOBدرErrorDetails.resource_count_details) را برمیگرداند.هر حساب میتواند همزمان تا ۱۰۰ کار فعال یا در انتظار انجام داشته باشد. تجاوز از این محدودیت هنگام ایجاد یک کار دستهای با
MutateBatchJobخطایResourceCountLimitExceededError.RESOURCE_LIMIT(باResourceLimitType.BATCH_JOBS_PER_CUSTOMERدرErrorDetails.resource_count_details) را برمیگرداند.کارهای در حال انتظار که بیش از ۷ روز از تاریخ انقضای آنها گذشته باشد، به طور خودکار حذف میشوند.
هر
AddBatchJobOperationsRequestمحدودیت سختی معادل ۱۰،۰۰۰ عملیات تغییر شکل در هر درخواست دارد. تجاوز از ۱۰،۰۰۰ عملیات در یک درخواست واحد، خطایBatchJobError.REQUEST_TOO_LARGEرا برمیگرداند.برای فیلد
page_sizeدرListBatchJobResultsRequest:- اگر
page_sizeتنظیم نشده باشد یا مقدار آن0باشد، به طور پیشفرض روی حداکثر1000قرار میگیرد. - اگر
page_sizeاز1000بیشتر یا از0کمتر باشد، API خطایBatchJobError.INVALID_PAGE_SIZEرا برمیگرداند.
- اگر
هر
AddBatchJobOperationsRequestحداکثر اندازه ۴۱,۹۳۷,۹۲۰ بایت دارد. اگر از این حد تجاوز کنید، خطایBatchJobError.REQUEST_TOO_LARGE(یا در صورت رد شدن در لایه انتقال، خطایINTERNAL_ERROR) دریافت خواهید کرد. میتوانید اندازه سریالی درخواست را قبل از ارسال تعیین کنید و در صورت بزرگ بودن بیش از حد، اقدام مناسب را انجام دهید:جاوا
static final int MAX_REQUEST_BYTES = 41_937_920; // ... (code to get the AddBatchJobOperationsRequest object) int sizeInBytes = request.getSerializedSize();سی شارپ
const int MAX_REQUEST_BYTES = 41_937_920; // ... (code to get the AddBatchJobOperationsRequest object) int sizeInBytes = request.CalculateSize();پی اچ پی
const MAX_REQUEST_BYTES = 41937920; // ... (code to get the AddBatchJobOperationsRequest object) $size_in_bytes = $request->byteSize();پایتون
MAX_REQUEST_BYTES = 41_937_920 # ... (code to get the AddBatchJobOperationsRequest object) size_in_bytes = type(request).pb(request).ByteSize()روبی
MAX_REQUEST_BYTES = 41_937_920 # ... (code to get the AddBatchJobOperationsRequest object) size_in_bytes = request.to_proto.bytesizeپرل
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));
اندازه عملیات جهش تکی
در حالی که درخواست کلی میتواند تا ۴۱,۹۳۷,۹۲۰ بایت باشد، اندازه سریالی یک MutateOperation واحد در دسته به ۱۰,۴۸۴,۵۰۴ بایت (۱۰ مگابایت منهای ۱,۲۵۶ بایت) محدود میشود. تجاوز از این حد، خطای BatchJobError.REQUEST_TOO_LARGE را برمیگرداند. توجه داشته باشید که در حالی که مستندات مرجع برای BatchJobError.REQUEST_TOO_LARGE آستانه ۱۰,۴۸۴,۵۰۴ بایت را ذکر میکند، AddBatchJobOperations همین کد خطا را در صورت تجاوز از هر یک از سه آستانه درخواست (۴۱,۹۳۷,۹۲۰ بایت کل درخواست، ۱۰,۴۸۴,۵۰۴ بایت تک عملیاتی یا ۱۰,۰۰۰ عملیات در هر فراخوانی) برمیگرداند، و فیلد message خطا مشخص میکند که کدام محدودیت نقض شده است.