הדרך הטובה ביותר לשפר את הביצועים ולהרחיב את הנתונים ב-Firebase Realtime Database היא לפצל את הנתונים בין כמה מכונות של Realtime Database, פעולה שנקראת גם חלוקת מסד נתונים (database sharding). חלוקה לפלחים מאפשרת לכם להרחיב את המערכת מעבר למגבלות שחלות על מכונות נפרדות של מסדי נתונים, בנוסף לאיזון עומסים ולאופטימיזציה של הביצועים.
מתי כדאי לפצל את הנתונים
אם אתם משתמשים ב-Realtime Database, יכול להיות שתרצו לפצל את הנתונים לכמה מסדי נתונים בתרחישים הבאים:
- אתם רוצים להרחיב את המגבלה של 200,000 חיבורים בו-זמניים, 1,000 פעולות כתיבה בשנייה או כל אחת מהמגבלות האחרות של מופע מסד נתונים יחיד.
- יש לכם כמה קבוצות נתונים נפרדות ואתם רוצים לשפר את הביצועים (לדוגמה, אפליקציית צ'אט שמשרתת קבוצות נפרדות ובלתי תלויות של משתמשים).
- אתם רוצים לאזן את העומס בין כמה מסדי נתונים כדי לשפר את זמן הפעולה התקינה ולהפחית את הסיכון לעומס יתר על מכונה אחת של מסד נתונים.
איך לבצע חלוקה של הנתונים למקטעים (sharding)
כדי לפצל את הנתונים, פועלים לפי השלבים הבאים (שמתוארים בפירוט בהמשך):
- למפות את הנתונים למספר מסדי נתונים בהתאם לצרכים הספציפיים של האפליקציה.
- ליצור כמה מכונות של מסדי נתונים.
- מגדירים את האפליקציה כך שתתחבר למכונה של Realtime Database שנדרשת לכל קבוצת נתונים.
מיפוי הנתונים
כשממפים את הנתונים למספר מסדי נתונים, כדאי לנסות לעמוד בתנאים הבאים:
- כל שאילתה פועלת רק על מופע אחד של מסד נתונים. ב-Realtime Database אין תמיכה בשאילתות שכוללות כמה מכונות של מסדי נתונים.
- אין שיתוף או שכפול של נתונים בין מופעים של מסדי נתונים (או שיתוף או שכפול מינימליים).
- כל מופע של אפליקציה מתחבר רק למסד נתונים אחד בכל רגע נתון.
כשאתם ממפים את הנתונים, כדאי ליישם את האסטרטגיות הבאות:
יצירת "מאסטר שאד"
לשמור מפה של אופן אחסון הנתונים במופעים של מסד הנתונים. כך אפשר לחפש באופן פרוגרמטי את המכונה של מסד הנתונים שתואמת ללקוח שמתחבר. חשוב לזכור שזה עלול להוסיף תקורה, בהשוואה לחיבור ישיר למכונה הספציפית של מסד הנתונים שאתם צריכים, כשאתם צריכים אותה.
קיבוץ נתונים לפי קטגוריות או לפי לקוחות
אחסון נתונים במופעים מבודדים של מסדי נתונים, מקובצים לפי משתמש או סוג נתונים. לדוגמה, אם אתם מפתחים אפליקציית צ'אט שמשרתת כמה ארגונים, אתם יכולים ליצור מכונה של מסד נתונים לכל ארגון ולאחסן את כל נתוני הצ'אט במכונות ייחודיות של מסד הנתונים.
במקרה כזה, ארגון א' וארגון ב' לא משתפים נתונים, אין נתונים כפולים במסדי הנתונים, ואתם מריצים שאילתות רק על מופע אחד של מסד נתונים. בנוסף, המשתמשים בכל ארגון מתחברים רק למסד הנתונים של הארגון שלהם כשהם משתמשים באפליקציית הצ'אט.
אחר כך אפשר ליצור כמה מכונות של מסדי נתונים מראש, ולהשתמש במזהה של הארגון כדי למפות צוות למכונה של מסד הנתונים שלו. לדוגמה, ארגון א' ממופה למסד נתונים בזמן אמת א'.
הדרך שבה ממפים את הנתונים באפליקציה תלויה בתרחיש הספציפי שלכם, אבל התנאים והאסטרטגיות שמתוארים למעלה יכולים לעזור לכם להגדיר מה מתאים לנתונים שלכם.
יצירת כמה מופעים של Realtime Database
אם אתם משתמשים במינוי Blaze בתשלום לפי שימוש, אתם יכולים ליצור עד 1,000 מופעים של מסדי נתונים באותו פרויקט ב-Firebase.

במסוף Firebase, נכנסים לDatabases & Storage > מסד נתונים בזמן אמת > Data.
בתפריט הנפתח, בוחרים באפשרות Create new database.
מתאימים אישית את ההפניה למסד הנתונים ואת Security Rules, ואז לוחצים על הבנתי.
חוזרים על התהליך כדי ליצור כמה מכונות של מסדי נתונים שצריך. לכל מופע של מסד נתונים יש קבוצה משלו של Firebase Realtime Database Security Rules, כך שתוכלו לכוונן את הגישה לנתונים שלכם.
אפשר ליצור ולנהל מכונות של מסדי נתונים במסוף Firebase או באמצעות ממשק ה-API לניהול מסדי נתונים בזמן אמת בארכיטקטורת REST.
ניהול מכונות ספציפיות ואינטראקציה איתן באמצעות ה-CLI
אתם יכולים לנהל מכונות ספציפיות של Realtime Database ולבצע בהן פעולות באמצעות ה-CLI של Firebase.
כברירת מחדל, פקודות CLI פועלות על מופע מסד הנתונים המוגדר כברירת מחדל. עם זאת, אפשר לבצע אינטראקציה עם מופע של מסד נתונים שאינו ברירת המחדל באמצעות הדגל --instance DATABASE_NAME
לדוגמה, כדי להריץ את כלי הניתוח של מכונה של מסד נתונים בשם my-example-shard.firebaseio.com, משתמשים בפקודה הבאה:
firebase database:profile --instance "my-example-shard"
הפקודות הבאות תומכות בדגל --instance:
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
עורכים ומפעילים את Realtime Database Security Rules בכל מכונה
חשוב לוודא שRealtime Database Security Rules מאפשרים גישה מתאימה לכל מכונה של מסד נתונים בפרויקט. לכל מסד נתונים יש קבוצת כללים משלו, שאפשר לערוך ולפרוס ממסוף Firebase, או באמצעות ה-CLI של Firebase לפריסת יעדים.
כדי לערוך ולפרוס כללים ממסוף Firebase:
במסוף Firebase, עוברים אל Databases & Storage > מסד נתונים בזמן אמת > הכרטיסייה Rules.
בוחרים את מסד הנתונים שרוצים לערוך ומשנים את הכללים.
כדי לערוך ולפרוס כללים מ-CLI של Firebase, פועלים לפי השלבים הבאים:
משנים את הכללים בקובצי הכללים של המופעים של מסד הנתונים (לדוגמה,
foo.rules.json).יוצרים ומחילים יעדי פריסה כדי לשייך מסדי נתונים שמשתמשים באותו קובץ כללים. לדוגמה:
firebase target:apply database main my-db-1 my-db-2
firebase target:apply database other my-other-db-3
מעדכנים את קובץ התצורה
firebase.jsonעם יעדי הפריסה:{ "database": [ {"target": "main", "rules": "foo.rules.json"}, {"target": "other", "rules": "bar.rules.json"} ] }מריצים את פקודת הפריסה:
firebase deploy
חשוב להקפיד לערוך ולפרוס כללים מאותו מקום. פריסת כללים מ-CLI של Firebase מבטלת את כל העריכות שביצעתם במסוף Firebase, ועריכת כללים ישירות במסוף Firebase מבטלת את כל השינויים האחרונים שפרסתם באמצעות ה-CLI של Firebase.
קישור האפליקציה לכמה מופעים של מסדי נתונים
כדי לגשת לנתונים שמאוחסנים במופעים של מסד נתונים משני, צריך להשתמש בהפניה למסד הנתונים. אפשר לקבל את ההפניה למופע ספציפי של מסד נתונים לפי כתובת URL או אפליקציה. אם לא תציינו כתובת URL, תקבלו את ההפניה למופע ברירת המחדל של מסד הנתונים של האפליקציה.
Web
import { initializeApp } from "firebase/app"; import { getDatabase } from "firebase/database"; const app1 = initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 const database1 = getDatabase(app1); // Get a database instance for app2 const database2 = getDatabase(app2);
Web
const app1 = firebase.initializeApp({ databaseURL: "https://testapp-1234-1.firebaseio.com" }); const app2 = firebase.initializeApp({ databaseURL: "https://testapp-1234-2.firebaseio.com" }, 'app2'); // Get the default database instance for an app1 var database1 = firebase.database(); // Get a database instance for app2 var database2 = firebase.database(app2);
Swift
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
Objective-C
// Get the default database instance for an app@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Kotlin
// Get the default database instance for an app val primary = Firebase.database.reference // Get a secondary database instance by URL val secondary = Firebase.database("https://testapp-1234.firebaseio.com").reference
Java
// Get the default database instance for an app DatabaseReference primary = FirebaseDatabase.getInstance() .getReference(); // Get a secondary database instance by URL DatabaseReference secondary = FirebaseDatabase.getInstance("https://testapp-1234.firebaseio.com") .getReference();
אופטימיזציה של החיבורים בכל מסד נתונים
אם כל לקוח צריך להתחבר לכמה מסדי נתונים במהלך סשן, אפשר לצמצם את מספר החיבורים בו-זמנית לכל מכונה של מסד נתונים על ידי התחברות לכל מכונה של מסד נתונים רק למשך הזמן הדרוש.
עצות נוספות
אם אתם צריכים עזרה נוספת בפיצול הנתונים בין כמה מופעים של מסדי נתונים, אתם יכולים לפנות למומחי Firebase בערוץ Slack או ב-Stack Overflow.