כשמשתמשים ב-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, יצירת קבוצות משנה (sub-batches) של פעולות (עד 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. שימו לב: למרות שבמאמרי העזרה של BatchJobError.REQUEST_TOO_LARGE מצוין סף של 10,484,504 בייט, AddBatchJobOperations מחזירה את אותו קוד שגיאה כשחורגים מאחד משלושת הספים של הבקשה (41,937,920 בייט בסך הכול של הבקשה, 10,484,504 בייט של פעולה יחידה או 10,000 פעולות לכל קריאה), והשדה message של השגיאה מציין איזו מגבלה הופרה.