مقیاس‌بندی با چند پایگاه داده

بهترین راه برای بهینه‌سازی عملکرد و مقیاس‌بندی داده‌هایتان در Firebase Realtime Database این است که داده‌هایتان را در چند نمونه Realtime Database تقسیم کنید، که به آن بخش‌بندی پایگاه داده نیز می‌گویند. تکه‌تکه کردن به شما انعطاف‌پذیری می‌دهد تا فراتر از محدودیت‌هایی که برای نمونه‌های پایگاه داده مجزا اعمال می‌شود، مقیاس‌بندی کنید، علاوه‌بر توازن بار و بهینه‌سازی عملکرد.

چه زمانی داده‌هایتان را بخش‌بندی کنید

اگر از Realtime Database استفاده می‌کنید و در هریک از سناریوهای زیر قرار می‌گیرید، ممکن است بخواهید داده‌هایتان را در چندین پایگاه داده تقسیم کنید:

  • می‌خواهید فراتر از حد ۲۰۰۰۰۰ اتصال هم‌زمان، ۱۰۰۰ عملیات نوشتن در ثانیه، یا هرکدام از حدود دیگر برای یک نمونه پایگاه داده واحد مقیاس‌بندی کنید.
  • چندین مجموعه داده مجزا دارید و می‌خواهید عملکرد را بهینه‌سازی کنید (برای مثال، برنامه گپی که به گروه‌های مجزا و مستقل کاربران خدمات ارائه می‌دهد).
  • می‌خواهید بار را در چندین پایگاه داده متعادل کنید تا زمان فعال بودن دستگاه را بهبود ببخشید و خطر اضافه‌بار شدن یک نمونه پایگاه داده را کاهش دهید.

نحوه قطعه‌بندی داده‌ها

برای قطعه‌بندی کردن داده‌هایتان، این مراحل را دنبال کنید (در زیر با جزئیات بیشتر شرح داده شده است):

  1. داده‌هایتان را براساس نیازهای خاص برنامه‌تان به چندین پایگاه داده نگاشت کنید.
  2. چندین نمونه پایگاه داده ایجاد کنید.
  3. برنامه‌تان را پیکربندی کنید تا به نمونه Realtime Database لازم برای هر مجموعه داده متصل شود.

نگاشت داده‌ها

وقتی داده‌هایتان را به چندین پایگاه داده نگاشت می‌کنید، سعی کنید شرایط زیر را برآورده کنید:

  • هر پرسمان فقط در یک نمونه پایگاه داده اجرا می‌شود. ‫Realtime Database از پُرسمان‌ها در نمونه‌های پایگاه داده پشتیبانی نمی‌کند.
  • هیچ داده‌ای در نمونه‌های پایگاه داده هم‌رسانی یا تکرار نمی‌شود (یا هم‌رسانی یا تکرار حداقل است).
  • هر نمونه برنامه در هر لحظه فقط به یک پایگاه داده متصل می‌شود.

هنگام نگاشت داده‌هایتان، استفاده از استراتژی‌های زیر را درنظر بگیرید:

ایجاد «تکه اصلی»

نقشه‌ای از نحوه ذخیره شدن داده‌هایتان در نمونه‌های پایگاه داده ذخیره کنید. به‌این‌ترتیب، می‌توانید به‌صورت برنامه‌نویسی‌شده جستجو کنید که کدام نمونه پایگاه داده با کلاینت متصل‌شونده مطابقت دارد. به‌خاطر داشته باشید که این کار ممکن است سربار بیشتری نسبت به اتصال مستقیم به نمونه پایگاه داده خاصی که نیاز دارید، در زمانی که نیاز دارید، داشته باشد.

داده‌های Bucket براساس دسته‌ها یا مشتری

داده‌ها را در نمونه‌های پایگاه داده مجزا، گروه‌بندی‌شده براساس کاربر یا نوع داده، ذخیره کنید. برای مثال، اگر برنامه گپی می‌سازید که به چندین سازمان خدمات ارائه می‌دهد، می‌توانید برای هر سازمان یک نمونه پایگاه داده ایجاد کنید و همه داده‌های گپ را در نمونه‌های پایگاه داده منحصربه‌فرد ذخیره کنید.

در این حالت، سازمان الف و سازمان ب داده‌ها را هم‌رسانی نمی‌کنند، هیچ داده تکراری‌ای در پایگاه‌های داده شما وجود ندارد، و شما فقط پُرسمان‌ها را درمقابل یک نمونه پایگاه داده اجرا می‌کنید. علاوه‌براین، کاربران هر سازمان فقط وقتی از برنامه گپ استفاده می‌کنند به پایگاه داده سازمانشان متصل می‌شوند.

