إدارة البيانات بكفاءة

من الوظائف الأساسية للعديد من تطبيقات "إعلانات Google" استرداد بيانات الحسابات لاستخدامها في حالات مثل تحليل البيانات وطلبات العملاء والتحقّق من الامتثال للسياسات. أثناء جلب البيانات، يجب تحسين استخدامك لتجنُّب التحميل الزائد على خوادم Google أو التعرّض لخطر تقييد معدّل نقل البيانات. لمزيد من التفاصيل، يُرجى الاطّلاع على الأدلة حول الحدّ من معدّل الإرسال والحفاظ على عنوان بريد إلكتروني مخصّص للتواصل.

فهم سياسة استخدام الموارد للتقارير

لضمان استقرار خوادم Google Ads API، يتم تقييد أنماط الطلبات GoogleAdsService.Search وGoogleAdsService.SearchStream التي تستهلك أعدادًا كبيرة من موارد واجهة برمجة التطبيقات. إذا تم تقييد نمط طلب معيّن، ستستمر الخدمات والطرق وأنماط الطلبات الأخرى في العمل بدون أن تتأثر. تظهر الأخطاء التالية للطلبات التي تم تقييدها:

رمز الخطأ
QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION أو QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION حسب مدة الاستخدام العالي للموارد.

إذا واجهت هذه الأخطاء، انتظِر لمدة 5 دقائق قبل إعادة محاولة إرسال الطلبات التي تعذّر إكمالها بسبب الخطأ QuotaError.EXCESSIVE_SHORT_TERM_QUERY_RESOURCE_CONSUMPTION، ولمدة 30 دقيقة للطلبات التي تعذّر إكمالها بسبب الخطأ QuotaError.EXCESSIVE_LONG_TERM_QUERY_RESOURCE_CONSUMPTION.

لمساعدتك في تحديد التقارير المكلفة ومراقبتها، نعرض أيضًا مقياس التكلفة للتقارير الفردية:

الطريقة حقل التكلفة
GoogleAdsService.Search SearchGoogleAdsResponse.query_resource_consumption
GoogleAdsService.SearchStream SearchGoogleAdsStreamResponse.query_resource_consumption

يعتمد مقياس التكلفة الذي تعرضه هذه الحقول على عوامل مختلفة، مثل:

  • حجم حساباتك
  • طرق العرض والأعمدة التي تجلبها في تقاريرك
  • الحِمل على خوادم Google Ads API

يتضمّن الجدول التالي إحصاءات مجمّعة عن استهلاك الموارد لأنماط الطلبات المختلفة على خوادم Google Ads API لمساعدتك في تتبُّع الطلبات المكلفة وتحسينها:

الفترة الزمنية المتوسط (الشريحة المئوية الخمسون) ‫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 3000
على المدى الطويل (24 ساعة) 26 150 14000

إنّ تنفيذ نمط الطلب هذا 10 مرات خلال 5 دقائق يُعدّ استخدامًا متوسطًا، في حين أنّ تنفيذ 3, 000 تقرير خلال 5 دقائق يُعدّ استخدامًا عاليًا جدًا.

هناك عدة استراتيجيات لتحسين استهلاك الموارد في تقاريرك. يتناول الجزء المتبقي من هذا الدليل بعضًا من هذه الاستراتيجيات.

تخزين بياناتك مؤقتًا

يجب تخزين تفاصيل الكيانات التي يتم جلبها من خوادم واجهة برمجة التطبيقات مؤقتًا في قاعدة بيانات محلية بدلاً من استدعاء الخادم في كل مرة تحتاج فيها إلى البيانات، خاصةً بالنسبة إلى الكيانات التي يتم الوصول إليها بشكل متكرر أو التي تتغير بشكل غير متكرر. استخدِم change-event وchange-status حيثما أمكن لرصد العناصر التي تغيّرت منذ آخر مزامنة للنتائج.

تحسين معدّل تكرار تشغيل التقارير

نشرت "إعلانات Google" إرشادات حول سرعة توفُّر البيانات ومعدّل تحديثها. يجب استخدام هذه الإرشادات لتحديد عدد مرات جلب التقارير.

