MongoDB-এর সাথে সামঞ্জস্যপূর্ণ Firestore-এর জন্য Change Streams অ্যাপ্লিকেশনগুলিকে একটি কালেকশন বা সম্পূর্ণ ডেটাবেসে করা রিয়েল-টাইম পরিবর্তনগুলি (ইনসার্ট, আপডেট এবং ডিলিট) অ্যাক্সেস করতে দেয়। একটি চেঞ্জ স্ট্রিম পরিবর্তনের সময় অনুসারে আপডেটগুলিকে সাজায়।
চেঞ্জ স্ট্রিমস MongoDB কম্প্যাটিবল এপিআই এবং প্রচলিত MongoDB ড্রাইভারের মাধ্যমে ব্যবহার করা যায়। ফায়ারস্টোর ও MongoDB-এর সাথে সামঞ্জস্যপূর্ণ চেঞ্জ স্ট্রিমস ইমপ্লিমেন্টেশনটি, রাইট ও রিড প্যারালালিজমের উপর স্বয়ংক্রিয় পার্টিশনিং-এর একটি অনন্য প্রয়োগের মাধ্যমে যেকোনো পরিমাণ রাইট ও রিড থ্রুপুট সামলাতে পারে। এটি আপনাকে উচ্চ-থ্রুপুট ওয়ার্কলোড তৈরি করতে সাহায্য করে। এছাড়াও আপনি 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মতো অ্যাগ্রিগেশন পর্যায়গুলিকে পরপর ব্যবহার করতে পারেন।
পরিবর্তন প্রবাহ কনফিগার করুন
একটি ডাটাবেসের জন্য চেঞ্জ স্ট্রিম তৈরি করতে, মুছে ফেলতে বা বিদ্যমান চেঞ্জ স্ট্রিম দেখতে, গুগল ক্লাউড কনসোল ব্যবহার করুন।
ভূমিকা এবং অনুমতি
চেঞ্জ স্ট্রিম তৈরি, মুছে ফেলা এবং তালিকাভুক্ত করার জন্য, একজন প্রিন্সিপালের যথাক্রমে datastore.schemas.create , datastore.schemas.delete এবং datastore.schemas.list আইডেন্টিটি অ্যান্ড অ্যাক্সেস ম্যানেজমেন্ট (IAM) পারমিশন প্রয়োজন।
উদাহরণস্বরূপ, ডেটাস্টোর ইনডেক্স অ্যাডমিন ( roles/datastore.indexAdmin ) রোলটি এই অনুমতিগুলো প্রদান করে।
একটি পরিবর্তন ধারা তৈরি করুন
একটি সংশ্লিষ্ট চেঞ্জ স্ট্রিম কার্সার খোলার আগে, আপনাকে অবশ্যই একটি চেঞ্জ স্ট্রিম তৈরি করতে হবে। কালেকশন বা ডাটাবেস তৈরির সময় স্বয়ংক্রিয়ভাবে চেঞ্জ স্ট্রিম সক্রিয় করা সমর্থিত নয়।
একটি চেঞ্জ স্ট্রিম তৈরি করতে গুগল ক্লাউড কনসোল ব্যবহার করুন।
গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে MongoDB সামঞ্জস্যপূর্ণ একটি Firestore ডেটাবেস নির্বাচন করুন। Firestore Studio প্যানেলটি খুলে যাবে।
- এক্সপ্লোরার প্যানেলে, Change streams নোডটি খুঁজুন, More actions- এ ক্লিক করুন এবং তারপরে Create change stream নির্বাচন করুন।
- একটি অনন্য পরিবর্তন প্রবাহের নাম, পরিধি এবং সংরক্ষণের সময়কাল লিখুন, এবং তারপর সংরক্ষণ করুন-এ ক্লিক করুন।
পরিবর্তন স্ট্রিমগুলি দেখুন
আপনি গুগল ক্লাউড কনসোলে চেঞ্জ স্ট্রিমস সম্পর্কে বিস্তারিত তথ্য দেখতে পারেন।
গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে MongoDB সামঞ্জস্যপূর্ণ একটি Firestore ডেটাবেস নির্বাচন করুন। Firestore Studio প্যানেলটি খুলে যাবে।
- এক্সপ্লোরার প্যানেলে, চেঞ্জ স্ট্রিমস নোডটি খুঁজুন।
- নোডটি খুলতে বা বন্ধ করতে, টগল নোড-এ ক্লিক করুন।
একটি পরিবর্তন স্ট্রিম মুছুন
চেঞ্জ স্ট্রিম ডিলিট করতে গুগল ক্লাউড কনসোল ব্যবহার করুন।
গুগল ক্লাউড কনসোলে, ডেটাবেস পৃষ্ঠায় যান।
- তালিকা থেকে 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 থেকে চেঞ্জ লগের কোন অংশ থেকে পুনরায় শুরু করতে হবে তা নির্ধারণ করতে, একটি resume টোকেন ব্যবহার করুন।
// 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 মানটি একটি সার্ভার-সাইড ত্রুটির বার্তা দেখায়।
এরর দেখানোর বিকল্প হিসেবে, ছবিগুলো আর উপলব্ধ না থাকলে আপনি whenAvailable ভ্যালুটি ব্যবহার করে একটি null ভ্যালু রিটার্ন করতে পারেন।
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 }} }]);
স্ট্রিম এবং ব্যাকআপ পরিবর্তন করুন
ব্যাকআপ রিস্টোর অপারেশনে চেঞ্জ স্ট্রিম কনফিগারেশন বা চেঞ্জ স্ট্রিম ডেটা কোনোটিই উপলব্ধ থাকে না। আপনি যদি চেঞ্জ স্ট্রিমসহ কোনো ডেটাবেস রিস্টোর করেন, তবে সেই ডেটাবেসে কার্সর খোলার জন্য আপনাকে গন্তব্য ডেটাবেসে সেই চেঞ্জ স্ট্রিমগুলো পুনরায় তৈরি করতে হবে।
বিলিং
- চেঞ্জ স্ট্রিমের জন্য রিড ইউনিট এবং স্টোরেজ খরচ প্রযোজ্য। চেঞ্জ স্ট্রিমের মূল্য তালিকা দেখুন।
- রিড রিকোয়েস্টের সময়ে ১ ঘণ্টার বেশি পুরোনো প্রি এবং পোস্ট ইমেজ অন্তর্ভুক্ত করতে হলে, আপনাকে অবশ্যই PITR এনাবল করতে হবে, যার জন্য PITR খরচ প্রযোজ্য হবে।
আচরণগত পার্থক্য
নিম্নলিখিত বিভাগে MongoDB সামঞ্জস্যপূর্ণ Firestore এবং MongoDB-এর মধ্যে Change Stream-এর পার্থক্যগুলি বর্ণনা করা হয়েছে।
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 আচরণ মঙ্গোডিবি-র সাথে মিলে যায়।
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: [] }