ফায়ার স্টোরে আমার প্রচুর নথি লিখতে হবে।
নোড.জেএস-এ এটি করার দ্রুততম কোনটি?
ফায়ার স্টোরে আমার প্রচুর নথি লিখতে হবে।
নোড.জেএস-এ এটি করার দ্রুততম কোনটি?
উত্তর:
টিএল; ডিআর: ফায়ারস্টোরে বাল্ক ডেট তৈরির দ্রুততম উপায় সমান্তরাল স্বতন্ত্র রাইটিং ক্রিয়াকলাপ সম্পাদন করে।
ফায়ার স্টোরে এক হাজার ডকুমেন্ট লিখতে লাগে:
~105.4s
অনুক্রমিক পৃথক লেখার ক্রিয়া ব্যবহার করার সময়~ 2.8s
(2) ব্যাচড রাইট অপারেশন ব্যবহার করার সময়~ 1.5s
সমান্তরাল স্বতন্ত্র রচনা ক্রিয়াকলাপগুলি ব্যবহার করার সময়ফায়ার স্টোরে প্রচুর সংখ্যক রচনা ক্রিয়াকলাপ সম্পাদনের তিনটি সাধারণ উপায়।
আমরা নীচে প্রতিটি এলোমেলোভাবে নথিভুক্ত ডেটা অ্যারে ব্যবহার করে তদন্ত করব।
এটি সম্ভবতম সমাধান:
async function testSequentialIndividualWrites(datas) {
while (datas.length) {
await collection.add(datas.shift());
}
}
আমরা প্রতিটি দস্তাবেজ না লিখে অবধি প্রতিটি নথি লিখি। এবং আমরা পরেরটি শুরু করার আগে প্রতিটি লেখার ক্রিয়াটি সম্পূর্ণ হওয়ার জন্য অপেক্ষা করি wait
এই পদ্ধতির সাথে 1,000 ডকুমেন্ট লিখতে প্রায় 105 সেকেন্ড সময় লাগে, সুতরাং থ্রুপুট প্রতি সেকেন্ডে মোটামুটি 10 ডকুমেন্ট লেখায় ।
এটি সবচেয়ে জটিল সমাধান।
async function testBatchedWrites(datas) {
let batch = admin.firestore().batch();
let count = 0;
while (datas.length) {
batch.set(collection.doc(Math.random().toString(36).substring(2, 15)), datas.shift());
if (++count >= 500 || !datas.length) {
await batch.commit();
batch = admin.firestore().batch();
count = 0;
}
}
}
আপনি দেখতে পাচ্ছেন যে আমরা BatchedWrite
কল করে একটি অবজেক্ট তৈরি করেছি batch()
, এটির সর্বোচ্চ সক্ষমতা 500 ডকুমেন্ট পর্যন্ত পূরণ করুন এবং তারপরে এটি ফায়ার স্টোরে লিখুন। আমরা প্রতিটি নথিকে একটি উত্পন্ন নাম দিই যা তুলনামূলকভাবে অনন্য হওয়ার সম্ভাবনা রয়েছে (এই পরীক্ষার জন্য যথেষ্ট ভাল)।
এই পদ্ধতির সাথে 1,000 ডকুমেন্ট লিখতে প্রায় 2.8 সেকেন্ড সময় লাগে, সুতরাং থ্রুপুট প্রতি সেকেন্ডে প্রায় 357 নথি লিখিত হয় ।
ধারাবাহিক পৃথক লেখার চেয়ে এটি বেশ খানিকটা দ্রুত। প্রকৃতপক্ষে: অনেক বিকাশকারী এই পদ্ধতিটি ব্যবহার করেন কারণ তারা ধরে নেন যে এটি দ্রুততম, তবে উপরের ফলাফলগুলি ইতিমধ্যে দেখিয়েছে এটি সত্য নয়। ব্যাচগুলিতে আকারের সীমাবদ্ধতার কারণে কোডটি এখন পর্যন্ত সবচেয়ে জটিল।
ফায়ার স্টোর ডকুমেন্টেশন প্রচুর ডেটা যুক্ত করার জন্য পারফরম্যান্স সম্পর্কে এটি বলে :
বাল্ক ডেটা এন্ট্রি করার জন্য, সমান্তরাল স্বতন্ত্র লেখার সাথে একটি সার্ভার ক্লায়েন্ট লাইব্রেরি ব্যবহার করুন। ব্যাচড লেখাগুলি সিরিয়াল লেখার চেয়ে ভাল পারফরম্যান্স করে তবে সমান্তরাল লেখার চেয়ে ভাল নয়।
আমরা এই কোড দিয়ে পরীক্ষা করতে পারেন:
async function testParallelIndividualWrites(datas) {
await Promise.all(datas.map((data) => collection.add(data)));
}
এই কোডটি add
অপারেশনগুলিকে যত দ্রুত সম্ভব কিক্স করে এবং তারপরে Promise.all()
সেগুলি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে ব্যবহার করে। এই পদ্ধতির সাথে অপারেশনগুলি সমান্তরালভাবে চলতে পারে।
এই পদ্ধতির সাথে 1,000 ডকুমেন্ট লিখতে প্রায় 1.5 সেকেন্ড সময় লাগে, সুতরাং থ্রুপুটটি প্রতি সেকেন্ডে প্রায় 667 ডকুমেন্ট লেখায় ।
পার্থক্যটি প্রথম দুটি পদ্ধতির মধ্যে প্রায় ততটা দুর্দান্ত নয় তবে এটি এখনও ব্যাচযুক্ত লেখার চেয়ে 1.8 গুণ বেশি দ্রুত।
কয়েকটি নোট:
add()
বেশি একটি অনন্য আইডি (বিশুদ্ধরূপে ক্লায়েন্ট-সাইড), একটি দ্বারা অনুসরণ উৎপন্ন কিছুই না set()
অপারেশন। সুতরাং ফলাফল একই হওয়া উচিত। যদি আপনি এটি লক্ষ্য করেন না তবে সর্বনিম্ন কেস সহ একটি নতুন প্রশ্ন পোস্ট করুন যা আপনি যা চেষ্টা করেছেন তা পুনরুত্পাদন করে।