קנה מידה עם מספר מסדי נתונים

הדרך הטובה ביותר לבצע אופטימיזציה של הביצועים ולהתאים את היקף הנתונים ב-Firebase Realtime Database היא לפצל את הנתונים בין כמה מכונות Realtime Database, שנקראת גם חלוקה של מסדי נתונים. פיצול מאפשר לכם גמישות להרחיב את הפעילות מעבר המגבלות שחלות על מסד נתונים מסוים נוסף על איזון העומסים ואופטימיזציה של הביצועים.

מתי לפצל את הנתונים

אם רוצים לפצל את הנתונים בין מסדי נתונים מרובים, Realtime Database והם מתאימים לכל אחד מהתרחישים הבאים:

  • אתם רוצים להרחיב את התשתית מעבר למגבלה של 200,000 חיבורים בו-זמנית, 1,000 פעולות כתיבה לשנייה או כל אחת מהמגבלות האחרות למכונה אחת של מסד נתונים.
  • יש לך כמה קבוצות נתונים נפרדות, וברצונך לבצע אופטימיזציה של הביצועים (לדוגמה, אפליקציית צ'אט שמשרתת קבוצות נפרדות ועצמאיות של משתמשים).
  • אתם רוצים לאזן את העומס בין מסדי נתונים מרובים כדי לשפר את זמן הפעולה התקינה מפחיתים את הסיכון של עומס יתר על מכונה אחת של מסד נתונים.

איך מחלקים את הנתונים לקטעים

כדי לפצל את הנתונים, פועלים לפי השלבים הבאים (מתוארים בפירוט בהמשך):

  1. למפות את הנתונים למספר מסדי נתונים בהתאם לצרכים הספציפיים של האפליקציה.
  2. ליצור כמה מכונות של מסדי נתונים.
  3. מגדירים את האפליקציה כך שתתחבר למכונה של Realtime Database שנדרשת לכל קבוצת נתונים.

מיפוי הנתונים

כשממפים את הנתונים למספר מסדי נתונים, נסו לעמוד את התנאים הבאים:

  • כל שאילתה רצה רק מול מופע אחד של מסד נתונים. Realtime Database לא תומך בשאילתות במכונות של מסד הנתונים.
  • אין שיתוף או כפילות של נתונים בין מכונות של מסד נתונים (או לצמצם את השיתוף או הכפילויות).
  • כל מופע של אפליקציה מתחבר רק למסד נתונים אחד בכל רגע נתון.

כשממפים את הנתונים, כדאי להשתמש בשיטות הבאות:

יצירת 'master shard'

אחסון מפה של האופן שבו הנתונים שלך מאוחסנים מכונות של מסד נתונים. כך תוכלו לחפש באופן פרוגרמטי איזו מכונה של מסד נתונים תואמת ללקוח שמתחבר. חשוב לזכור ששיטה כזו עשויה לכלול עלויות תפעול גבוהות יותר מאשר התחברות ישירה למכונה הספציפית של מסד הנתונים שנדרשת לכם, בזמן הצורך.

נתוני קטגוריות לפי קטגוריות או לפי לקוח

אחסון נתונים במכונות של מסד נתונים נפרד, המקובצות לפי משתמש או סוג הנתונים. לדוגמה, אם אתם מפתחים אפליקציית צ'אט שמיועדת לכמה ארגונים, תוכלו ליצור מכונה של מסד נתונים לכל ארגון ולאחסן את כל נתוני הצ'אט במכונות ייחודיות של מסדי נתונים.

במקרה כזה, ארגון א' וארגון ב' לא משתפים נתונים, אין נתונים כפולים במסדי הנתונים שלכם ואתם מבצעים שאילתות רק במכונה אחת של מסד נתונים. בנוסף, המשתמשים בכל ארגון מתחברים למסד הנתונים של הארגון שלהם רק כשהם משתמשים באפליקציית הצ'אט.

לאחר מכן תוכלו ליצור כמה מכונות של מסדי נתונים מראש ולהשתמש במזהה הארגון כדי למפות צוות למכונה של מסד הנתונים שלו. לדוגמה, ארגון א' ממופה למסד נתונים בזמן אמת א'.

האופן שבו ממפים נתונים לאפליקציה תלוי בתרחיש לדוגמה הספציפי, אבל התנאים והאסטרטגיות שמפורטים למעלה יכולים לעזור לכם להגדיר מה מתאים לנתונים שלכם.

יצירת כמה מכונות Realtime Database

אם משתמשים בתוכנית התמחור והתשלומים של Bllaze, אפשר ליצור עד 1,000 פריטים. מכונות של מסד נתונים באותו פרויקט Firebase.

ליצור מסד נתונים ב<span class=מסוף Firebase עם תפריט ההקשר בקטע של מסדי הנתונים" />

  1. במסוף Firebase, עוברים לכרטיסייה Data בקטע Develop > Database.
  2. בתפריט שבקטע Realtime Database, בוחרים באפשרות Create new database.
  3. להתאים אישית את ההפניה למסד הנתונים ואת כללי אבטחה, ואז לוחצים על הבנתי אותו.

חוזרים על התהליך כדי ליצור כמה מכונות של מסד הנתונים שרוצים. כל אחד למכונה של מסד הנתונים יש קבוצה משלה של Firebase Realtime Database Security Rules, כך שאפשר לשפר את הגישה לנתונים.

אפשר ליצור ולנהל מכונות של מסד נתונים במסוף Firebase או באמצעות ממשק ה-API ל-REST של ניהול מסדי נתונים בזמן אמת.

עריכה ופריסה של Realtime Database Security Rules בכל מכונה

חשוב לוודא שה-Realtime Database Security Rules מאפשר גישה מתאימה לכל אחד מהרכיבים במופע של מסד הנתונים בפרויקט. לכל מסד נתונים יש קבוצת כללים משלו, שאפשר לערוך ולפרוס מהמסוף Firebase או באמצעות CLI של Firebase לפריסה של יעדים.

  • כדי לערוך ולפרוס כללים במסוף Firebase:

    1. נכנסים אל הכרטיסייה כללים בקטע פיתוח > הקטע 'מסד נתונים'.
    2. בוחרים את מסד הנתונים שרוצים לערוך ומשנים את הכללים.
  • כדי לערוך ולפרוס כללים מ-CLI של Firebase:

    1. משנים את הכללים בקובצי הכללים של המכונות של מסד הנתונים (לדוגמה, foo.rules.json).
    2. יוצרים יעדים לפריסה ומחילים אותם כדי לשייך מסדי נתונים שמשתמשים באותו קובץ כללים. מוצרים לדוגמה:
      firebase target:apply database main my-db-1 my-db-2
      firebase target:apply database other my-other-db-3
    3. מעדכנים את קובץ התצורה firebase.json עם יעדי הפריסה:

      {
        "database": [
          {"target": "main", "rules": "foo.rules.json"},
          {"target": "other", "rules": "bar.rules.json"}
        ]
      }
      
    4. מריצים את פקודת הפריסה:

      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
הערה: מוצר Firebase הזה לא זמין ביעד 'קליפ של אפליקציה'.
// Get the default database instance for an app
var ref: DatabaseReference!

ref = Database.database().reference()
// Get asecondary dataset instance by URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
הערה: מוצר Firebase הזה לא זמין ביעד 'קליפ של אפליקציה'.
// Get the default database instance for an app
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];
// אחזור מכונה משנית של מסד נתונים לפי כתובת URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] reference];

Kotlin+KTX

// 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();

מציינים מופע כשמשתמשים ב-CLI של Firebase

משתמשים באפשרות --instance כדי לציין לאיזה Firebase Realtime Database רוצים להחיל פקודת CLI של Firebase. לדוגמה, מריצים את הפקודה הבאה הכלי ליצירת פרופילים למכונה של מסד נתונים my-example-shard.firebaseio.com:

firebase database:profile --instance "my-example-shard"

לבצע אופטימיזציה של החיבורים בכל מסד נתונים

אם כל לקוח צריך להתחבר למספר מסדי נתונים במהלך סשן, תוכלו מפחיתים את מספר החיבורים בו-זמנית לכל מופע של מסד נתונים על ידי להתחבר לכל מכונה של מסד נתונים למשך הזמן הנדרש בלבד.

לעצות נוספות

אם דרושה לכם עזרה נוספת בחלוקת הנתונים למספר מכונות של מסדי נתונים, תוכלו לפנות למומחים של Firebase בערוץ Slack או ב-Stack Overflow.