MongoDB-র সাথে মানানসই Firestore-এর জন্য চেঞ্জ স্ট্রিম, অ্যাপ্লিকেশনকে কোনও কালেকশন বা সম্পূর্ণ ডেটাবেসে করা রিয়েল-টাইম পরিবর্তন (যোগ, আপডেট ও মুছে ফেলা) অ্যাক্সেস করতে দেয়। পরিবর্তন স্ট্রিম, পরিবর্তনের সময় অনুযায়ী আপডেট সাজায়।
MongoDB-র সাথে মানানসই API এবং প্রথাগত MongoDB ড্রাইভারের মাধ্যমে চেঞ্জ স্ট্রিম অ্যাক্সেস করা যায়। MongoDB-র সাথে মানানসই Firestore চেঞ্জ স্ট্রিমের ইমপ্লিমেন্টেশন, রাইট ও রিড প্যারালেলিজমে অটোমেটিক পার্টিশনিংয়ের অনন্য ইমপ্লিমেন্টেশনের মাধ্যমে রাইট ও রিডের যেকোনও থ্রুপুট ম্যানেজ করতে পারে। এটি আপনাকে হাই-থ্রুপুট ওয়ার্কলোড তৈরি করতে দেয়। এছাড়াও, আপনি Cloud Firestore এবং অন্যান্য স্টোরেজ সলিউশনের মধ্যে মাইগ্রেশন এবং ডেটা সিঙ্ক করার পরিকাঠামো উন্নত করতে পারেন।
MongoDB ড্রাইভারের সাথে মানানসই হওয়ার পাশাপাশি, আপনি সমান্তরালভাবে চেঞ্জ স্ট্রিম পড়তে Cloud Firestore ব্যবহার করতে পারেন। এটি আপনাকে সমান্তরাল, হাই-থ্রুপুট রিড ওয়ার্কলোড তৈরি করতে দেয়। প্রতিটি স্ট্রিম ফলাফলের একটি ভালভাবে-বিতরণ করা পার্টিশনকে উপস্থাপন করে।
চেঞ্জ স্ট্রিমে নিম্নলিখিত ফিচার কাজ করে:
- ডেটাবেস বা কালেকশন স্কোপ সহ কনফিগারযোগ্য পরিবর্তন স্ট্রিম।
- তৈরি করার সময় নির্দিষ্ট করা চেঞ্জ স্ট্রিমের জন্য রিটেনশন সময়সীমা। ডিফল্ট রিটেনশন হল ৭ দিন এবং ন্যূনতম রিটেনশন হল ১ দিন। রিটেনশন অবশ্যই ১ দিনের গুণিতক হতে হবে, সর্বাধিক ৭ দিন পর্যন্ত। তৈরি করার পরে ডেটা রেখে দেওয়ার সময়সীমা পরিবর্তন করা যাবে না। রিটেনশন পিরিয়ড পরিবর্তন করতে, আপনাকে অবশ্যই পরিবর্তন স্ট্রিম ড্রপ করে আবার তৈরি করতে হবে।
delete,insert,updateএবংdropইভেন্ট পরিবর্তন করে যাdb.collection.watch()এবংdb.watch()ব্যবহার করে পর্যবেক্ষণ করা যায়।updateDescription.updatedFields-এ আপডেট ডিফস আছে।- সব
fullDocumentওfullDocumentBeforeChangeবিকল্প।- আপডেটের জন্য সম্পূর্ণ ডকুমেন্ট খোঁজা হচ্ছে।
- ডকুমেন্ট পরিবর্তন, আপডেট বা মুছে ফেলার আগে তার প্রি-ইমেজ।
- ডকুমেন্ট পরিবর্তন বা আপডেট করার পরে তার ছবি।
- এক ঘণ্টার বেশি পুরনো প্রি ও পোস্ট ইমেজের জন্য পয়েন্ট-ইন-টাইম রিকভারি (PITR) চালু করতে হবে।
resumeAfterএবংstartAfterসহ সব আবার শুরু করার বিকল্প।- পরিবর্তন লক্ষ্য করার জন্য
watch()ব্যবহার করার সময়, আপনি এগ্রিগেশন স্টেজ চেইন করতে পারেন, যেমন$addFields,$match,$project,$replaceRoot,$replaceWith,$setএবং$unset।
চেঞ্জ স্ট্রিম কনফিগার করুন
কোনও ডেটাবেসের জন্য আগে থেকে থাকা চেঞ্জ স্ট্রিম তৈরি, ড্রপ বা দেখতে, Google Cloud Console ব্যবহার করুন।
ভূমিকা ও অনুমতি
পরিবর্তন স্ট্রিম তৈরি, মুছে ফেলা এবং তালিকাভুক্ত করার জন্য, একজন প্রিন্সিপালের যথাক্রমে
datastore.schemas.create, datastore.schemas.delete এবং
datastore.schemas.list আইডেন্টিটি এবং অ্যাক্সেস ম্যানেজমেন্ট (IAM) অনুমতির প্রয়োজন হয়।
যেমন, Datastore Index Admin (roles/datastore.indexAdmin) ভূমিকা
এইসব অনুমতি দেয়।
চেঞ্জ স্ট্রিম তৈরি করুন
সংশ্লিষ্ট চেঞ্জ স্ট্রিম কার্সর খোলার আগে, আপনাকে অবশ্যই একটি চেঞ্জ স্ট্রিম তৈরি করতে হবে। কালেকশন বা ডেটাবেস তৈরি করার সময় অটোমেটিক পরিবর্তন স্ট্রিম চালু করার সুবিধা কাজ করে না।
চেঞ্জ স্ট্রিম তৈরি করতে, Google Cloud কনসোল ব্যবহার করুন।
-
Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে, MongoDB-এর সাথে মানানসই Firestore ডেটাবেস বেছে নিন। Firestore Studio প্যানেল খুলে যাবে।
- এক্সপ্লোরার প্যানেলে, স্ট্রিম পরিবর্তন করুন নোড খুঁজে, আরও অ্যাকশন বিকল্পে ক্লিক করুন এবং তারপরে পরিবর্তন স্ট্রিম তৈরি করুন বিকল্প বেছে নিন।
- একটি অনন্য চেঞ্জ স্ট্রিমের নাম, স্কোপ এবং ধরে রাখার সময়কাল লিখুন এবং তারপরে সেভ করুন বিকল্পে ক্লিক করুন
পরিবর্তন স্ট্রিম দেখুন
আপনি Google Cloud কনসোলে চেঞ্জ স্ট্রিম সম্পর্কে বিবরণ দেখতে পারবেন।
-
Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে, MongoDB-এর সাথে মানানসই Firestore ডেটাবেস বেছে নিন। Firestore Studio প্যানেল খুলে যাবে।
- এক্সপ্লোরার প্যানেলে, স্ট্রিম পরিবর্তন করুন নোড খুঁজুন।
- নোড খুলতে বা বন্ধ করতে, নোড টগল করুন বিকল্পে ক্লিক করুন।
চেঞ্জ স্ট্রিম মুছে ফেলা
পরিবর্তন স্ট্রিম মুছে ফেলতে, Google Cloud কনসোল ব্যবহার করুন।
-
Google Cloud কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে, MongoDB-এর সাথে মানানসই Firestore ডেটাবেস বেছে নিন। Firestore Studio প্যানেল খুলে যাবে।
- এক্সপ্লোরার প্যানেলে, স্ট্রিম পরিবর্তন করুন নোড খুঁজুন।
- নোড খুলতে বা বন্ধ করতে, নোড টগল করুন বিকল্পে ক্লিক করুন।
- এক্সপ্লোরার-এ, আপনি যে চেঞ্জ স্ট্রিম মুছতে চান সেটি খুঁজে নিন।
- আরও অ্যাকশন বিকল্পে ক্লিক করুন এবং তারপর চেঞ্জ স্ট্রিম মুছুন বিকল্প বেছে নিন।
- ডায়ালগে, মুছে দেওয়ার বিষয়টি কনফার্ম করতে, চেঞ্জ স্ট্রিমের নাম লিখুন এবং তারপরে মুছুন বিকল্পে ক্লিক করুন।
চেঞ্জ স্ট্রিম কার্সর খুলুন বা আবার চালু করুন
নিম্নলিখিত উদাহরণগুলি দেখায় যে কীভাবে একটি পরিবর্তন স্ট্রিম কার্সর তৈরি, পুনরায় শুরু এবং কনফিগার করতে হয়।
চেঞ্জ স্ট্রিম কার্সর তৈরি করার আগে, আপনাকে অবশ্যই ডেটাবেস বা সংগ্রহের জন্য চেঞ্জ স্ট্রিম তৈরি করতে হবে।
একটি পরিবর্তন স্ট্রিম কার্সর তৈরি করুন
নতুন পরিবর্তন স্ট্রিম কার্সর তৈরি করতে, MongoDB ড্রাইভারের
watch পদ্ধতি ব্যবহার করুন।
ডেটাবেসে হওয়া সব পরিবর্তন শুনতে, ডেটাবেস-স্কোপড পরিবর্তন স্ট্রিম তৈরি করুন এবং db অবজেক্টে watch মেথড কল করুন।
let cursor = db.watch()
কোনও কালেকশনের জন্য কার্সর তৈরি করতে, আপনাকে প্রথমে
সেই কালেকশনের জন্য একটি চেঞ্জ স্ট্রিম তৈরি করতে হবে। তারপর, সংশ্লিষ্ট কালেকশনে watch মেথড কল করুন।
let cursor = db.my_collection.watch()
আপনি এখন চেঞ্জ স্ট্রিম কার্সর তৈরি করেছেন, তাই স্ট্রিমিং শুরু করতে পারবেন।
যেমন, আপনি কোনও ডকুমেন্ট যোগ করে কার্সরে tryNext কল করলে,
পরিবর্তন স্ট্রিমে পরিবর্তনটি দেখতে পাবেন।
let doc = db.my_collection.insertOne({value: "hello world"}) console.log(cursor.tryNext())
আপনি ডকুমেন্ট আপডেট করলে এবং মুছে দিলে, আপনি সেই পরিবর্তনগুলি পরিবর্তন স্ট্রিমে দেখতে পাবেন:
db.my_collection.updateOne({"_id": doc.insertedId}, {$set: {value: "hello world!"}}) db.my_collection.deleteOne({"_id": doc.insertedId}}) // Prints the update event console.log(cursor.tryNext()) // Prints the delete event console.log(cursor.tryNext())
পরিবর্তন স্ট্রিম আবার শুরু করুন
পরিবর্তন স্ট্রিম আবার শুরু করতে, resumeAfter বা startAfter
বিকল্প ব্যবহার করুন।
resumeAfter এবং startAfter থেকে আবার শুরু করার জন্য পরিবর্তন লগের কোথায় শুরু করতে হবে তা নির্ধারণ করতে, একটি রিজুম টোকেন ব্যবহার করুন।
// Create a cursor and add one event to the change stream. let cursor = db.my_collection.watch(); db.my_collection.insertOne({value: "hello world"}); let event = cursor.tryNext(); // Get the resume token from the event. let resumeToken = event._id; // Add a new event to the change stream. db.my_collection.insertOne({value: "foobar"}); // Create a new cursor by using the resume token as a starting point. let newCursor = db.my_collection.watch({resumeAfter: resumeToken}) // Log the change event containing the "foobar" value. console.log(newCursor.tryNext())
startAfter ব্যবহার করতে:
// Start after the resume token. let startAfterCursor = db.my_collection.watch({startAfter: resumeToken})
আপডেট ও মুছে ফেলার মধ্যে আগের ও পরের ছবি অন্তর্ভুক্ত করুন
প্রয়োজন হলে, আপনি আপডেট ও মুছে ফেলার পরিবর্তন সংক্রান্ত ইভেন্টে ডকুমেন্টের আগের ও পরের ছবি অন্তর্ভুক্ত করতে পারবেন। ছবির উপলভ্যতা পয়েন্ট-ইন-টাইম রিকভারি (PITR) উইন্ডো-এর উপর নির্ভর করে এবং এক ঘণ্টার বেশি পুরনো ডকুমেন্টের ছবি পড়তে, আপনাকে অবশ্যই PITR চালু করতে হবে।
পরিবর্তন স্ট্রিমগুলি PITR উইন্ডোর সুবিধা গ্রহণ করে যাতে প্রদত্ত পরিবর্তন ইভেন্টের আগে এবং পরে ডকুমেন্টের একটি ভিউ প্রদান করা যায়। ডিফল্ট হিসেবে, আপডেট
ইভেন্টে একটি updateDescription ফিল্ড থাকে যা আপডেট অপারেশনের মাধ্যমে
পরিবর্তিত ফিল্ডের ডেল্টা।
পরিবর্তন ইভেন্টে আগের ও পরের ছবি অন্তর্ভুক্ত করতে,
আপনাকে অবশ্যই
পরিবর্তন স্ট্রিম কোয়েরিতে fullDocumentBeforeChange এবং fullDocument বিকল্প
নির্দিষ্ট করতে হবে।
let cursor = db.my_collection.watch({ "fullDocument": "required", "fullDocumentBeforeChange": "required" })
কোয়েরি যদি PITR রিটেনশন উইন্ডোর বাইরে কোনও ডকুমেন্ট পড়ার চেষ্টা করে
অথবা PITR চালু না থাকলে, required ভ্যালু
সার্ভার-সাইড সমস্যার মেসেজ দেখায়।
কোনও সমস্যা দেখানোর বিকল্প হিসেবে, ছবি আর উপলভ্য না থাকলে, null ভ্যালু ফিরিয়ে আনতে
আপনি whenAvailable ভ্যালু ব্যবহার করতে পারেন।
let cursor = db.my_collection.watch({ "fullDocument": "whenAvailable", "fullDocumentBeforeChange": "whenAvailable" })
আপডেটে বর্তমান ছবিটি অন্তর্ভুক্ত করুন
ডিফল্ট হিসেবে, আপডেট ইভেন্টে একটি updateDescription ফিল্ড থাকে যা হল
আপডেট অপারেশনের মাধ্যমে পরিবর্তিত ফিল্ডের ডেল্টা। পরিবর্তে সম্পূর্ণ ডকুমেন্টের
সবচেয়ে সাম্প্রতিক ভার্সন খুঁজতে, fullDocument বিকল্পে
updateLookup ভ্যালু ব্যবহার করুন।
এই ফিচারের জন্য PITR-এর প্রয়োজন হয় না এবং এটি ডকুমেন্টের জন্য লুকআপ পারফর্ম করে।
let cursor = db.my_collection.watch({ "fullDocument": "updateLookup", })
প্যারালাল রিড
থ্রুপুট বাড়াতে, আপনি firestoreWorkerConfig বিকল্প ব্যবহার করে
একাধিক ওয়ার্কারের মধ্যে চেঞ্জ স্ট্রিম কোয়েরি স্প্লিট করতে পারবেন। প্রতিটি কর্মী
ডকুমেন্টের একটি স্বতন্ত্র সেটের জন্য পরিবর্তনগুলি পরিবেশন করার জন্য দায়ী। আপনাকে অবশ্যই
runCommand বা aggregate কোয়েরির মাধ্যমে একটি প্যারালাল কার্সর তৈরি করতে হবে।
যেমন, আপনি ৩ জন কর্মীর মধ্যে এইভাবে চেঞ্জ স্ট্রিম ডিস্ট্রিবিউট করতে পারেন:
let cursor1 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 0 }} }]); let cursor2 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 1 }} }]); let cursor3 = db.my_collection.aggregate([{ "$changeStream": { "firestoreWorkerConfig": {numWorkers: 3, workerId: 2 }} }]);
স্ট্রিম ও ব্যাক-আপ পরিবর্তন করুন
ব্যাক-আপ রিস্টোর অপারেশনে চেঞ্জ স্ট্রিম কনফিগারেশন বা চেঞ্জ স্ট্রিম ডেটা, কোনওটিই উপলভ্য নয়। আপনি যদি চেঞ্জ স্ট্রিম সহ কোনও ডেটাবেস রিস্টোর করেন, তাহলে সেই ডেটাবেসে কার্সর খুলতে আপনাকে অবশ্যই ডেস্টিনেশন ডেটাবেসে সেইসব চেঞ্জ স্ট্রিম আবার তৈরি করতে হবে।
বিলিং
- Change Streams-এর জন্য রিড ইউনিট ও স্টোরেজ খরচ হয়। চেঞ্জ স্ট্রিম সংক্রান্ত দাম দেখুন।
- রিড অনুরোধের সময়ের ১ ঘণ্টার বেশি পুরনো আগের ও পরের ছবি অন্তর্ভুক্ত করতে, আপনাকে অবশ্যই PITR চালু করতে হবে যার জন্য PITR খরচ বহন করতে হবে।
আচরণগত পার্থক্য
MongoDB-র সাথে মানানসই Firestore এবং MongoDB-র মধ্যে চেঞ্জ স্ট্রিমের পার্থক্য নিচের বিভাগে বর্ণনা করা হয়েছে।
updateDescription
updateDescription হল update ইভেন্টের একটি ডকুমেন্ট যা আপডেট অপারেশনের মাধ্যমে
আপডেট বা সরিয়ে দেওয়া ফিল্ডের বিবরণ দেয়। Cloud Firestore-এ
উল্লেখযোগ্য পার্থক্যগুলি হল:
updateDescription-এ,truncatedArraysএবংdisambiguatedPathsফিল্ড অটো-ফিল করা হয়নি।updateDescription.updatedFieldsহল মিউটেশন প্রয়োগ করার আগে ও পরে কোনও ডকুমেন্টের প্রি ও পোস্ট ইমেজের মধ্যে ক্যানোনিকাল পার্থক্য।
কোনও ডকুমেন্টের প্রাথমিক স্ট্যাটাস হিসেবে নিম্নলিখিত বিষয়গুলি বিবেচনা করুন:
db.my_collection.insertOne({ _id: 1, root: { array: [{a: 1}, {b: 2}, {c: 3}] } })
পরিস্থিতি ১: অ্যারের শুধু প্রথম এলিমেন্ট মিউটেট করুন।
এই পরিস্থিতিতে, Cloud Firestore-এর আচরণ MongoDB-এর সাথে মিলে যায়।
db.my_collection.updateOne( {_id: 1}, {'$set': {"root.array.0.a": 100}} ) { updatedFields: {"root.array.0.a": 100}, removedFields: [] }
পরিস্থিতি ২: সম্পূর্ণ অ্যারে দিয়ে ওভাররাইট করা
এই পরিস্থিতিতে, অপারেশনটি শুধুমাত্র প্রথম অ্যারে ফিল্ড আপডেট করে কিন্তু পুরো অ্যারে ওভাররাইট করে।
Cloud Firestore আপডেট ডিফারেন্স এই দুটি পরিস্থিতির মধ্যে পার্থক্য করে না এবং
উভয়ের জন্য একই updateDescription.updatedFields রিটার্ন করে:
db.my_collection.updateOne( {_id: 1}, {'$set': {"root.array": [{a: 100}, {b: 2}, {c: 3}]}} ) // In other implementations, updatedFields reflects the mutation itself { updatedFields: { "root.array": [{a: 100}, {b: 2}, {c: 3}] }, removedFields: [] } // Firestore updatedFields is the diff between the before and after versions of the document { updatedFields: {"root.array.0.a": 100}, removedFields: [] }