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

هناك عدة طرق مختلفة لتحسين 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 keep-alive للحفاظ على اتصال مفتوح أو استخدام الأحداث التي يرسلها الخادم، ما قد يقلّل التكاليف الناتجة عن عمليات تبادل بيانات SSL.

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

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

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

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

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

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

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

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

بالإضافة إلى ذلك، يمكن أن تستغرق كل عملية كتابة% 0.1 من إجمالي استخدام قاعدة البيانات. نظِّم بياناتك بطريقة تتيح لك تجميع عمليات الكتابة في عملية واحدة كتعديلات متعددة المسارات من خلال إحدى طرق update() في حِزم تطوير البرامج (SDK) أو طلبات PATCH المتوافقة مع REST.

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

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

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

مزيد من المعلومات عن استخدام قواعد Firebase Realtime Database

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

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

طلبات البحث في الفهرس

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

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

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

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

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

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

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

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

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

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

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