تحسين أداء قاعدة البيانات

هناك بضع طرق مختلفة لتحسين Firebase Realtime Database الأداء في تطبيقك. لمعرفة الإجراءات التي يمكنك اتّخاذها لتحسين Realtime Database الأداء، يمكنك جمع البيانات من خلال أدوات مراقبة Realtime Database المختلفة، ثم إجراء تغييرات على تطبيقك أو على استخدام Realtime Database وفقًا لذلك.

مراقبة أداء Realtime Database

يمكنك جمع بيانات عن أداء Realtime Database من خلال بضع أدوات مختلفة، استنادًا إلى مستوى الدقّة الذي تحتاجه:

  • نظرة عامة على مستوى عالٍ: استخدِم أداة تحليل الأداء للحصول على قائمة بطلبات البحث غير المفهرَسة ونظرة عامة في الوقت الفعلي على عمليات القراءة/الكتابة.
  • تقدير الاستخدام الذي تمّت فوترته: استخدِم مقاييس الاستخدام المتوفّرة في وحدة تحكّم Firebase للاطّلاع على الاستخدام الذي تمّت فوترته ومقاييس الأداء العالية المستوى.
  • التوغّل التفصيلي: استخدِم Cloud Monitoring لإلقاء نظرة أكثر دقة على مستوى أداء قاعدة البيانات بمرور الوقت.

تحسين الأداء حسب المقياس

بعد جمع البيانات، اطّلِع على أفضل الممارسات والاستراتيجيات التالية استنادًا إلى مجال الأداء الذي تريد تحسينه.

نظرة سريعة على استراتيجيات تحسين الأداء
المقياس الوصف أفضل الممارسات
الحمل/الاستجابة حسِّن نسبة سعة قاعدة بياناتك المستخدَمة في معالجة الطلبات في أي وقت (يظهر ذلك في مقياسَي **Load** أو **io/database_load**). تحسين بنية البيانات
تقسيم البيانات على مستوى قواعد البيانات
تحسين كفاءة المستمعين
تقليل عمليات التنزيل باستخدام القواعد المستنِدة إلى طلبات البحث
تحسين عمليات التواصل
الاتصالات النشطة يجب موازنة عدد الاتصالات النشطة المتزامنة بقاعدة بياناتك للبقاء ضمن الحد الأقصى البالغ 200,000 اتصال. تقسيم البيانات على مستوى قواعد البيانات
تقليل الاتصالات الجديدة
معدّل نقل البيانات الصادرة إذا كانت عمليات التنزيل من قاعدة البيانات تبدو أعلى مما تريد، يمكنك تحسين كفاءة عمليات القراءة وخفض النفقات العامة للتشفير. تحسين عمليات الربط
تحسين بنية البيانات
حصر عمليات التنزيل باستخدام القواعد المستندة إلى طلبات البحث
إعادة استخدام جلسات طبقة المقابس الآمنة
تحسين كفاءة المستمع
حظر الوصول إلى البيانات
التخزين تأكَّد من عدم تخزين بيانات غير مستخدَمة، أو من توازن بياناتك المخزّنة في قواعد بيانات أخرى و/أو منتجات Firebase الأخرى للبقاء ضمن الحصة. تنظيم البيانات غير المستخدَمة
تحسين بنية البيانات
تقسيم البيانات على مستوى قواعد البيانات
استخدام Cloud Storage for Firebase

تحسين عمليات الربط

لا تزال طلبات RESTful، مثل GET وPUT، تتطلّب اتصالاً، حتى إذا كان هذا الاتصال قصير الأجل. يمكن أن تؤدي عمليات الاتصال المتكررة قصيرة الأجل هذه إلى زيادة كبيرة في تكاليف الاتصال وتحميل قاعدة البيانات و النطاق الترددي الصادر مقارنةً بعمليات الاتصال النشطة في الوقت الفعلي بقاعدة بياناتك.

استخدِم حِزم SDK الأصلية لنظام التشغيل الخاص بتطبيقك كلما أمكن ذلك، بدلاً من استخدام واجهة برمجة التطبيقات REST API. تحافظ حِزم تطوير البرامج (SDK) على الاتصالات المفتوحة، ما يقلل من تكاليف تشفير طبقة المقابس الآمنة (SSL) وحمولة قاعدة البيانات التي يمكن أن تتراكم مع REST API.

في حال استخدام واجهة برمجة التطبيقات REST API، ننصحك باستخدام ميزة "إبقاء الاتصال مفتوحًا" في بروتوكول HTTP للحفاظ على اتصال مفتوح أو استخدام الأحداث المُرسَلة من الخادم، التي يمكن أن تقلّل التكاليف الناتجة عن عمليات مصافحة طبقة المقابس الآمنة.

تقسيم البيانات على قواعد بيانات متعددة

يقدّم تقسيم بياناتك على مثيلات متعددة من Realtime Database، المعروفة أيضًا باسم تقسيم قاعدة البيانات، ثلاث مزايا:

  1. يمكنك زيادة إجمالي عدد عمليات الربط النشطة المتزامنة المسموح بها في تطبيقك من خلال تقسيمها على مثيلات قاعدة البيانات.
  2. موازنة الحمل على مستوى مثيلات قاعدة البيانات
  3. إذا كانت لديك مجموعات مستقلة من المستخدمين لا تحتاج إلا إلى الوصول إلى مجموعات بيانات متمايزة، استخدِم نُسخًا مختلفة من قاعدة البيانات لزيادة معدل نقل البيانات وخفض وقت الاستجابة.

