Cloud Functions সাহায্যে, আপনি ক্লায়েন্ট কোড আপডেট করার প্রয়োজন ছাড়াই ক্লাউড ফায়ারস্টোরে ইভেন্টগুলি পরিচালনা করতে পারবেন। আপনি ডকুমেন্ট স্ন্যাপশট ইন্টারফেসের মাধ্যমে অথবা অ্যাডমিন SDK এর মাধ্যমে ক্লাউড ফায়ারস্টোর পরিবর্তন করতে পারেন।
একটি সাধারণ জীবনচক্রের মধ্যে, একটি ক্লাউড ফায়ারস্টোর ফাংশন নিম্নলিখিত কাজগুলি করে:
- একটি নির্দিষ্ট নথিতে পরিবর্তনের জন্য অপেক্ষা করে।
- যখন কোনও ঘটনা ঘটে তখন ট্রিগার করে এবং তার কাজ সম্পাদন করে।
- নির্দিষ্ট ডকুমেন্টে সংরক্ষিত ডেটার একটি স্ন্যাপশট ধারণকারী একটি ডেটা অবজেক্ট গ্রহণ করে। লেখা বা আপডেট ইভেন্টের জন্য, ডেটা অবজেক্টে দুটি স্ন্যাপশট থাকে যা ট্রিগারিং ইভেন্টের আগে এবং পরে ডেটা অবস্থা উপস্থাপন করে।
ফায়ারস্টোর ইনস্ট্যান্সের অবস্থান এবং ফাংশনের অবস্থানের মধ্যে দূরত্ব উল্লেখযোগ্য নেটওয়ার্ক ল্যাটেন্সি তৈরি করতে পারে। কর্মক্ষমতা অপ্টিমাইজ করার জন্য, প্রযোজ্য ক্ষেত্রে ফাংশনের অবস্থান নির্দিষ্ট করার কথা বিবেচনা করুন।
ক্লাউড ফায়ারস্টোর ফাংশন ট্রিগার করে
Cloud Functions for Firebase একটি functions.firestore
অবজেক্ট রপ্তানি করে যা আপনাকে নির্দিষ্ট Cloud Firestore ইভেন্টের সাথে সংযুক্ত হ্যান্ডলার তৈরি করতে দেয়।
ইভেন্টের ধরণ | ট্রিগার |
---|---|
onCreate | যখন প্রথমবারের মতো কোনও নথি লেখা হয় তখন এটি সক্রিয় হয়। |
onUpdate | যখন কোনও ডকুমেন্ট ইতিমধ্যেই বিদ্যমান থাকে এবং কোনও মান পরিবর্তিত হয় তখন ট্রিগার হয়। |
onDelete | ডেটা সহ একটি নথি মুছে ফেলা হলে ট্রিগার হয়। |
onWrite | onCreate , onUpdate অথবা onDelete ট্রিগার করা হলে ট্রিগার হয়। |
যদি আপনার এখনও Cloud Functions for Firebase জন্য কোনও প্রকল্প সক্রিয় না থাকে, তাহলে আপনার Cloud Functions for Firebase প্রকল্পটি কনফিগার এবং সেট আপ করতে Get Started: Write and Deploy Your First Functions পড়ুন।
ক্লাউড ফায়ারস্টোর-ট্রিগার করা ফাংশন লেখা
একটি ফাংশন ট্রিগার সংজ্ঞায়িত করুন
ক্লাউড ফায়ারস্টোর ট্রিগার সংজ্ঞায়িত করতে, একটি ডকুমেন্ট পাথ এবং একটি ইভেন্টের ধরণ নির্দিষ্ট করুন:
নোড.জেএস
const functions = require('firebase-functions');
exports.myFunction = functions.firestore
.document('my-collection/{docId}')
.onWrite((change, context) => { /* ... */ });
ডকুমেন্ট পাথগুলি একটি নির্দিষ্ট ডকুমেন্ট অথবা একটি ওয়াইল্ডকার্ড প্যাটার্ন উল্লেখ করতে পারে।
একটি একক নথি নির্দিষ্ট করুন
যদি আপনি একটি নির্দিষ্ট ডকুমেন্টে যেকোনো পরিবর্তনের জন্য একটি ইভেন্ট ট্রিগার করতে চান তাহলে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন।
নোড.জেএস
// Listen for any change on document `marie` in collection `users` exports.myFunctionName = functions.firestore .document('users/marie').onWrite((change, context) => { // ... Your code here });
ওয়াইল্ডকার্ড ব্যবহার করে ডকুমেন্টের একটি গ্রুপ নির্দিষ্ট করুন
যদি আপনি কোন নির্দিষ্ট সংগ্রহের যেকোনো ডকুমেন্টের সাথে একটি ট্রিগার সংযুক্ত করতে চান, তাহলে ডকুমেন্ট আইডির পরিবর্তে একটি {wildcard}
ব্যবহার করুন:
নোড.জেএস
// Listen for changes in all documents in the 'users' collection exports.useWildcard = functions.firestore .document('users/{userId}') .onWrite((change, context) => { // If we set `/users/marie` to {name: "Marie"} then // context.params.userId == "marie" // ... and ... // change.after.data() == {name: "Marie"} });
এই উদাহরণে, যখন users
যেকোনো নথির যেকোনো ক্ষেত্র পরিবর্তন করা হয়, তখন এটি userId
নামক একটি ওয়াইল্ডকার্ডের সাথে মেলে।
যদি users
মধ্যে থাকা কোনও নথিতে উপ-সংগ্রহ থাকে এবং সেই উপ-সংগ্রহের নথিগুলির একটির ক্ষেত্র পরিবর্তন করা হয়, তাহলে userId
ওয়াইল্ডকার্ডটি ট্রিগার করা হয় না ।
ডকুমেন্ট পাথ থেকে ওয়াইল্ডকার্ড মিল বের করে context.params
এ সংরক্ষণ করা হয়। আপনি যত খুশি ওয়াইল্ডকার্ড সংজ্ঞায়িত করতে পারেন, যেমন স্পষ্ট সংগ্রহ বা ডকুমেন্ট আইডি প্রতিস্থাপন করতে, উদাহরণস্বরূপ:
নোড.জেএস
// Listen for changes in all documents in the 'users' collection and all subcollections exports.useMultipleWildcards = functions.firestore .document('users/{userId}/{messageCollectionId}/{messageId}') .onWrite((change, context) => { // If we set `/users/marie/incoming_messages/134` to {body: "Hello"} then // context.params.userId == "marie"; // context.params.messageCollectionId == "incoming_messages"; // context.params.messageId == "134"; // ... and ... // change.after.data() == {body: "Hello"} });
ইভেন্ট ট্রিগার
একটি নতুন ডকুমেন্ট তৈরি হলে একটি ফাংশন ট্রিগার করুন
একটি ওয়াইল্ডকার্ড সহ onCreate()
হ্যান্ডলার ব্যবহার করে আপনি যেকোনো সময় একটি সংগ্রহে নতুন ডকুমেন্ট তৈরি করার সময় একটি ফাংশন চালু করতে পারেন। এই উদাহরণ ফাংশনটি প্রতিবার একটি নতুন ব্যবহারকারী প্রোফাইল যোগ করার সময় createUser
কল করে:
নোড.জেএস
exports.createUser = functions.firestore .document('users/{userId}') .onCreate((snap, context) => { // Get an object representing the document // e.g. {'name': 'Marie', 'age': 66} const newValue = snap.data(); // access a particular field as you would any JS property const name = newValue.name; // perform desired operations ... });
একটি ডকুমেন্ট আপডেট হলে একটি ফাংশন ট্রিগার করুন
একটি ডকুমেন্ট আপডেট করার সময় আপনি onUpdate()
ফাংশনটি ওয়াইল্ডকার্ড ব্যবহার করে একটি ফাংশন চালু করতে পারেন। এই উদাহরণ ফাংশনটি updateUser
কল করে যদি কোনও ব্যবহারকারী তাদের প্রোফাইল পরিবর্তন করে:
নোড.জেএস
exports.updateUser = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { // Get an object representing the document // e.g. {'name': 'Marie', 'age': 66} const newValue = change.after.data(); // ...or the previous value before this update const previousValue = change.before.data(); // access a particular field as you would any JS property const name = newValue.name; // perform desired operations ... });
একটি ডকুমেন্ট মুছে ফেলা হলে একটি ফাংশন ট্রিগার করুন
একটি ডকুমেন্ট মুছে ফেলা হলে আপনি একটি ফাংশন ট্রিগার করতে পারেন যখন onDelete()
ফাংশনটি ওয়াইল্ডকার্ড ব্যবহার করে ব্যবহার করা হয়। এই উদাহরণ ফাংশনটি deleteUser
কল করে যখন একজন ব্যবহারকারী তার ব্যবহারকারীর প্রোফাইল মুছে ফেলে:
নোড.জেএস
exports.deleteUser = functions.firestore .document('users/{userID}') .onDelete((snap, context) => { // Get an object representing the document prior to deletion // e.g. {'name': 'Marie', 'age': 66} const deletedValue = snap.data(); // perform desired operations ... });
একটি ডকুমেন্টের সকল পরিবর্তনের জন্য একটি ফাংশন ট্রিগার করুন
যদি আপনি কোন ধরণের ইভেন্ট চালু হচ্ছে তা নিয়ে চিন্তিত না হন, তাহলে আপনি onWrite()
ফাংশন ব্যবহার করে একটি ক্লাউড ফায়ারস্টোর ডকুমেন্টের সমস্ত পরিবর্তন শুনতে পারেন। এই উদাহরণ ফাংশনটি modifyUser
কল করে যদি কোনও ব্যবহারকারী তৈরি, আপডেট বা মুছে ফেলা হয়:
নোড.জেএস
exports.modifyUser = functions.firestore .document('users/{userID}') .onWrite((change, context) => { // Get an object with the current document value. // If the document does not exist, it has been deleted. const document = change.after.exists ? change.after.data() : null; // Get an object with the previous document value (for update or delete) const oldDocument = change.before.data(); // perform desired operations ... });
তথ্য পড়া এবং লেখা
যখন কোনও ফাংশন ট্রিগার করা হয়, তখন এটি ইভেন্ট সম্পর্কিত ডেটার একটি স্ন্যাপশট প্রদান করে। আপনি এই স্ন্যাপশটটি ব্যবহার করে ইভেন্টটি ট্রিগারকারী ডকুমেন্টটি পড়তে বা লিখতে পারেন, অথবা আপনার ডাটাবেসের অন্যান্য অংশ অ্যাক্সেস করতে Firebase Admin SDK ব্যবহার করতে পারেন।
ইভেন্ট ডেটা
তথ্য পঠন
যখন কোনও ফাংশন ট্রিগার করা হয়, তখন আপনি আপডেট করা কোনও ডকুমেন্ট থেকে ডেটা পেতে চাইতে পারেন, অথবা আপডেটের আগে ডেটা পেতে পারেন। আপনি change.before.data()
ব্যবহার করে পূর্ববর্তী ডেটা পেতে পারেন, যাতে আপডেটের আগে ডকুমেন্টের স্ন্যাপশট থাকে। একইভাবে, change.after.data()
আপডেটের পরে ডকুমেন্টের স্ন্যাপশট অবস্থা ধারণ করে।
নোড.জেএস
exports.updateUser2 = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { // Get an object representing the current document const newValue = change.after.data(); // ...or the previous value before this update const previousValue = change.before.data(); });
আপনি অন্য যেকোনো অবজেক্টের মতোই প্রোপার্টি অ্যাক্সেস করতে পারবেন। বিকল্পভাবে, আপনি নির্দিষ্ট ক্ষেত্রগুলি অ্যাক্সেস করতে get
ফাংশন ব্যবহার করতে পারেন:
নোড.জেএস
// Fetch data using standard accessors const age = snap.data().age; const name = snap.data()['name']; // Fetch data using built in accessor const experience = snap.get('experience');
তথ্য লেখা
প্রতিটি ফাংশন ইনভোকেশন আপনার ক্লাউড ফায়ারস্টোর ডাটাবেসের একটি নির্দিষ্ট ডকুমেন্টের সাথে যুক্ত। আপনি আপনার ফাংশনে ফিরে আসা স্ন্যাপশটের ref
প্রপার্টিতে DocumentReference
হিসেবে সেই ডকুমেন্টটি অ্যাক্সেস করতে পারেন।
এই DocumentReference
Cloud Firestore Node.js SDK থেকে এসেছে এবং এতে update()
, set()
, এবং remove()
এর মতো পদ্ধতি রয়েছে যাতে আপনি সহজেই সেই ডকুমেন্টটি পরিবর্তন করতে পারেন যা ফাংশনটি ট্রিগার করেছে।
নোড.জেএস
// Listen for updates to any `user` document. exports.countNameChanges = functions.firestore .document('users/{userId}') .onUpdate((change, context) => { // Retrieve the current and previous value const data = change.after.data(); const previousData = change.before.data(); // We'll only update if the name has changed. // This is crucial to prevent infinite loops. if (data.name == previousData.name) { return null; } // Retrieve the current count of name changes let count = data.name_change_count; if (!count) { count = 0; } // Then return a promise of a set operation to update the count return change.after.ref.set({ name_change_count: count + 1 }, {merge: true}); });
ট্রিগার ইভেন্টের বাইরের ডেটা
Cloud Functions একটি বিশ্বস্ত পরিবেশে কার্যকর হয়, যার অর্থ হল এগুলি আপনার প্রকল্পে একটি পরিষেবা অ্যাকাউন্ট হিসাবে অনুমোদিত। আপনি Firebase Admin SDK ব্যবহার করে পঠন এবং লেখার কাজ সম্পাদন করতে পারেন:
নোড.জেএস
const admin = require('firebase-admin');
admin.initializeApp();
const db = admin.firestore();
exports.writeToFirestore = functions.firestore
.document('some/doc')
.onWrite((change, context) => {
db.doc('some/otherdoc').set({ ... });
});
সীমাবদ্ধতা
ক্লাউড ফাংশনের জন্য Cloud Firestore ট্রিগারের জন্য নিম্নলিখিত সীমাবদ্ধতাগুলি লক্ষ্য করুন:
- Cloud Functions (প্রথম প্রজন্ম) এর জন্য ফায়ারস্টোর নেটিভ মোডে একটি বিদ্যমান "(ডিফল্ট)" ডাটাবেস থাকা আবশ্যক। এটি Cloud Firestore নামক ডাটাবেস বা ডেটাস্টোর মোড সমর্থন করে না। এই ধরনের ক্ষেত্রে ইভেন্ট কনফিগার করতে দয়া করে Cloud Functions (দ্বিতীয় প্রজন্ম) ব্যবহার করুন।
- Cloud Functions এবং Cloud Firestore ট্রিগার সহ ক্রস প্রোজেক্ট সেটআপ একটি সীমাবদ্ধতা। Cloud Firestore ট্রিগার সেটআপ করার জন্য Cloud Functions একই প্রোজেক্টে থাকতে হবে।
- অর্ডার দেওয়ার নিশ্চয়তা নেই। দ্রুত পরিবর্তনগুলি অপ্রত্যাশিত ক্রমে ফাংশন ইনভোকেশন ট্রিগার করতে পারে।
- ইভেন্টগুলি কমপক্ষে একবার ডেলিভারি করা হয়, কিন্তু একটি ইভেন্টের ফলে একাধিক ফাংশন ইনভোকেশন হতে পারে। ঠিক একবারের মেকানিক্সের উপর নির্ভর করা এড়িয়ে চলুন এবং idempotent functions লিখুন।
- ডেটাস্টোর মোডে Cloud Firestore Cloud Functions (দ্বিতীয় জেনারেশন) প্রয়োজন। Cloud Functions (প্রথম জেনারেশন) ডেটাস্টোর মোড সমর্থন করে না।
- একটি ট্রিগার একটি একক ডাটাবেসের সাথে যুক্ত। আপনি এমন একটি ট্রিগার তৈরি করতে পারবেন না যা একাধিক ডাটাবেসের সাথে মেলে।
- একটি ডাটাবেস মুছে ফেলার ফলে সেই ডাটাবেসের কোনও ট্রিগার স্বয়ংক্রিয়ভাবে মুছে যায় না। ট্রিগারটি ইভেন্ট সরবরাহ করা বন্ধ করে দেয় কিন্তু আপনি ট্রিগারটি মুছে না ফেলা পর্যন্ত বিদ্যমান থাকে।
- যদি কোনও মিলে যাওয়া ইভেন্ট সর্বাধিক অনুরোধের আকার অতিক্রম করে, তাহলে ইভেন্টটি Cloud Functions (প্রথম প্রজন্ম) ডেলিভার করা নাও হতে পারে।
- অনুরোধের আকারের কারণে যেসব ইভেন্ট ডেলিভারি করা হয়নি সেগুলি প্ল্যাটফর্ম লগে লগ করা হয় এবং প্রকল্পের লগ ব্যবহারের জন্য গণনা করা হয়।
- লগস এক্সপ্লোরারে আপনি এই লগগুলি খুঁজে পেতে পারেন যেখানে "Event cannot delivered to Cloud function due to size exceding the limit for 1st gen..." লেখা থাকবে
error
আপনিfunctionName
ক্ষেত্রের নিচে ফাংশনের নাম খুঁজে পেতে পারেন। যদিreceiveTimestamp
ক্ষেত্রটি এখনও এক ঘন্টার মধ্যে থাকে, তাহলে টাইমস্ট্যাম্পের আগে এবং পরে একটি স্ন্যাপশট সহ প্রশ্নবিদ্ধ ডকুমেন্টটি পড়ে আপনি প্রকৃত ইভেন্টের বিষয়বস্তু অনুমান করতে পারেন। - এই ধরণের ক্যাডেন্স এড়াতে, আপনি যা করতে পারেন:
- Cloud Functions মাইগ্রেট এবং আপগ্রেড করুন (দ্বিতীয় প্রজন্ম)
- ডকুমেন্টের আকার ছোট করুন
- প্রশ্নবিদ্ধ Cloud Functions মুছুন
- আপনি এক্সক্লুশন ব্যবহার করে লগিং নিজেই বন্ধ করতে পারেন কিন্তু মনে রাখবেন যে আপত্তিকর ঘটনাগুলি এখনও সরবরাহ করা হবে না।