Firebase Realtime Database में परफ़ॉर्मेंस को ऑप्टिमाइज़ करने और डेटा को स्केल करने का सबसे अच्छा तरीका है कि डेटा को Realtime Database के कई इंस्टेंस में बांटा जाए. इसे डेटाबेस शार्डिंग भी कहा जाता है. शार्डिंग की मदद से, लोड बैलेंसिंग और परफ़ॉर्मेंस ऑप्टिमाइज़ेशन के अलावा, डेटाबेस के अलग-अलग इंस्टेंस पर लागू होने वाली सीमाओं से ज़्यादा डेटा को स्केल किया जा सकता है.
डेटा को शार्ड कब करें
अगर Realtime Database का इस्तेमाल किया जा रहा है और इनमें से कोई भी स्थिति लागू होती है, तो डेटा को कई डेटाबेस में बांटा जा सकता है:
- आपको एक साथ 2,00,000 कनेक्शन,हर सेकंड में 1, 000 राइट ऑपरेशन या किसी एक डेटाबेस इंस्टेंस के लिए तय की गई अन्य सीमाओंसे ज़्यादा डेटा को स्केल करना है.
- आपके पास अलग-अलग डेटा के कई सेट हैं और आपको परफ़ॉर्मेंस ऑप्टिमाइज़ करनी है. उदाहरण के लिए, कोई चैट ऐप्लिकेशन, जो उपयोगकर्ताओं के अलग-अलग और स्वतंत्र ग्रुप को सेवा देता है.
- आपको अपटाइम बेहतर बनाने और किसी एक डेटाबेस इंस्टेंस पर ज़्यादा लोड पड़ने का खतरा कम करने के लिए, कई डेटाबेस में लोड को बैलेंस करना है.
डेटा को शार्ड कैसे करें
डेटा को शार्ड करने के लिए, यह तरीका अपनाएं. इसके बारे में यहां ज़्यादा जानकारी दी गई है:
- अपने ऐप्लिकेशन की ज़रूरतों के हिसाब से, डेटा को कई डेटाबेस में मैप करें.
- डेटाबेस के कई इंस्टेंस बनाएं.
- अपने ऐप्लिकेशन को इस तरह कॉन्फ़िगर करें कि वह हर डेटा सेट के लिए, ज़रूरी Realtime Database इंस्टेंस से कनेक्ट हो.
डेटा को मैप करना
डेटा को कई डेटाबेस में मैप करते समय, इन शर्तों को पूरा करने की कोशिश करें:
- हर क्वेरी, सिर्फ़ एक डेटाबेस इंस्टेंस के ख़िलाफ़ चलती है. Realtime Database डेटाबेस के कई इंस्टेंस पर क्वेरी चलाने की सुविधा नहीं देता.
- डेटाबेस के कई इंस्टेंस में डेटा शेयर या डुप्लीकेट नहीं किया जाता (या कम से कम शेयर या डुप्लीकेट किया जाता है).
- ऐप्लिकेशन का हर इंस्टेंस, किसी भी समय सिर्फ़ एक डेटाबेस से कनेक्ट होता है.
डेटा को मैप करते समय, इन रणनीतियों को लागू करने पर विचार करें:
"मास्टर शार्ड" बनाना
यह जानकारी सेव करें कि आपका डेटा, डेटाबेस के अलग-अलग इंस्टेंस में कैसे सेव किया जाता है. इस तरह, प्रोग्राम के ज़रिए यह देखा जा सकता है कि कनेक्ट होने वाले क्लाइंट के लिए, डेटाबेस का कौनसी इंस्टेंस काम का है. ध्यान रखें कि जब आपको किसी खास डेटाबेस इंस्टेंस की ज़रूरत हो, तो उससे सीधे कनेक्ट करने के मुकाबले, इसमें ज़्यादा समय लग सकता है.
डेटा को कैटगरी या ग्राहक के हिसाब से बकेट करना
डेटा को अलग-अलग डेटाबेस इंस्टेंस में सेव करें. इसे उपयोगकर्ता या डेटा टाइप के हिसाब से ग्रुप में बांटा जा सकता है. उदाहरण के लिए, अगर कोई चैट ऐप्लिकेशन बनाया जाता है, जो कई संगठनों को सेवा देता है, तो हर संगठन के लिए डेटाबेस का एक इंस्टेंस बनाया जा सकता है. साथ ही, चैट का सारा डेटा, डेटाबेस के अलग-अलग इंस्टेंस में सेव किया जा सकता है.
इस मामले में, संगठन A और संगठन B, डेटा शेयर नहीं करते. आपके डेटाबेस में कोई डुप्लीकेट डेटा नहीं होता. साथ ही, सिर्फ़ एक डेटाबेस इंस्टेंस के ख़िलाफ़ क्वेरी की जाती हैं. इसके अलावा, चैट ऐप्लिकेशन का इस्तेमाल करते समय, हर संगठन के उपयोगकर्ता सिर्फ़ अपने संगठन के डेटाबेस से कनेक्ट होते हैं.
इसके बाद, डेटाबेस के कई इंस्टेंस पहले से बनाए जा सकते हैं. साथ ही, किसी टीम को उसके डेटाबेस इंस्टेंस में मैप करने के लिए, संगठन की आईडी का इस्तेमाल किया जा सकता है. उदाहरण के लिए, संगठन A को Realtime Database A में मैप किया जाता है.
आपके ऐप्लिकेशन के लिए डेटा को मैप करने का तरीका, आपके इस्तेमाल के खास मामले पर निर्भर करता है. हालांकि, ऊपर बताई गई शर्तें और रणनीतियां, यह तय करने में आपकी मदद कर सकती हैं कि आपके डेटा के लिए क्या काम करता है.
कई Realtime Database इंस्टेंस बनाना
अगर आपके पास ब्लेज़ कीमत का प्लान है, तो एक ही Firebase प्रोजेक्ट में डेटाबेस के 1,000 इंस्टेंस बनाए जा सकते हैं.
Firebase कंसोल में, डेटाबेस सेक्शन में कॉन्टेक्स्ट मेन्यू" />
- Firebase कंसोल में, डेवलप करें > डेटाबेस सेक्शन में जाकर, डेटा टैब पर जाएं.
- Realtime Database सेक्शन में मौजूद मेन्यू में जाकर, नया डेटाबेस बनाएं को चुनें.
- डेटाबेस रेफ़रंस और सुरक्षा के नियम को अपनी ज़रूरत के हिसाब से बनाएं. इसके बाद, ठीक है पर क्लिक करें.
डेटाबेस के जितने इंस्टेंस बनाने हैं, उनके लिए इस प्रोसेस को दोहराएं. डेटाबेस के हर इंस्टेंस के लिए, Firebase Realtime Database Security Rules के नियम अलग-अलग होते हैं. इसलिए, अपने डेटा के ऐक्सेस को बेहतर बनाया जा सकता है.
Firebase कंसोल में या Realtime Database Management REST API का इस्तेमाल करके, डेटाबेस के इंस्टेंस बनाए और मैनेज किए जा सकते हैं.
सीएलआई का इस्तेमाल करके, खास इंस्टेंस मैनेज करना और उनसे इंटरैक्ट करना
Realtime Database इंस्टेंस को मैनेज किया जा सकता है और उनसे इंटरैक्ट किया जा सकता है. इसके लिए, Firebase CLI का इस्तेमाल करें.
डिफ़ॉल्ट रूप से, सीएलआई के निर्देश, आपके डिफ़ॉल्ट डेटाबेस इंस्टेंस के साथ इंटरैक्ट करते हैं. हालांकि, नॉन-डिफ़ॉल्ट डेटाबेस
इंस्टेंस के साथ इंटरैक्ट किया जा सकता है. इसके लिए,
--instance DATABASE_NAME
उदाहरण के लिए, my-example-shard.firebaseio.com नाम के डेटाबेस इंस्टेंस के लिए, प्रोफ़ाइलर चलाने के लिए यह निर्देश इस्तेमाल करें:
firebase database:profile --instance "my-example-shard"
इन निर्देशों में --instance फ़्लैग इस्तेमाल किया जा सकता है:
firebase database:getfirebase database:profilefirebase database:pushfirebase database:removefirebase database:setfirebase database:update
हर इंस्टेंस के लिए, 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"} ] }डिप्लॉय कमांड चलाएं:
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
// Get the default database instance for an appvar ref: DatabaseReference! ref = Database.database().reference()
Objective-C
// 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();
हर डेटाबेस पर कनेक्शन ऑप्टिमाइज़ करना
अगर हर क्लाइंट को किसी सेशन के दौरान, कई डेटाबेस से कनेक्ट करना है, तो हर डेटाबेस इंस्टेंस से सिर्फ़ तब तक कनेक्ट करके, एक साथ कई कनेक्शन की संख्या कम की जा सकती है, जब तक उसकी ज़रूरत हो.
ज़्यादा सलाह पाना
अगर आपको डेटाबेस के कई इंस्टेंस में डेटा को शार्ड करने के बारे में ज़्यादा मदद चाहिए, तो हमारे Slack चैनल या Stack Overflow पर Firebase के विशेषज्ञों से संपर्क करें.