פונקציה עיקרית של אפליקציות רבות ב-Google Ads היא אחזור נתוני חשבון לתרחישי שימוש כמו ניתוח נתונים, שאילתות של לקוחות ובדיקות תאימות למדיניות. במהלך אחזור הנתונים מומלץ לייעל את השימוש כדי לא לגרום לעומס יתר על השרתים של Google או להסתכן בהגבלת קצב של יצירת בקשות. לפרטים נוספים, קראו את המדריכים בנושא הגבלת קצב של יצירת בקשות ושמירה על כתובת אימייל עדכנית ליצירת קשר.
הסבר על מדיניות השימוש של Google במשאבים בדוחות
כדי לשמור על יציבות השרתים, Google Ads API מווסת דפוסי שאילתות GoogleAdsService.Search
ו-GoogleAdsService.SearchStream
שצורכים כמויות גדולות של משאבי API. אם יווסת דפוס מסוים של שאילתה, שירותים, שיטות ודפוסי שאילתות אחרים ימשיכו לפעול ללא השפעה. השגיאות הבאות מוצגות בבקשות של ויסות נתונים:
גרסת ממשק API | קוד שגיאה |
---|---|
<= v16 | QuotaError.RESOURCE_EXHAUSTED |
>= v17 | QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION או QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION , בהתאם למשך הזמן של שימוש ארוך במשאבים. |
כדי לעזור לכם לזהות את הדוחות היקרים שלכם ולעקוב אחריהם, נחזיר גם מדד עלות עבור דוחות נפרדים.
שיטה | שדה עלות |
---|---|
GoogleAdsService.Search |
SearchGoogleAdsResponse.query_resource_consumption |
GoogleAdsService.SearchStream |
SearchGoogleAdsStreamResponse.query_resource_consumption |
מדד העלות שמוחזר מהשדות האלה תלוי בגורמים שונים, כמו
- גודל החשבונות
- התצוגות והעמודות שמאחזרים בדוחות
- העומס על שרתי Google Ads API.
כדי לעזור לכם לעקוב אחרי שאילתות יקרות, אנחנו מפרסמים נתונים סטטיסטיים ראשוניים נצברים לגבי צריכת המשאבים של דפוסי שאילתות שונים שאנחנו רואים בשרתים שלנו. מדי פעם נפרסם מספרים מעודכנים כדי לעזור לכם לשפר את השאילתות.
חלון זמן | ממוצעת (p50). | P70 (גבוה למדי) | P95 (גבוה מאוד) |
---|---|---|---|
תקופה קצרה (5 דקות) | 6000 | 30000 | 1800000 |
טווח ארוך (24 שעות). | 16000 | 90000 | 8400000 |
לדוגמה, נניח שאתם מריצים דפוס שאילתה באופן הבא, שצורכת 600 יחידות של משאבים לכל דוח.
SELECT campaign.id, campaign.name, metrics.cost_micros FROM campaign WHERE
segments.date = "YYYY-MM-DD"
מריצים את השאילתה הזו על כמה חשבונות לקוח בכמה תאריכים נפרדים, על ידי שינוי השאילתה כך שתחליפו ערכים שונים במסנן segments.date
. בטבלה הבאה מוצג מספר הדוחות שאפשר להריץ בחלון זמן נתון, כדי שהשימוש במשאבים יתאים לקטגוריות שונות של שימוש במשאבים.
חלון זמן | ממוצעת | די גבוהה | גבוה מאוד |
---|---|---|---|
תקופה קצרה (5 דקות) | 10 | 50 | 3,000 |
טווח ארוך (24 שעות). | 26 | 150 | 14000 |
הרצת דפוס השאילתה 10 פעמים ב-5 דקות תיחשב לשימוש ממוצע, והרצת 3,000 דוחות ב-5 דקות תיחשב כשימוש גבוה מאוד.
יש כמה אסטרטגיות לאופטימיזציה של צריכת המשאבים בדוחות. בהמשך המדריך עוסק בחלק מהאסטרטגיות האלה.
שמירת הנתונים במטמון
כדאי לשמור במטמון את פרטי הישות שאתם מאחזרים משרתי ה-API במסד נתונים מקומי, במקום להפעיל את השרת בכל פעם שאתם צריכים את הנתונים, במיוחד לגבי ישויות שניגשים אליהן לעיתים קרובות או שמשתנים לעיתים רחוקות. משתמשים ב-change-event וב-change-status כשאפשר לזהות אילו אובייקטים השתנו מאז הסנכרון האחרון של התוצאות.
ביצוע אופטימיזציה לתדירות של הרצת דוחות
ב-Google Ads פורסמו הנחיות לגבי עדכניות הנתונים ולגבי תדירות העדכון של הנתונים. יש להשתמש בהנחיה הזו כדי לקבוע באיזו תדירות צריך לאחזר דוחות.
אם אתם צריכים לעדכן חשבונות באופן קבוע, מומלץ להגביל את מספר החשבונות לקבוצה קטנה, למשל רק עשרים חשבונות Google Ads המובילים. את השאר אפשר לעדכן בתדירות נמוכה יותר, למשל פעם או פעמיים ביום.
אופטימיזציה של גודל הדוחות
האפליקציה צריכה לאחזר קבוצות גדולות של נתונים במקום להריץ מספר גדול של דוחות קטנים. אחד הגורמים שמשפיעים על ההחלטה הזו הוא מגבלות החשבון.
לדוגמה, חשוב להשתמש בקוד הבא שמוציא את הנתונים הסטטיסטיים של קבוצות מודעות ספציפיות ומעדכנים טבלה של מסד נתונים של נתונים סטטיסטיים:
List<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();
foreach (long adGroupId in adGroupIds)
{
string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
"metrics.cost_micros, metrics.impressions, segments.date FROM " +
"ad_group WHERE segments.date DURING LAST_7_DAYS AND " +
"ad_group.id = ${adGroupId}";
List<GoogleAdsRow> rows = RunGoogleAdsReport(customerId, query);
InsertRowsIntoStatsTable(adGroupId, rows);
}
הקוד הזה פועל היטב בחשבון בדיקה קטן. עם זאת, Google Ads תומכת ב-20,000 קבוצות של מודעות לכל היותר בכל קמפיין וב-10,000 קמפיינים בכל חשבון. לכן, אם הקוד הזה פועל בחשבון Google Ads גדול, הוא עלול לגרום לעומס יתר על השרתים של Google Ads API, דבר שמוביל להגבלת קצב של יצירת בקשות ולויסות נתונים (throttle).
גישה טובה יותר היא הפעלת דוח יחיד ועיבוד שלו באופן מקומי. מוצגת גישה אחת שאפשר להשתמש בה במפה בזיכרון.
Hashset<long> adGroupIds = FetchAdGroupIdsFromLocalDatabase();
string query = "SELECT ad_group.id, ad_group.name, metrics.clicks, " +
"metrics.cost_micros, metrics.impressions, segments.date FROM " +
"ad_group WHERE segments.date DURING LAST_7_DAYS";
List<GoogleAdsRow> rows = RunGoogleAdsReport(customer_id, query);
var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
for each (GoogleAdsRow row in rows)
{
var adGroupId = row.AdGroup.Id;
if (adGroupIds.Contains(adGroupId))
{
CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
}
}
foreach (long adGroupId in memoryMap.Keys())
{
InsertRowsIntoStatsTable(adGroupId, rows);
}
התכונה הזו מפחיתה את העומס על שרתי Google Ads API, בגלל המספר הנמוך יותר של דוחות שמופקים.
אם הדוח גדול מדי ולא ניתן לאחסן אותו בזיכרון, אפשר גם לחלק את השאילתה לקבוצות קטנות יותר על ידי הוספת משפט LIMIT
כמו בדוגמה הבאה:
SELECT
ad_group.id,
ad_group.name,
metrics.clicks,
metrics.cost_micros,
metrics.impressions,
segments.date
FROM ad_group
WHERE segments.date DURING LAST_7_DAYS
AND ad_group.id IN (id1, id2, ...)
LIMIT 100000
תוויות הן דרך נוספת לקבץ ישויות ולהפחית את מספר השאילתות לדיווח. למידע נוסף, אפשר לעיין במדריך התוויות.
אופטימיזציה של מה שמאחזרים
כשמריצים דוחות, חשוב לשים לב לעמודות שכלולות בשאילתות. עיינו בדוגמה הבאה שמתוזמנת לפעול כל שעה:
SELECT
customer.id,
customer.currency_code,
campaign.id,
campaign.name,
ad_group.id,
ad_group.name,
ad_group_criterion.keyword.match_type,
ad_group_criterion.keyword.text,
ad_group_criterion.criterion_id,
ad_group_criterion.quality_info.creative_quality_score,
ad_group_criterion.system_serving_status,
ad_group_criterion.negative,
ad_group_criterion.quality_info.quality_score,
ad_group_criterion.quality_info.search_predicted_ctr,
ad_group_criterion.quality_info.post_click_quality_score,
metrics.historical_landing_page_quality_score,
metrics.search_click_share,
metrics.historical_creative_quality_score,
metrics.clicks,
metrics.impressions
FROM keyword_view
WHERE segments.date DURING LAST_7_DAYS
העמודות היחידות שעשויות להשתנות בכל שעה הן metrics.clicks
ו-metrics.impressions
. כל העמודות האחרות מתעדכנות לעתים רחוקות או כלל לא, ולכן מאוד לא יעיל לאחזר אותן מדי שעה. תוכלו לאחסן את הערכים האלה במסד נתונים מקומי ולהריץ דוח change-event או change-status כדי להוריד שינויים פעם או פעמיים ביום.
במקרים מסוימים, אפשר להפחית את מספר השורות שאתם מורידים על ידי החלת מסננים מתאימים.
ניקוי חשבונות שלא נמצאים בשימוש
אם האפליקציה שלכם מנהלת חשבונות של מפרסמים מצד שלישי, חשוב לפתח אותה תוך התחשבות בנטישה של הלקוחות. כדאי לנקות מדי פעם את התהליכים ואת מאגרי הנתונים כדי להסיר חשבונות של לקוחות שכבר לא משתמשים באפליקציה. כשאתם מנקים חשבונות Google Ads שאינם בשימוש, חשוב לזכור את ההנחיות הבאות:
- מבטלים את ההרשאה שהלקוח נתן לאפליקציה לניהול החשבון שלו.
- להפסיק לבצע קריאות ל-API בחשבונות Google Ads של הלקוח. הדבר רלוונטי במיוחד למשימות אופליין כמו משימות cron וצינורות עיבוד נתונים שמיועדים לפעול ללא התערבות המשתמש.
- אם הלקוח ביטל את ההרשאה, האפליקציה שלכם צריכה לטפל במצב בזהירות ולמנוע קריאות לא חוקיות ל-API לשרתי ה-API של Google.
- אם הלקוח ביטל את חשבון Google Ads שלו, צריך לזהות אותו ולהימנע משליחת קריאות לא חוקיות ל-API לשרתי ה-API של Google.
- מוחקים ממסד הנתונים המקומי את הנתונים שהורדתם מחשבונות Google Ads של הלקוח, אחרי פרק זמן מתאים.