Firebase Realtime Database পারফরম্যান্স অপ্টিমাইজ করতে এবং আপনার ডেটা স্কেল করার সেরা উপায় হলো আপনার ডেটাকে একাধিক Realtime Database ইনস্ট্যান্সে ভাগ করে দেওয়া, যা ডেটাবেস শার্ডিং নামেও পরিচিত। লোড ব্যালান্সিং এবং পারফরম্যান্স অপ্টিমাইজেশনের পাশাপাশি, শার্ডিং আপনাকে স্বতন্ত্র ডেটাবেস ইনস্ট্যান্সের সীমাবদ্ধতা ছাড়িয়ে স্কেল করার সুবিধা দেয়।
কখন আপনার ডেটা শার্ড করবেন
যদি আপনি Realtime Database ব্যবহার করেন এবং নিম্নলিখিত পরিস্থিতিগুলোর কোনোটির আওতায় পড়েন, তাহলে আপনি আপনার ডেটা একাধিক ডেটাবেসে ভাগ করে নিতে চাইতে পারেন:
- আপনি একটি একক ডাটাবেস ইনস্ট্যান্সের জন্য নির্ধারিত ২,০০,০০০ যুগপৎ সংযোগ, প্রতি সেকেন্ডে ১,০০০ রাইট অপারেশন বা অন্য যেকোনো সীমা অতিক্রম করে স্কেল করতে চান।
- আপনার কাছে একাধিক, বিচ্ছিন্ন ডেটা সেট আছে এবং আপনি পারফরম্যান্স অপ্টিমাইজ করতে চান (উদাহরণস্বরূপ, একটি চ্যাট অ্যাপ যা ব্যবহারকারীদের পৃথক, স্বাধীন গোষ্ঠীকে পরিষেবা দেয়)।
- আপনি একাধিক ডেটাবেসের মধ্যে লোডের ভারসাম্য বজায় রাখতে চান, যাতে আপটাইম উন্নত হয় এবং একটিমাত্র ডেটাবেস ইনস্ট্যান্সের ওপর অতিরিক্ত চাপ পড়ার ঝুঁকি কমে।
আপনার ডেটা কীভাবে শার্ড করবেন
আপনার ডেটা শার্ড করতে, এই ধাপগুলো অনুসরণ করুন (যা নিচে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে):
- আপনার অ্যাপের নির্দিষ্ট প্রয়োজন অনুযায়ী আপনার ডেটা একাধিক ডেটাবেসে বিন্যস্ত করুন।
- একাধিক ডাটাবেস ইনস্ট্যান্স তৈরি করুন।
- আপনার অ্যাপটিকে এমনভাবে কনফিগার করুন যাতে এটি প্রতিটি ডেটা সেটের জন্য প্রয়োজনীয় Realtime Database ইনস্ট্যান্সের সাথে সংযোগ স্থাপন করতে পারে।
আপনার ডেটা ম্যাপ করুন
যখন আপনি আপনার ডেটা একাধিক ডেটাবেসে ম্যাপ করছেন, তখন নিম্নলিখিত শর্তগুলো পূরণ করার চেষ্টা করুন:
- প্রতিটি কোয়েরি শুধুমাত্র একটি ডাটাবেস ইনস্ট্যান্সের বিপরীতে চলে। Realtime Database একাধিক ডাটাবেস ইনস্ট্যান্সের মধ্যে কোয়েরি সমর্থন করে না।
- ডাটাবেস ইনস্ট্যান্সগুলোর মধ্যে ডেটার কোনো শেয়ারিং বা ডুপ্লিকেশন নেই (অথবা ন্যূনতম শেয়ারিং বা ডুপ্লিকেশন)।
- প্রতিটি অ্যাপ ইনস্ট্যান্স যেকোনো মুহূর্তে শুধুমাত্র একটি ডেটাবেসের সাথে সংযুক্ত থাকে।
আপনার ডেটা ম্যাপ করার সময়, নিম্নলিখিত কৌশলগুলো প্রয়োগ করার কথা বিবেচনা করুন:
একটি 'মাস্টার শার্ড' তৈরি করুন
আপনার ডেটা বিভিন্ন ডাটাবেস ইনস্ট্যান্সে কীভাবে সংরক্ষিত আছে তার একটি ম্যাপ সংরক্ষণ করুন। এর মাধ্যমে, আপনি প্রোগ্রাম্যাটিকভাবে খুঁজে বের করতে পারবেন যে সংযোগকারী ক্লায়েন্টটি কোন ডাটাবেস ইনস্ট্যান্সের সাথে সম্পর্কিত। মনে রাখবেন যে, প্রয়োজনের সময় সরাসরি নির্দিষ্ট ডাটাবেস ইনস্ট্যান্সে সংযোগ করার চেয়ে এতে অতিরিক্ত ওভারহেড থাকতে পারে।
বিভাগ বা গ্রাহক অনুসারে বাকেট ডেটা
ব্যবহারকারী বা ডেটার ধরন অনুযায়ী ডেটাগুলোকে আলাদা আলাদা ডেটাবেস ইনস্ট্যান্সে ভাগ করে সংরক্ষণ করুন। উদাহরণস্বরূপ, যদি আপনি এমন একটি চ্যাট অ্যাপ্লিকেশন তৈরি করেন যা একাধিক সংস্থাকে পরিষেবা দেয়, তাহলে আপনি প্রতিটি সংস্থার জন্য একটি করে ডেটাবেস ইনস্ট্যান্স তৈরি করতে পারেন এবং সমস্ত চ্যাট ডেটা স্বতন্ত্র ডেটাবেস ইনস্ট্যান্সগুলোতে সংরক্ষণ করতে পারেন।
এক্ষেত্রে, সংস্থা A এবং সংস্থা B ডেটা আদান-প্রদান করে না, আপনার ডেটাবেসগুলোতে কোনো সদৃশ ডেটা থাকে না, এবং আপনি শুধুমাত্র একটিমাত্র ডেটাবেস ইনস্ট্যান্সের বিরুদ্ধে কোয়েরি পরিচালনা করেন। এছাড়াও, প্রতিটি সংস্থার ব্যবহারকারীরা চ্যাট অ্যাপ ব্যবহার করার সময় কেবল তাদের নিজ নিজ সংস্থার ডেটাবেসের সাথেই সংযোগ স্থাপন করে।
এরপর আপনি আগে থেকেই একাধিক ডাটাবেস ইনস্ট্যান্স তৈরি করে রাখতে পারেন এবং প্রতিষ্ঠানের আইডি ব্যবহার করে একটি টিমকে তার ডাটাবেস ইনস্ট্যান্সের সাথে যুক্ত করতে পারেন। উদাহরণস্বরূপ, প্রতিষ্ঠান A, রিয়েলটাইম ডাটাবেস A-এর সাথে যুক্ত হয়।
আপনার অ্যাপের জন্য ডেটা বিন্যাস করার পদ্ধতি আপনার নির্দিষ্ট ব্যবহারের ধরনের ওপর নির্ভর করে, কিন্তু উপরে বর্ণিত শর্তাবলী ও কৌশলগুলো আপনার ডেটার জন্য কোনটি কার্যকর তা নির্ধারণ করতে সাহায্য করতে পারে।
একাধিক Realtime Database ইনস্ট্যান্স তৈরি করুন
আপনি যদি ব্লেজ প্রাইসিং প্ল্যানে থাকেন, তাহলে একই ফায়ারবেস প্রজেক্টে ১,০০০টি পর্যন্ত ডেটাবেস ইনস্ট্যান্স তৈরি করতে পারবেন।
ডেটাবেস বিভাগে কনটেক্সট মেনু সহ ফায়ারবেস কনসোল" />
- Firebase কনসোলে, Develop > Database সেকশনের Data ট্যাবে যান।
- Realtime Database বিভাগের মেনু থেকে নতুন ডেটাবেস তৈরি করুন (Create new database) নির্বাচন করুন।
- আপনার ডাটাবেস রেফারেন্স এবং নিরাপত্তা বিধিগুলো কাস্টমাইজ করুন, তারপর 'Got it' এ ক্লিক করুন।
আপনার প্রয়োজন অনুযায়ী যতগুলো ডাটাবেস ইনস্ট্যান্স তৈরি করতে এই প্রক্রিয়াটি পুনরাবৃত্তি করুন। প্রতিটি ডাটাবেস ইনস্ট্যান্সের নিজস্ব Firebase Realtime Database Security Rules থাকে, তাই আপনি আপনার ডেটাতে অ্যাক্সেস সূক্ষ্মভাবে নিয়ন্ত্রণ করতে পারেন।
আপনি Firebase কনসোলে অথবা রিয়েলটাইম ডেটাবেস ম্যানেজমেন্ট 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 CLI) ব্যবহার করে টার্গেটগুলো সম্পাদনা ও প্রয়োগ করতে পারেন।
Firebase কনসোল থেকে নিয়মগুলি সম্পাদনা এবং প্রয়োগ করতে, এই ধাপগুলি অনুসরণ করুন:
- Develop > Database সেকশনের Rules ট্যাবে যান।
- যে ডাটাবেসটি আপনি সম্পাদনা করতে চান, সেটি নির্বাচন করুন, তারপর নিয়মগুলো পরিবর্তন করুন।
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-এর মাধ্যমে প্রয়োগ করা আপনার সাম্প্রতিক যেকোনো পরিবর্তনও বাতিল হয়ে যায়।
আপনার অ্যাপকে একাধিক ডাটাবেস ইনস্ট্যান্সের সাথে সংযুক্ত করুন
সেকেন্ডারি ডেটাবেস ইনস্ট্যান্সে সংরক্ষিত ডেটা অ্যাক্সেস করতে ডেটাবেস রেফারেন্স ব্যবহার করুন। আপনি 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();
প্রতিটি ডাটাবেসে সংযোগগুলি অপ্টিমাইজ করুন
যদি একটি সেশনের সময় প্রতিটি ক্লায়েন্টকে একাধিক ডেটাবেসে সংযোগ করার প্রয়োজন হয়, তবে আপনি প্রতিটি ডেটাবেস ইনস্ট্যান্সে কেবল প্রয়োজনীয় সময়ের জন্য সংযোগ স্থাপন করে একযোগে সংযোগের সংখ্যা কমাতে পারেন।
আরও পরামর্শ নিন
একাধিক ডেটাবেস ইনস্ট্যান্সে আপনার ডেটা শার্ডিং করার বিষয়ে আরও সাহায্যের প্রয়োজন হলে, আমাদের স্ল্যাক চ্যানেলে বা স্ট্যাক ওভারফ্লো -তে ফায়ারবেস বিশেষজ্ঞদের সাথে যোগাযোগ করুন।