আমরা এমন একটি অ্যাপ্লিকেশন নিয়ে কাজ করছি যা নতুন ফায়ারবেস ক্লাউড ফাংশন ব্যবহার করে। বর্তমানে যা ঘটছে তা হ'ল একটি লেনদেন সারি নোডে রাখা হয়েছে। এবং তারপরে ফাংশনটি সেই নোডটি সরিয়ে সঠিক নোডে রাখে। অফলাইনে কাজ করার দক্ষতার কারণে এটি প্রয়োগ করা হয়েছে।
আমাদের বর্তমান সমস্যাটি হচ্ছে ফাংশনের গতি। ফাংশনটি নিজেই প্রায় 400 মিমি নেয়, তাই ঠিক আছে। তবে কখনও কখনও ফাংশনগুলি খুব দীর্ঘ সময় নেয় (প্রায় 8 সেকেন্ড), যখন ইতিমধ্যে কাতারে প্রবেশিকা যুক্ত করা হয়েছিল।
আমাদের সন্দেহ হয় যে সার্ভারটি বুট আপ করতে সময় নেয়, কারণ যখন আমরা প্রথমটির পরে আরও একবার ক্রিয়া করি। সময় কম লাগে takes
এই সমস্যা সমাধানের জন্য কোনো উপায় আছে কি? এখানে নীচে আমি আমাদের ফাংশন কোড যুক্ত। আমরা সন্দেহ করি এর সাথে কোনও ভুল নেই, তবে আমরা কেবল এটি ক্ষেত্রে যুক্ত করেছি।
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const database = admin.database();
exports.insertTransaction = functions.database
.ref('/userPlacePromotionTransactionsQueue/{userKey}/{placeKey}/{promotionKey}/{transactionKey}')
.onWrite(event => {
if (event.data.val() == null) return null;
// get keys
const userKey = event.params.userKey;
const placeKey = event.params.placeKey;
const promotionKey = event.params.promotionKey;
const transactionKey = event.params.transactionKey;
// init update object
const data = {};
// get the transaction
const transaction = event.data.val();
// transfer transaction
saveTransaction(data, transaction, userKey, placeKey, promotionKey, transactionKey);
// remove from queue
data[`/userPlacePromotionTransactionsQueue/${userKey}/${placeKey}/${promotionKey}/${transactionKey}`] = null;
// fetch promotion
database.ref(`promotions/${promotionKey}`).once('value', (snapshot) => {
// Check if the promotion exists.
if (!snapshot.exists()) {
return null;
}
const promotion = snapshot.val();
// fetch the current stamp count
database.ref(`userPromotionStampCount/${userKey}/${promotionKey}`).once('value', (snapshot) => {
let currentStampCount = 0;
if (snapshot.exists()) currentStampCount = parseInt(snapshot.val());
data[`userPromotionStampCount/${userKey}/${promotionKey}`] = currentStampCount + transaction.amount;
// determines if there are new full cards
const currentFullcards = Math.floor(currentStampCount > 0 ? currentStampCount / promotion.stamps : 0);
const newStamps = currentStampCount + transaction.amount;
const newFullcards = Math.floor(newStamps / promotion.stamps);
if (newFullcards > currentFullcards) {
for (let i = 0; i < (newFullcards - currentFullcards); i++) {
const cardTransaction = {
action: "pending",
promotion_id: promotionKey,
user_id: userKey,
amount: 0,
type: "stamp",
date: transaction.date,
is_reversed: false
};
saveTransaction(data, cardTransaction, userKey, placeKey, promotionKey);
const completedPromotion = {
promotion_id: promotionKey,
user_id: userKey,
has_used: false,
date: admin.database.ServerValue.TIMESTAMP
};
const promotionPushKey = database
.ref()
.child(`userPlaceCompletedPromotions/${userKey}/${placeKey}`)
.push()
.key;
data[`userPlaceCompletedPromotions/${userKey}/${placeKey}/${promotionPushKey}`] = completedPromotion;
data[`userCompletedPromotions/${userKey}/${promotionPushKey}`] = completedPromotion;
}
}
return database.ref().update(data);
}, (error) => {
// Log to the console if an error happened.
console.log('The read failed: ' + error.code);
return null;
});
}, (error) => {
// Log to the console if an error happened.
console.log('The read failed: ' + error.code);
return null;
});
});
function saveTransaction(data, transaction, userKey, placeKey, promotionKey, transactionKey) {
if (!transactionKey) {
transactionKey = database.ref('transactions').push().key;
}
data[`transactions/${transactionKey}`] = transaction;
data[`placeTransactions/${placeKey}/${transactionKey}`] = transaction;
data[`userPlacePromotionTransactions/${userKey}/${placeKey}/${promotionKey}/${transactionKey}`] = transaction;
}