هناك عدة طرق مختلفة لتحسين Firebase Realtime Database الأداء في تطبيقك. لمعرفة الإجراءات التي يمكنك اتّخاذها لتحسين Realtime Database الأداء، اجمع البيانات من خلال أدوات Realtime Database الرصد المختلفة، ثم أجرِ تغييرات على تطبيقك أو استخدِم Realtime Database وفقًا لذلك.
مراقبة أداء Realtime Database
يمكنك جمع بيانات حول أداء Realtime Database باستخدام بعض الأدوات المختلفة، وذلك حسب مستوى التفاصيل التي تحتاج إليها:
- نظرة عامة على المستوى العالي: استخدِم أداة إنشاء الملفات الشخصية للحصول على قائمة بطلبات البحث غير المفهرسة ونظرة عامة في الوقت الفعلي على عمليات القراءة والكتابة.
- تقدير الاستخدام الخاضع للفوترة: استخدِم مقاييس الاستخدام المتاحة في وحدة تحكّم Firebase للاطّلاع على الاستخدام الخاضع للفوترة ومقاييس الأداء العالية المستوى.
- التفاصيل الدقيقة: استخدِم Cloud Monitoring للاطّلاع على تفاصيل أكثر دقة حول مستوى أداء قاعدة البيانات بمرور الوقت.
تحسين الأداء حسب المقياس
بعد جمع البيانات، اطّلِع على أفضل الممارسات والاستراتيجيات التالية استنادًا إلى مجال الأداء الذي تريد تحسينه.
| استراتيجيات تحسين الأداء في لمحة | ||
|---|---|---|
| المقياس | الوصف | أفضل الممارسات |
| التحميل/الاستخدام | حسِّن مقدار سعة قاعدة البيانات المستخدَمة في معالجة الطلبات في أي وقت (يظهر ذلك في مقياسَي **الحِمل** أو **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، المعروف أيضًا باسم تقسيم قاعدة البيانات، ثلاث مزايا:
- يمكنك زيادة إجمالي عدد الاتصالات النشطة والمتزامنة المسموح بها في تطبيقك من خلال تقسيمها على مثيلات قواعد البيانات.
- توزيع الحمل بالتساوي على مثيلات قاعدة البيانات
- إذا كانت لديك مجموعات مستقلة من المستخدمين لا تحتاج إلا إلى الوصول إلى مجموعات بيانات منفصلة، استخدِم مثيلات مختلفة لقاعدة البيانات من أجل زيادة معدل النقل وتقليل وقت الاستجابة.
إذا كنت تستخدم خطة Blaze المَرِنة، يمكنك إنشاء عدة مثيلات لقاعدة البيانات ضمن مشروع Firebase نفسه، والاستفادة من طريقة مصادقة مشتركة للمستخدمين في جميع مثيلات قاعدة البيانات.
مزيد من المعلومات حول كيفية تقسيم البيانات ومتى يجب تقسيمها
إنشاء بنى بيانات فعّالة
بما أنّ Realtime Database تسترد البيانات من العُقد الفرعية للمسار بالإضافة إلى المسار نفسه، من المنطقي أن تحافظ على بنية البيانات مسطّحة قدر الإمكان. بهذه الطريقة، يمكنك استرداد البيانات التي تحتاج إليها بشكل انتقائي، بدون تنزيل بيانات غير ضرورية على الأجهزة.
على وجه الخصوص، ضع في اعتبارك عمليات الكتابة والحذف عند تنظيم بياناتك. على سبيل المثال، قد يكون حذف المسارات التي تحتوي على آلاف العُقد مكلفًا. يمكن أن يؤدي تقسيمها إلى مسارات تتضمّن عدة شجرات فرعية وعددًا أقل من العُقد الطرفية لكل عقدة إلى تسريع عمليات الحذف.
بالإضافة إلى ذلك، يمكن أن تستغرق كل عملية كتابة% 0.1 من إجمالي استخدام قاعدة البيانات.
نظِّم بياناتك بطريقة تتيح لك تجميع عمليات الكتابة في عملية واحدة كتعديلات متعددة المسارات من خلال إحدى طرق update() في حِزم SDK أو طلبات PATCH المتوافقة مع REST.
لتحسين بنية البيانات وتحسين الأداء، اتّبِع أفضل الممارسات المتعلّقة ببنى البيانات.
منع الوصول غير المصرَّح به
يمكنك منع العمليات غير المصرَّح بها على قاعدة البيانات باستخدام 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
طلبات البحث في الفهرس
يؤدي فهرسة بياناتك إلى تقليل إجمالي معدل نقل البيانات الذي تستخدمه لكل طلب بحث ينفّذه تطبيقك.
إعادة استخدام جلسات SSL
يمكنك خفض تكاليف النفقات العامة لتشفير طبقة المقابس الآمنة (SSL) في الاتصالات التي تم استئنافها من خلال إصدار تذاكر جلسة بروتوكول أمان طبقة النقل (TLS). ويكون ذلك مفيدًا بشكل خاص إذا كنت بحاجة إلى اتصالات آمنة ومتكررة بقاعدة البيانات.
تحسين كفاءة المستمعين
ضَع أدوات معالجة البيانات في أدنى مستوى ممكن من مسار البيانات للحدّ من كمية البيانات التي تتم مزامنتها. يجب أن يكون المستمعون قريبين من البيانات التي تريد أن يحصلوا عليها. لا تستمع إلى قاعدة البيانات الجذرية، لأنّ ذلك يؤدي إلى تنزيل قاعدة البيانات بأكملها.
أضِف طلبات بحث للحدّ من البيانات التي تعرضها عمليات الاستماع واستخدِم أدوات الاستماع التي تنزّل التعديلات على البيانات فقط، مثل on() بدلاً من once(). احجز .once() للإجراءات التي لا تتطلّب حقًا تعديلات على البيانات.
بالإضافة إلى ذلك، رتِّب طلبات البحث باستخدام orderByKey() كلما أمكن ذلك للحصول على أفضل أداء. قد تكون عملية الترتيب باستخدام orderByChild() أبطأ بمقدار 6 إلى 8 مرات، وقد تكون عملية الترتيب باستخدام orderByValue() بطيئة جدًا لمجموعات البيانات الكبيرة، لأنّها تتطلّب قراءة الموقع الجغرافي بالكامل من طبقة الثبات.
احرص أيضًا على إضافة أدوات معالجة الأحداث بشكل ديناميكي، وإزالتها عندما لا تعود ضرورية.
حذف البيانات غير المستخدَمة
أزِل بشكل دوري أي بيانات غير مستخدَمة أو مكرّرة في قاعدة البيانات. يمكنك إجراء عمليات احتياطية لفحص بياناتك يدويًا أو الاحتفاظ بنسخة احتياطية منها بشكل دوري في حزمة Google Cloud Storage. ننصحك أيضًا باستضافة البيانات المخزّنة من خلال Cloud Storage for Firebase.
إصدار رمز قابل للتطوير يمكنك تعديله
يجب أن تتضمّن التطبيقات المضمّنة في أجهزة إنترنت الأشياء رمزًا برمجيًا قابلاً للتوسيع يمكنك تعديله بسهولة. احرص على اختبار حالات الاستخدام بدقة، ووضع سيناريوهات في الاعتبار قد يؤدي فيها إلى زيادة قاعدة المستخدمين بشكل كبير، وتوفير إمكانية نشر التحديثات على الرمز البرمجي. عليك التفكير مليًا في التغييرات الرئيسية التي قد تحتاج إلى إجرائها لاحقًا، مثلاً إذا قررت تقسيم بياناتك.