سپس می‌توانید چندین نمونه پایگاه داده را ازقبل ایجاد کنید و از شناسه سازمان برای نگاشت تیم به نمونه پایگاه داده آن استفاده کنید. برای مثال، سازمان الف به «پایگاه داده بی‌درنگ» الف نگاشت می‌شود.

نحوه نگاشت داده‌ها برای برنامه‌تان به مورد استفاده خاص شما بستگی دارد، اما شرایط و راهبردهای ذکرشده در بالا می‌تواند به شما کمک کند تا آنچه را برای داده‌هایتان مناسب است تعریف کنید.

ایجاد چندین نمونه Realtime Database

اگر در طرح قیمت‌گذاری Blaze هستید، می‌توانید تا ۱۰۰۰ نمونه پایگاه داده در همان پروژه Firebase ایجاد کنید.

ایجاد پایگاه داده در کنسول Firebase با منوِ بافت در بخش پایگاه‌های داده

  1. در کنسول Firebase، به برگه پایگاه‌های داده و فضای ذخیره‌سازی > پایگاه داده هم‌زمان > داده بروید.

  2. ایجاد پایگاه داده جدید را از منوِ کرکره‌ای انتخاب کنید.

  3. مرجع پایگاه داده و Security Rules را سفارشی‌سازی کنید، سپس روی متوجه شدم کلیک کنید.

این فرایند را تکرار کنید تا هر تعداد نمونه پایگاه داده که نیاز دارید ایجاد شود. هر نمونه پایگاه داده مجموعه Firebase Realtime Database Security Rules خودش را دارد، بنابراین می‌توانید دسترسی به داده‌هایتان را به‌طور دقیق تنظیم کنید.

می‌توانید نمونه‌های پایگاه داده را در کنسول Firebase یا بااستفاده از Realtime Database Management REST API ایجاد و مدیریت کنید.

مدیریت و تعامل با نمونه‌های خاص بااستفاده از CLI

می‌توانید بااستفاده از Firebase CLI، با نمونه‌های خاص Realtime Database تعامل داشته باشید و آن‌ها را مدیریت کنید.

به‌طور پیش‌فرض، فرمان‌های CLI با نمونه پایگاه داده پیش‌فرض شما تعامل دارند. اما می‌توانید بااستفاده از پرچم --instance DATABASE_NAME با نمونه پایگاه داده غیرپیش‌فرض تعامل داشته باشید.

برای مثال، از فرمان زیر برای اجرای نمایه‌ساز برای نمونه پایگاه داده‌ای با نام my-example-shard.firebaseio.com استفاده کنید:

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

فرمان‌های زیر از پرچم --instance پشتیبانی می‌کنند:

  • firebase database:get
  • firebase database:profile
  • firebase database:push
  • firebase database:remove
  • firebase database:set
  • firebase database:update

ویرایش و استقرار Realtime Database Security Rules برای هر نمونه

مطمئن شوید که Realtime Database Security Rules شما دسترسی مناسب به هر نمونه پایگاه داده در پروژه‌تان را مجاز می‌کند. هر پایگاه داده مجموعه قوانین خاص خود را دارد، که می‌توانید آن‌ها را از کنسول Firebase ویرایش و مستقر کنید، یا از رابط خط فرمان Firebase برای مستقر کردن هدف‌ها استفاده کنید.

  • برای ویرایش و استقرار قوانین از کنسول Firebase، این مراحل را دنبال کنید:

    1. در کنسول Firebase، به برگه پایگاه‌های داده و فضای ذخیره‌سازی > پایگاه داده هم‌زمان > قوانین بروید.

    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 مستقر کرده‌اید لغو می‌کند.

متصل کردن برنامه به چند نمونه پایگاه داده

از مرجع پایگاه داده برای دسترسی به داده‌های ذخیره‌شده در نمونه‌های پایگاه داده ثانویه استفاده کنید. می‌توانید مرجع نمونه پایگاه داده خاصی را ازطریق نشانی وب یا برنامه دریافت کنید. اگر نشانی وب را مشخص نکنید، مرجع نمونه پایگاه داده پیش‌فرض برنامه را دریافت خواهید کرد.

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 در کانال Slack ما یا در Stack Overflow تماس بگیرید.