بهترین راه برای بهینهسازی عملکرد و مقیاسبندی دادههایتان در Firebase Realtime Database ، تقسیم دادهها بین چندین نمونه Realtime Database است که به عنوان تقسیمبندی پایگاه داده نیز شناخته میشود. تقسیمبندی به شما انعطافپذیری میدهد تا فراتر از محدودیتهایی که برای نمونههای پایگاه داده منفرد اعمال میشود، مقیاسبندی کنید، علاوه بر این، تعادل بار و بهینهسازی عملکرد را نیز فراهم میکند.
چه زمانی باید دادههای خود را خرد کنید (shard)
اگر از Realtime Database استفاده میکنید و در هر یک از سناریوهای زیر قرار دارید، ممکن است بخواهید دادههای خود را در چندین پایگاه داده تقسیم کنید:
- شما میخواهید فراتر از محدودیت ۲۰۰۰۰۰ اتصال همزمان، ۱۰۰۰ عملیات نوشتن در ثانیه یا هر یک از محدودیتهای دیگر برای یک نمونه پایگاه داده واحد، مقیاسپذیری داشته باشید.
- شما چندین مجموعه داده گسسته دارید و میخواهید عملکرد را بهینه کنید (برای مثال، یک برنامه چت که به گروههای جداگانه و مستقلی از کاربران خدمات ارائه میدهد).
- شما میخواهید بار را در چندین پایگاه داده متعادل کنید تا زمان کار را بهبود بخشیده و خطر بارگذاری بیش از حد یک نمونه پایگاه داده واحد را کاهش دهید.
چگونه دادههای خود را خرد کنیم
برای خرد کردن دادههای خود، این مراحل را دنبال کنید (در ادامه با جزئیات بیشتر توضیح داده شده است):
- دادههای خود را بر اساس نیازهای خاص برنامهتان، به چندین پایگاه داده نگاشت کنید.
- چندین نمونه پایگاه داده ایجاد کنید.
- برنامه خود را طوری پیکربندی کنید که به نمونه Realtime Database مورد نیاز برای هر مجموعه داده متصل شود.
دادههای خود را نقشهبرداری کنید
وقتی دادههای خود را به چندین پایگاه داده نگاشت میکنید، سعی کنید شرایط زیر را برآورده کنید:
- هر پرسوجو فقط روی یک نمونه پایگاه داده اجرا میشود. Realtime Database از پرسوجوها در بین نمونههای پایگاه داده پشتیبانی نمیکند.
- عدم اشتراکگذاری یا تکثیر دادهها در نمونههای پایگاه داده (یا حداقل اشتراکگذاری یا تکثیر).
- هر نمونه برنامه در هر لحظه فقط به یک پایگاه داده متصل میشود.
هنگام نقشهبرداری از دادههای خود، بهکارگیری استراتژیهای زیر را در نظر بگیرید:
یک "قطعه اصلی" ایجاد کنید
نقشهای از نحوه ذخیره دادههایتان در نمونههای پایگاه داده ذخیره کنید. به این ترتیب، میتوانید به صورت برنامهنویسیشده بررسی کنید که کدام نمونه پایگاه داده با کلاینت متصل مطابقت دارد. به خاطر داشته باشید که این کار ممکن است سربار بیشتری نسبت به اتصال مستقیم به نمونه پایگاه داده خاصی که نیاز دارید، در زمانی که به آن نیاز دارید، داشته باشد.
دادههای سطل بر اساس دستهبندیها یا بر اساس مشتری
دادهها را در نمونههای پایگاه دادهی مجزا، که بر اساس کاربر یا نوع داده گروهبندی شدهاند، ذخیره کنید. برای مثال، اگر یک برنامهی چت ایجاد میکنید که به چندین سازمان خدمات ارائه میدهد، میتوانید برای هر سازمان یک نمونهی پایگاه داده ایجاد کنید و تمام دادههای چت را در نمونههای پایگاه دادهی منحصر به فرد ذخیره کنید.
در این حالت، سازمان A و سازمان B دادهها را به اشتراک نمیگذارند، هیچ داده تکراری در پایگاههای داده شما وجود ندارد و شما فقط پرسوجوهایی را روی یک نمونه پایگاه داده انجام میدهید. علاوه بر این، کاربران هر سازمان فقط هنگام استفاده از برنامه چت به پایگاه داده سازمان خود متصل میشوند.
سپس میتوانید چندین نمونه پایگاه داده را از قبل ایجاد کنید و از شناسه سازمان برای نگاشت یک تیم به نمونه پایگاه داده آن استفاده کنید. به عنوان مثال، سازمان A به پایگاه داده Realtime A نگاشت میشود.
نحوهی نگاشت دادهها برای برنامهتان به مورد استفادهی خاص شما بستگی دارد، اما شرایط و استراتژیهای ذکر شده در بالا میتوانند به شما در تعریف آنچه برای دادههایتان مفید است، کمک کنند.
چندین نمونه Realtime Database ایجاد کنید
اگر از طرح قیمتگذاری Blaze استفاده میکنید، میتوانید تا ۱۰۰۰ نمونه پایگاه داده را در یک پروژه Firebase ایجاد کنید.
کنسول فایربیس با منوی زمینه در بخش پایگاههای داده" />
- در کنسول Firebase ، در بخش توسعه > پایگاه داده، به تب داده (Data) بروید.
- از منوی بخش Realtime Database ، گزینه Create new database را انتخاب کنید.
- مرجع پایگاه داده و قوانین امنیتی خود را سفارشی کنید، سپس روی «فهمیدم» کلیک کنید.
این فرآیند را برای ایجاد هر تعداد نمونه پایگاه داده که نیاز دارید تکرار کنید. هر نمونه پایگاه داده مجموعه Firebase Realtime Database Security Rules مخصوص به خود را دارد، بنابراین میتوانید دسترسی به دادههای خود را به دقت تنظیم کنید.
شما میتوانید نمونههای پایگاه داده را در کنسول Firebase یا با استفاده از Realtime Database Management REST API ایجاد و مدیریت کنید.
ویرایش و استقرار Realtime Database Security Rules برای هر نمونه
مطمئن شوید که Realtime Database Security Rules شما امکان دسترسی مناسب به هر نمونه پایگاه داده در پروژه شما را فراهم میکند. هر پایگاه داده مجموعه قوانین خاص خود را دارد که میتوانید آنها را از کنسول Firebase ویرایش و مستقر کنید، یا با استفاده از Firebase CLI برای استقرار اهداف .
برای ویرایش و اعمال قوانین از کنسول Firebase ، این مراحل را دنبال کنید:
- به برگه قوانین در بخش توسعه > پایگاه داده بروید.
- پایگاه دادهای را که میخواهید ویرایش کنید انتخاب کنید، سپس قوانین را تغییر دهید.
برای ویرایش و استقرار قوانین از Firebase CLI، این مراحل را دنبال کنید:
- قوانین موجود در فایلهای قوانین را برای نمونههای پایگاه داده خود تغییر دهید (برای مثال،
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"} ] }دستور deploy را اجرا کنید:
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);
سویفت
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
هدف-سی
// 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 CLI یک نمونه مشخص کنید
از گزینه --instance برای مشخص کردن اینکه میخواهید دستور Firebase CLI را روی کدام Firebase Realtime Database اعمال کنید، استفاده کنید. برای مثال، از دستور زیر برای اجرای profiler برای یک نمونه پایگاه داده با نام my-example-shard.firebaseio.com استفاده کنید:
firebase database:profile --instance "my-example-shard"
بهینه سازی اتصالات در هر پایگاه داده
اگر هر کلاینت نیاز داشته باشد در طول یک جلسه به چندین پایگاه داده متصل شود، میتوانید با اتصال به هر نمونه پایگاه داده فقط تا زمانی که لازم است، تعداد اتصالات همزمان به هر نمونه پایگاه داده را کاهش دهید.
مشاوره بیشتر بگیرید
اگر برای تقسیمبندی دادههایتان در چندین نمونه پایگاه داده به کمک بیشتری نیاز دارید، با کارشناسان Firebase در کانال Slack یا Stack Overflow تماس بگیرید.