إذا كنت مشتركًا في خطة تسعير Blaze، يمكنك إنشاء مثيلات قواعد بيانات متعددة ضمن مشروع Firebase نفسه، بالاستفادة من طريقة شائعة لمصادقة المستخدم في مثيلات قاعدة البيانات.

مزيد من المعلومات حول كيفية تقسيم البيانات وحالات تقسيمها

إنشاء بنى بيانات فعّالة

بما أنّ Realtime Database يسترد البيانات من العُقد الثانوية للمسار بالإضافة إلى المسار، من المنطقي الحفاظ على بنية البيانات مسطحة قدر الإمكان. بهذه الطريقة، يمكنك استرداد البيانات التي تحتاج إليها بشكل انتقائي، بدون تنزيل بيانات غير ضرورية إلى العملاء أيضًا.

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

بالإضافة إلى ذلك، يمكن أن تستهلك كل عملية كتابة نسبة% 0.1 من إجمالي استخدام قاعدة البيانات. يمكنك تنظيم بياناتك بطريقة تسمح لك بتجميع عمليات الكتابة في عملية واحدة كتعديلات على مسارات متعددة من خلال طُرق update() في IDE أو طلبات PATCH RESTful.

لتحسين بنية البيانات وتحسين الأداء، اتّبِع أفضل الممارسات المتعلّقة ببنى البيانات.

منع الوصول غير المصرَّح به

يمكنك منع العمليات غير المصرّح بها على قاعدة بياناتك باستخدام Realtime Database Security Rules. على سبيل المثال، قد يؤدي استخدام القواعد إلى تجنب سيناريو ينزّل فيه مستخدم ضارّ قاعدة البيانات بأكملها بشكل متكرر.

اطّلِع على مزيد من المعلومات عن استخدام قواعد قاعدة بيانات Firebase الآنية الاستجابة.

استخدام قواعد مستندة إلى طلبات البحث للحد من عمليات التنزيل

Realtime Database Security Rules تقييد الوصول إلى البيانات في قاعدة بياناتك، ولكن يمكنها أيضًا أن تُستخدم كحدود على البيانات التي يتم عرضها من خلال عمليات القراءة عند استخدام قواعد مستندة إلى طلبات البحث، على النحو المحدّد في تعبيرات query. مثل query.limitToFirst، لا تسترد طلبات البحث سوى البيانات التي تفرضها القاعدة.

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

messages: {
  ".read": "query.orderByKey &&
            query.limitToFirst <= 1000"
}

// Example query:
db.ref("messages").limitToFirst(1000)
                  .orderByKey("value")

اطّلِع على مزيد من المعلومات عن Realtime Database Security Rules.

طلبات البحث المفهرَسة

تؤدي فهرسة بياناتك إلى تقليل إجمالي معدل نقل البيانات الذي تستخدمه لكل طلب بحث يُجريه تطبيقك.

إعادة استخدام جلسات طبقة المقابس الآمنة

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

تحسين كفاءة المستمعين

ضَع المستمعين في أبعد نقطة ممكنة من المسار للحد من كمية البيانات التي تتم مزامنتها. يجب أن يكون المستمعون قريبين من البيانات التي تريدهم الحصول عليها. لا تستمع إلى قاعدة البيانات الجذر، لأنّ ذلك يؤدي إلى تنزيل قاعدة بياناتك بالكامل.

أضِف طلبات بحث للحد من البيانات التي تعرضها عمليات الاستماع واستخدِم أدوات الاستماع التي تنزِّل فقط التعديلات على البيانات، على سبيل المثال، on() بدلاً من once(). احرِص على استخدام القيمة .once() للإجراءات التي لا تتطلّب تعديلات البيانات. بالإضافة إلى ذلك، يمكنك ترتيب طلبات البحث باستخدام orderByKey() كلما أمكن ذلك لتحقيق أفضل أداء. يمكن أن تكون عملية الترتيب باستخدام orderByChild() أبطأ من 6 إلى 8 مرات، ويمكن أن تكون عملية الترتيب باستخدام orderByValue() بطيئة جدًا لمجموعات البيانات الكبيرة، لأنّها تتطلّب قراءة الموقع الجغرافي بالكامل من طبقة الثبات.

احرص أيضًا على إضافة مستمعين بشكل ديناميكي وإزالتهم عندما لا يعودون ضروريين.

تنظيف البيانات غير المستخدَمة

قم بإزالة أي بيانات غير مستخدمة أو مكررة من قاعدة البيانات بشكل دوري. يمكنك تنفيذ عمليات الاحتفاظ بنسخة احتياطية لفحص بياناتك يدويًا أو الاحتفاظ بنسخة احتياطية منها بشكل دوري في حزمة Google Cloud Storage. يمكنك أيضًا استضافة البيانات المخزّنة من خلال Cloud Storage for Firebase.

إرسال رمز قابل للتطوير ويمكنك تعديله

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