הדרך הטובה ביותר לבצע אופטימיזציה של הביצועים ולהתאים את היקף הנתונים ב-Firebase Realtime Database היא לפצל את הנתונים בין כמה מכונות Realtime Database, שנקראת גם חלוקה של מסדי נתונים. חלוקה למקטעים מאפשרת לכם להתאים את הקיבולת לצרכים שלכם מעבר למגבלות שחלות על מכונות של מסדי נתונים נפרדים, בנוסף לאיזון עומסים ולביצוע אופטימיזציה של הביצועים.
מתי כדאי לפצל את הנתונים
כדאי לפצל את הנתונים בין כמה מסדי נתונים אם אתם משתמשים ב-Realtime Database ומתקיימים עליכם אחד מהתרחישים הבאים:
- אתם רוצים להרחיב את התשתית מעבר למגבלה של 200,000 חיבורים בו-זמנית, 1,000 פעולות כתיבה לשנייה או כל אחת מהמגבלות האחרות למכונה אחת של מסד נתונים.
- יש לכם כמה קבוצות נפרדות של נתונים ואתם רוצים לבצע אופטימיזציה של הביצועים (לדוגמה, אפליקציית צ'אט שמציגה מודעות לקבוצות נפרדות ועצמאיות של משתמשים).
- אתם רוצים לאזן את העומס בין כמה מסדי נתונים כדי לשפר את זמן הפעולה ולהפחית את הסיכון להתקפי עומס על מכונה אחת של מסד נתונים.
איך מחלקים את הנתונים לקטעים
כדי לפצל את הנתונים, פועלים לפי השלבים הבאים (שמתוארים בפירוט בהמשך):
- למפות את הנתונים למספר מסדי נתונים בהתאם לצרכים הספציפיים של האפליקציה.
- ליצור כמה מכונות של מסדי נתונים.
- מגדירים את האפליקציה כך שתתחבר למכונה של Realtime Database שנדרשת לכל קבוצת נתונים.
מיפוי הנתונים
כשממפים את הנתונים למספר מסדי נתונים, כדאי לנסות לעמוד בתנאים הבאים:
- כל שאילתה פועלת רק במופע אחד של מסד נתונים. Realtime Database לא תומך בשאילתות במכונות שונות של מסדי נתונים.
- אין שיתוף או כפילות של נתונים בין מכונות של מסדי נתונים (או שיתוף או כפילות מינימלי).
- כל מופע של אפליקציה מתחבר רק למסד נתונים אחד בכל רגע נתון.
כשממפים את הנתונים, כדאי להשתמש בשיטות הבאות:
יצירת 'master shard'
שמירת מפה של אופן האחסון של הנתונים במכונות של מסדי נתונים. כך תוכלו לחפש באופן פרוגרמטי איזו מכונה של מסד נתונים תואמת ללקוח שמתחבר. חשוב לזכור ששיטה כזו עשויה לכלול עלויות נוספות בהשוואה לחיבור ישיר למכונה הספציפית של מסד הנתונים שנדרש לכם, בזמן הצורך.
קיבוץ נתונים לפי קטגוריות או לפי לקוח
אחסון נתונים במכונות של מסדי נתונים בקטגוריות נפרדות, שמקובצות לפי משתמש או סוג נתונים. לדוגמה, אם אתם מפתחים אפליקציית צ'אט שמיועדת לכמה ארגונים, תוכלו ליצור מכונה של מסד נתונים לכל ארגון ולאחסן את כל נתוני הצ'אט במכונות ייחודיות של מסדי נתונים.
במקרה כזה, ארגון א' וארגון ב' לא משתפים נתונים, אין נתונים כפולים במסדי הנתונים שלכם ואתם מבצעים שאילתות רק במכונה אחת של מסד נתונים. בנוסף, המשתמשים בכל ארגון מתחברים למסד הנתונים של הארגון שלהם רק כשהם משתמשים באפליקציית הצ'אט.
לאחר מכן תוכלו ליצור כמה מכונות של מסדי נתונים מראש ולהשתמש במזהה הארגון כדי למפות צוות למכונה של מסד הנתונים שלו. לדוגמה, ארגון א' ממופה למסד נתונים בזמן אמת א'.
האופן שבו ממפים נתונים לאפליקציה תלוי בתרחיש לדוגמה הספציפי, אבל התנאים והאסטרטגיות שמפורטים למעלה יכולים לעזור לכם להגדיר מה מתאים לנתונים שלכם.
יצירת מספר מכונות Realtime Database
אם אתם משתמשים בתוכנית התמחור Blaze, אתם יכולים ליצור עד 1,000 מכונות של מסדי נתונים באותו פרויקט ב-Firebase.
מסוף Firebase עם תפריט ההקשר בקטע של מסדי הנתונים" />
- במסוף Firebase, עוברים לכרטיסייה Data בקטע Develop > Database.
- בתפריט בקטע Realtime Database, בוחרים באפשרות יצירת מסד נתונים חדש.
- מתאימים אישית את הפנייה למסד נתונים ואת כללי האבטחה, ולוחצים על הבנתי.
חוזרים על התהליך כדי ליצור כמה מכונות של מסדי נתונים שרוצים. לכל מכונה של מסד נתונים יש קבוצה משלה של Firebase Realtime Database Security Rules, כך שתוכלו לשפר את הגישה לנתונים שלכם.
אפשר ליצור מכונות של מסדי נתונים ולנהל אותן במסוף Firebase או באמצעות ה-API ל-REST לניהול של מסדי נתונים בזמן אמת.
עריכה ופריסה של Realtime Database Security Rules לכל מכונה
חשוב לוודא שה-Realtime Database Security Rules מאפשרים גישה מתאימה לכל מכונה של מסד נתונים בפרויקט. לכל מסד נתונים יש קבוצת כללים משלו, שאפשר לערוך ולפרוס מהמסוף Firebase או באמצעות CLI של Firebase לפריסה של יעדים.
כדי לערוך ולפרוס כללים במסוף Firebase:
- עוברים לכרטיסייה Rules בקטע Develop > Database.
- בוחרים את מסד הנתונים שרוצים לערוך ומשנים את הכללים.
כדי לערוך ולפרוס כללים מ-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()// אחזור מכונה משנית של מסד נתונים לפי כתובת URL var ref: DatabaseReference! ref = Database.database("https://testapp-1234.firebaseio.com").reference()
Objective-C
// 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();
ציון מכונה כשמשתמשים ב-Firebase CLI
משתמשים באפשרות --instance
כדי לציין לאיזה Firebase Realtime Database רוצים להחיל פקודת CLI של Firebase. לדוגמה, אפשר להשתמש בפקודה הבאה כדי להריץ את הכלי לניתוחי ביצועים למכונה של מסד נתונים בשם my-example-shard.firebaseio.com
:
firebase database:profile --instance "my-example-shard"
אופטימיזציה של החיבורים בכל מסד נתונים
אם כל לקוח צריך להתחבר לכמה מסדי נתונים במהלך סשן, אפשר לצמצם את מספר החיבורים בו-זמנית לכל מכונה של מסד נתונים על ידי חיבור לכל מכונה של מסד נתונים רק למשך הזמן הנדרש.
קבלת עצות נוספות
אם דרושה לכם עזרה נוספת בחלוקת הנתונים למספר מכונות של מסדי נתונים, תוכלו לפנות למומחים של Firebase בערוץ Slack או ב-Stack Overflow.