כדאי לפעול לפי ההנחיות הבאות כשמשתמשים ב-BatchJobService.
שיפור קצב העברת הנתונים
עדיף להגדיר פחות משימות גדולות מאשר הרבה משימות קטנות.
מסדרים את הפעולות שמעלים לפי סוג הפעולה (חוץ מפעולות שתלויות זו בזו, שצריך לקבץ אותן ברצף באצוות משנה אטומיות). לדוגמה, אם המשימה כוללת פעולות להוספת קמפיינים רגילים, קבוצות של מודעות וקריטריונים של קבוצות של מודעות, צריך לסדר את הפעולות בהעלאה כך שכל הפעולות ברמת הקמפיין יהיו ראשונות, אחריהן כל הפעולות ברמת קבוצת המודעות, ולבסוף כל הפעולות ברמת הקריטריונים של קבוצת המודעות.
בפעולות מאותו סוג, אפשר לשפר את הביצועים על ידי קיבוץ שלהן לפי משאב הורה. לדוגמה, אם יש לכם סדרה של אובייקטים מסוג
AdGroupCriterionOperation, יעיל יותר לקבץ את הפעולות לפי קבוצת מודעות, במקום לערבב פעולות שמשפיעות על קריטריונים של קבוצות מודעות בקבוצות מודעות שונות.
אטומיות בפיצול אצוות
Google Ads API מפצל את הפעולות במשימת אצווה שנשלחה לאצוות משנה קטנות יותר לצורך עיבוד. בזמן שקבוצות משנה רגילות מופעלות עם כשל חלקי, קבוצות משנה של פעולות מסוימות שתלויות זו בזו מעובדות באופן אטומי כטרנזקציה אחת:
- פעולות
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) אחת שאחריה מיד עד 999 פעולותAssetGroupAssetOperation(create) שמטרגטות את אותוAssetGroup(נכשלת עםBatchJobError.ASSET_GROUP_AND_ASSET_GROUP_ASSET_TRANSACTION_FAILUREאם פעולה כלשהי בקבוצה נכשלת). כלAssetGroupOperation(updateאוremove) מופעל באצווה משנית עצמאית עם פעולה אחת. CampaignOperationאחד (create) של קמפיין למיקסום הביצועים שמופעלות בו הנחיות המיתוג (brand_guidelines_enabledמוגדר כ-trueאו לא מוגדר, כי ברירת המחדל היאtrueאלא אם מגדירים אותו במפורש כ-falseאו יוצרים קמפיין למיקסום הביצועים לענף התיירות והאירוח), ומיד אחריו עד 999 פעולות שלCampaignAssetOperation(create) שמטרגטות את אותוCampaign(נכשל עם השגיאהBatchJobError.CAMPAIGN_AND_CAMPAIGN_ASSET_TRANSACTION_FAILUREאם אחת מהפעולות בקבוצה נכשלת). אפשר ליצור קמפיינים למיקסום הביצועים עם פיד של Merchant Center בלי לקשר משאביCampaignAssetשל מותג באותה קבוצת משנה אטומית.
גם בקבוצות משנה ליצירת AssetGroup וגם בקבוצות משנה ליצירת קמפיינים למיקסום הביצועים Campaign (עד 1,000 פעולות בסך הכול לכל קבוצת משנה. כל פעולת צאצא של create מעבר ל-999 עוברת לקבוצת המשנה הבאה שהיא לא אטומית):
- בפעולת ההורה
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.
אם פעולות קשורות באחת מהקבוצות האלה לא נוספות ברצף, Google Ads API מפצל אותן לקבוצות משנה נפרדות, וכתוצאה מכך השינוי לא עומד בדרישות המינימליות לגבי נכסים או שעצי הקבוצות של כרטיסי המוצר נשארים לא שלמים. פרטים נוספים זמינים במאמרים שימוש במסננים של קבוצות כרטיסי מוצר במשימות באצווה ועיבוד באצווה בקמפיינים למיקסום הביצועים.
קיבוץ לוגי
כשמשנים היררכיית טירגוט של מוצרים (AssetGroupListingGroupFilterOperation בקמפיינים למיקסום הביצועים או AdGroupCriterionOperation בקמפיינים של שופינג) או כשיוצרים AssetGroup חדש או Campaign חדש בקמפיין למיקסום הביצועים, צריך לקבץ את כל הפעולות שמטרגטות את אותו משאב הורה (AssetGroup, AdGroup או Campaign) ברצף. כך אפשר לצמצם את התחרות על נעילת הקצה העורפי ולשמור על עצים תלויים זה בזה ביחד.
עקביות הנתונים
מכיוון שהעצים של מסנני קבוצות של כרטיסי מוצר והדרישות לגבי נכסים בקמפיינים למיקסום הביצועים מאומתים בסוף כל טרנזקציה של תת-אצווה אטומית, כדאי להימנע מפיצול עדכונים לאותו משאב הורה בטווחים לא רציפים במשימה או במשימות בו-זמניות.
איך למנוע בעיות שקשורות לפעולות בו-זמניות
כששולחים כמה משימות בו-זמנית לאותו חשבון, כדאי להקטין את הסיכוי שהמשימות יפעלו על אותם אובייקטים באותו זמן, תוך שמירה על גודל משימות גדול. אם יש הרבה משימות לא גמורות בסטטוס
RUNNINGשמנסות לשנות את אותה קבוצת אובייקטים, יכול להיווצר מצב שדומה למבוי סתום, שגורם להאטה משמעותית ואפילו לכישלון של המשימות.אל תשלחו כמה פעולות שמשנות את אותו אובייקט באותה משימה, כי התוצאה יכולה להיות בלתי צפויה.
אחזור תוצאות בצורה אופטימלית
אל תדגמו את סטטוס המשימה בתדירות גבוהה מדי, אחרת אתם עלולים להגיע לשגיאות של הגבלת קצב של יצירת בקשות.
כשמפעילים את
ListBatchJobResults, כדאי להשאיר אתpage_sizeלא מוגדר (או להגדיר אותו למקסימום של1000) כדי לצמצם את מספר הבקשות והתגובות של חלוקה לדפים, ולהגדיר אתresponse_content_typeלערךMUTABLE_RESOURCEרק אם האפליקציה בודקת את שדות המשאבים המוחזרים מעבר ל-resource_name.סדר התוצאות זהה לסדר ההעלאה.
הנחיות נוספות לשימוש
אתם יכולים להגדיר את משך הזמן המקסימלי שבו משימה באצווה יכולה לפעול לפני שהיא תבוטל. כשיוצרים משימה חדשה באצווה, מגדירים בשדה
metadata.execution_limit_secondsאת מגבלת הזמן הרצויה בשניות. אם לא מגדירים אתmetadata.execution_limit_seconds, אין מגבלת זמן כברירת מחדל.למרות שמגבלת הפרוטוקול היא 10,000 פעולות לכל בקשה, מומלץ להוסיף לא יותר מ-1,000 פעולות לכל
AddBatchJobOperationsRequestולהשתמש ב-sequence_tokenכדי להעלות את שאר הפעולות לאותה משימה. בהתאם לגודל הפעולות, שליחת יותר מדי פעולות ב-AddBatchJobOperationsRequestאחד יכולה לגרום לשגיאתBatchJobError.REQUEST_TOO_LARGE. כדי לטפל בשגיאה הזו, אפשר להפחית את מספר הפעולות ולנסות שוב את הAddBatchJobOperationsRequest.
מגבלות
כל
BatchJobתומך בעד מיליון פעולות. חריגה מהמגבלה הזו בקריאה ל-AddBatchJobOperationsמחזירה שגיאתResourceCountLimitExceededError.RESOURCE_LIMIT(עםResourceLimitType.BATCH_JOB_OPERATIONS_PER_JOBב-ErrorDetails.resource_count_details).בכל חשבון יכולות להיות עד 100 משימות פעילות או בהמתנה בו-זמנית. אם חורגים מהמגבלה הזו כשיוצרים משימה באצווה באמצעות
MutateBatchJob, מוחזרת השגיאהResourceCountLimitExceededError.RESOURCE_LIMIT(עםResourceLimitType.BATCH_JOBS_PER_CUSTOMERב-ErrorDetails.resource_count_details).משימות בהמתנה שנוצרו לפני יותר מ-7 ימים מוסרות באופן אוטומטי.
בכל
AddBatchJobOperationsRequestיש מגבלה קשיחה של 10,000 פעולות שינוי לכל בקשה. אם תחרגו מ-10,000 פעולות בבקשה אחת, תוחזר השגיאהBatchJobError.REQUEST_TOO_LARGE.בשדה
page_sizeב-ListBatchJobResultsRequest:- אם לא מגדירים את
page_sizeאו אם הערך הוא0, ברירת המחדל היא הערך המקסימלי של1000. - אם הערך של
page_sizeגדול מ-1000או קטן מ-0, ה-API מחזיר את השגיאהBatchJobError.INVALID_PAGE_SIZE.
- אם לא מגדירים את
הגודל המקסימלי של כל
AddBatchJobOperationsRequestהוא 41,937,920 בייטים. אם חורגים מהמגבלה הזו, מקבלים שגיאתBatchJobError.REQUEST_TOO_LARGE(או שגיאתINTERNAL_ERRORאם הבקשה נדחתה בשכבת התעבורה). אפשר לקבוע את הגודל של הבקשה אחרי שעברה סריאליזציה לפני ששולחים אותה, ולבצע את הפעולה המתאימה אם היא גדולה מדי: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));
גודל של פעולת שינוי אחת
למרות שהבקשה הכוללת יכולה להיות עד 41,937,920 בייטים, הגודל של MutateOperation יחיד שעבר סריאליזציה בתוך האצווה מוגבל ל-10,484,504 בייטים (10MiB פחות 1,256 בייטים). אם חורגים מהמגבלה הזו, מוחזרת השגיאה BatchJobError.REQUEST_TOO_LARGE. שימו לב שב, AddBatchJobOperations מחזיר את אותו קוד שגיאה
כשחורגים מאחד משלושת הספים של הבקשות (סך של 41,937,920 בייטים לבקשה,
10,484,504 בייטים לפעולה בודדת או 10,000 פעולות לכל קריאה),
ובשדה message של השגיאה מצוין באיזו מגבלה חרגתם. זאת למרות שב
מאמרי העזרה של BatchJobError.REQUEST_TOO_LARGE מצוין
הסף של 10,484,504 בייטים.