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

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

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

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

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

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

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

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

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

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

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

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

יצירת 'רסיס ראשי'

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

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

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

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

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

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

יצירת כמה מופעים של Realtime Database

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

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

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

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

אפשר ליצור ולנהל מופעים של מסדי נתונים במסוף Firebase או באמצעות Realtime Database Management REST API.

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

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

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

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

    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

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

קישור האפליקציה לכמה מופעים של מסד נתונים

משתמשים בהפניה למסד הנתונים כדי לגשת לנתונים שמאוחסנים במופעים משניים של מסד הנתונים. אפשר לקבל את ההפניה למופע מסוים של מסד נתונים לפי כתובת 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 הזה לא זמין ביעד App Clip.
// Get the default database instance for an app
var ref: DatabaseReference!

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

self.ref = [[FIRDatabase database] reference];
// Get a secondary database instance by URL @property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase databaseWithURL:@"https://testapp-1234.firebaseio.com"] 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 CLI

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

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

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

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

עצות נוספות

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