إذا كنت بحاجة إلى تعديل الحسابات بشكل منتظم، ننصحك بحصر عدد هذه الحسابات في مجموعة صغيرة، على سبيل المثال، أفضل عشرين حسابًا على "إعلانات Google" فقط. ويمكن تعديل الباقي بمعدّل أقل، مثلاً مرة أو مرتين في اليوم.

تحسين حجم تقاريرك

يجب أن يجلب تطبيقك مجموعات كبيرة من البيانات بدلاً من تشغيل عدد كبير من التقارير الصغيرة. من العوامل التي تؤثر في هذا الاختيار حدود الحساب.

على سبيل المثال، ضع في الاعتبار الرمز التالي الذي يسحب الإحصاءات لمجموعات إعلانية معيّنة ويعدّل جدول قاعدة بيانات الإحصاءات:

  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" ما يصل إلى 20,000 مجموعة إعلانية لكل حملة و10,000 حملة لكل حساب. لذا، إذا تم تشغيل هذا الرمز على حساب كبير على "إعلانات Google"، يمكن أن يؤدي ذلك إلى زيادة الحمل على خوادم Google Ads API، ما يؤدي إلى تقييد المعدل والحد من الموارد.

والنهج الأفضل هو إنشاء تقرير واحد ومعالجته محليًا. يتم عرض أحد هذه الأساليب باستخدام خريطة في الذاكرة:

  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(customerId, query);

  var memoryMap = new Dictionary<long, List<GoogleAdsRow>>();
  foreach (GoogleAdsRow row in rows)
  {
    long adGroupId = row.AdGroup.Id;

    if (adGroupIds.Contains(adGroupId))
    {
      CheckAndAddRowIntoMemoryMap(row, adGroupId, memoryMap);
    }
  }
  foreach (KeyValuePair<long, List<GoogleAdsRow>> entry in memoryMap)
  {
    InsertRowsIntoStatsTable(entry.Key, entry.Value);
  }

ويؤدي ذلك إلى تقليل الحمل على خوادم 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. يتم تعديل جميع الأعمدة الأخرى بشكل غير متكرر أو لا يتم تعديلها على الإطلاق، لذا من غير الفعّال جلبها كل ساعة. يمكنك تخزين هذه القيم في قاعدة بيانات محلية وتشغيل تقرير حدث التغيير أو حالة التغيير لتنزيل التغييرات مرة أو مرتين في اليوم.

في بعض الحالات، يمكنك تقليل عدد الصفوف التي يتم تنزيلها من خلال تطبيق الفلاتر المناسبة.

حذف الحسابات غير المستخدَمة

إذا كان تطبيقك يدير حسابات عملاء تابعة لجهات خارجية، عليك تطوير تطبيقك مع مراعاة معدّل خسارة العملاء. يجب عليك بشكل دوري تنظيف العمليات ومخازن البيانات لإزالة حسابات العملاء الذين لم يعودوا يستخدمون تطبيقك. عند تنظيف حسابات "إعلانات Google" غير المستخدَمة، يُرجى مراعاة الإرشادات التالية:

  • إبطال التفويض الذي منحه العميل لتطبيقك لإدارة حسابه
  • توقَّف عن إجراء طلبات بيانات من واجهة برمجة التطبيقات إلى حسابات العميل على "إعلانات Google". وينطبق ذلك بشكل خاص على المهام التي يتم تنفيذها بلا إنترنت، مثل مهام cron ومسارات البيانات المصمَّمة للتشغيل بدون تدخّل المستخدم.
  • إذا ألغى العميل التفويض، يجب أن يتعامل تطبيقك مع الموقف بسلاسة ويتجنّب إرسال طلبات بيانات غير صالحة من واجهة برمجة التطبيقات إلى خوادم واجهة برمجة التطبيقات في Google.
  • إذا ألغى العميل حسابه على "إعلانات Google"، عليك رصد الحسابات المُلغاة وتجنُّب إرسال طلبات بيانات غير صالحة من واجهة برمجة التطبيقات إلى خوادم Google API.
  • احذف البيانات التي نزّلتها من حسابات العميل على "إعلانات Google" من قاعدة بياناتك المحلية بعد فترة زمنية مناسبة.