কম্পিউটার টিউটোরিয়াল

Auto-Pipelining দিয়ে v0.dev লোড টাইম ৫০% কমান

Vercel KV ওয়েব প্রজেক্টের জন্য একটি অমূল্য টুল, যাইহোক এর ব্যাপক ব্যবহার HTTP রিকোয়েস্টের সংখ্যা দ্রুত বাড়াতে পারে, যা সম্ভাব্যভাবে পারফরম্যান্স প্রভাবিত করতে পারে। য่า যাবে Redis পাইপলাইন কমান্ড ব্যাচ করার এবং রিকোয়েস্ট কমানোর একটি উপায় অফার করে, সেগুলো ইমপ্লিমেন্ট করা কঠিন হতে পারে। কী অনি সমাধান আছে যা পাইপলাইনের দক্ষতা এবং বেসিক Redis কমান্ডের সিমপ্লিসিটি কম্বাইন করে? এসে পড়েছে অটো-পাইপলাইনিং – কোডিং জটিলতা ছাড়া পারফরম্যান্স বাড়ানোর একটি স্মূথ উপায় অফার করে।

সমস্যা

কল্পনা করুন আপনি একটি ওয়েবপেজ তৈরি করেছেন যেখানে Redis ব্যাপকভাবে একটি ডেটা সোর্স হিসেবে ব্যবহার হয়েছে। একাধিক কম্পোনেন্ট তাদের নিজস্ব Redis কল করছে, কিছু একাধিক বার রেন্ডার হচ্ছে ভিন্ন কনটেন্টসহ।

এই সেটআপটি প্রতিবার ওয়েবপেজ খোলার সময় Redis-এ উল্লেখযোগ্য সংখ্যক রিকোয়েস্ট জেনারেট করতে পারে। রিকোয়েস্টের এই বিশাল পরিমাণ উল্লেখযোগ্য ওভারহেড সৃষ্টি করে, পারফরম্যান্স প্রভাবিত করে। ডিটেকশন, Cloudflare Workers-এর মতো এনভায়রনমেন্টে, যেখানে কনকারেন্ট HTTP রিকোয়েস্টের সংখ্যা সেভেরলি লিমিটেড, এটি একটি ক্রিটিক্যাল ইস্যু হয়ে যায়।

রেগুলার পাইপলাইন

এই পরিস্থিতিতে একটিventional সমাধান হলো Redis পাইপলাইন ব্যবহার করা। রিকোয়েস্ট একে একে পাঠানোর বদলে, পাইপলাইন আপনাকে একাধিক কমান্ড সংগ্রহ করে একসাথে এক্সিকিউট করতে দেয়। এইভাবে, একটি একক HTTP রিকোয়েস্ট একাধিক Redis কমান্ড বহন করে, HTTP রিকোয়েস্টের সংখ্যা উল্লেখযোগ্যভাবে কমানো এবং পারফরম্যান্স উন্নত করে।

import { kv } from '@vercel/kv'; const pipeline = kv.pipeline(); pipeline.set("foo", "bar"); pipeline.get("foo"); const res = await pipeline.exec(); console.log(res); // ["OK", "bar"]

পাইপলাইনের ডিসঅ্যাডভান্টেজ

যাইহোক, পাইপলাইন ব্যবহার করা প্রোগ্রামারের দৃষ্টিকোণ থেকে উল্লেখযোগ্য ওভারহেড সৃষ্টি করে। পাইপলাইন API স্ট্যান্ডার্ড Redis API থেকে ভিন্ন, যা এটিকে এনেবল বা ডিজেবল করা একটি নন-ট্রিভিয়াল টাস্ক করে দেয়।

অধিকন্তু, আপনি যদি একটি সিঙ্গেল পাইপлайনে ভিন্ন কম্পোনেন্টের জন্য ডেটা রিকোয়েস্ট করতে চান, তবে আপনাকে ফেচিং লজিক আলাদা লিখতে হবে সেখানে থেকে যেখানে ডেটা ব্যবহার হবে। এই বিচ্ছেদ একটি ফ্র্যাগমেন্টেড এবং কম মেইনটেইনেবল কোডবেস তৈরি করতে পারে।

অটো-পাইপলাইনিং

অটো-পাইপলাইনিং এই সমস্যাগুলো স্মূথলি সমাধান করে। অটো-পাইপলাইনিং-র সাথে, আপনি আপনার প্রজেক্টে পাইপলাইন ফাংশনালিটি এনেবল করতে পারেন আপনার এক্সিস্টিং কোড বদলানো ছাড়া। আপনি সাধারণভাবে Redis ব্যবহার করতে থাকতে পারেন, যখন Redis ক্লায়েন্ট অটোমেটিক্যালি কমান্ডগুলো ব্যাচ করবে যখনই সম্ভব, পারফরম্যান্স সহজে উন্নত করবে।

আসুন এক্সপ্লোর করি কীভাবে অটো-পাইপলাইনিং একটি সাধারণ পরিস্থিতি অপ্টিমাইজ করে: একাধিক কী-এর জন্য ভ্যালু ফেচ করা:

const keys = ["key1", "key2", "key3"]; const values = await Promise.all(keys.map(key => kv.get(key)));

পাইপলাইন ছাড়া, এই কোডটি তিনটি HTTP রিকোয়েস্ট পাঠাবে Redis-এ। যাইহোক, অটো-পাইপলাইনিং এনেবল থাকলে, এই রিকোয়েস্টগুলো একটি একক HTTP রিকোয়েস্টে ব্যাচ হয়ে যাবে।

Idiomatic React Server Components-এর জন্য অটো-পাইপলাইন

React Server Components (RSC) তাদের নিজস্ব ডেটা ফেচ করতে পারে। একটি সাধারণ উদাহরণ হলো একটি টুইট কম্পোনেন্ট যা এমন ইমপ্লিমেন্ট করা হতে পারে

async function Tweet({id}) { const tweet = kv.get(`tweets:${id}`) return 
{tweet.text}
}

আপনি যদি এই কম্পোনেন্টকে একটি লুপে কল করেন যেন

{tweetIds.map(id => )}

আপনি উপরের উদাহরণের মতো একই N ব্যাকএন্ড রিকোয়েস্ট ট্রিগার করছেন। একবার আবার, অটো-পাইপলাইনিং এক্টিভেট করলে N কমান্ডকে একটি একক পাইপлайনে ব্যাচ করে ইডিোম্যাটিক রিয়েক্ট কোড রিটেইন করে।

এটি কীভাবে কাজ করে

অটো-পাইপলাইনিং ব্যাকগ্রাউন্ডে একটি 'অ্যাক্টিভ পাইপলাইন' মেইনটেইন করে কাজ করে। কমান্ডগুলো পাইপлайনে নিজেদের যোগ করে এবং deferExecution ইনভোক করে:

private async deferExecution() { await Promise.resolve() return await Promise.resolve() }

deferExecution কল করার পর, কমান্ডটি Node.js মেইন থ্রেডের কন্ট্রোল ছেড়ে দেয়। সিকোয়েন্সে পরবর্তী GET কমান্ডটি থ্রেডের কন্ট্রোল পায় এবং তার এক্সিকিউশন চালু করে, ঠিক প্রথম GET-এর মতো কাজ করে: নিজেকে অ্যাক্টিভ পাইপлайনে অ্যাড করে এবং থ্রেডের কন্ট্রোল ছেড়ে দেয়।

এখানে অটো পাইপলাইন লজিক পসিডো-কোড হিসেবে:

let activePipeline: Pipeline; let pipelinePromises: new WeakMap>>(); let commandIndex: number; const executeCommand = (command) => { activePipeline = activePipeline || createNewPipeline(); activePipeline.addCommand(command); commandIndex++; const pipelinePromise = deferExecution().then(() => { if (!pipelinePromises.has(activePipeline) { const pipelinePromise = pipeline.exec(); pipelinePromises.set(pipeline, pipelinePromise); activePipeline = null; commandIndex = 0 }; return pipelinePromises.get(activePipeline)!; }); const result = await pipelinePromise; return result[commandIndex]; };

নিজেকে অ্যাক্টিভ পাইপлайনে অ্যাড করার পর, তৃতীয় GET-ও deferExecution কল করে। এই পয়েন্টে, যেহেতু কোনো অন্য কমান্ড নেই যèlementে ইয়েল্ড করা যায়, ডিফার্ড করা GET কমান্ডগুলোর একটি কন্ট্রোল ফিরে পাবে এবং পাইপলাইন এক্সিকিউট করবে।

এই পাইপলাইন আমাদের উদাহরণে তিনটি রেজাল্ট রিটার্ন করে, প্রতিটি_initial কমান্ডের সাথে মিলে। প্রতিটি কমান্ড তার আর্গুমেন্টের ইনডেক্স ট্র্যাক করে, নিশ্চিত করে যে সেটি ব্যাচ রেসপন্স থেকে সঠিক রেজাল্ট পায়।

অটো-পাইপলাইনিং লজিকের পিছনে কোডটি এখানে উপলব্ধ।

v0.dev-এ অটো-পাইপলাইনিং

v0.dev-এর পারফরম্যান্সে অটো-পাইপলাইনিং-এর প্রভাব ল্যান্ডিং পেজ থেকে স্পষ্ট। ল্যান্ডিং পেজ سابقًا কোয়েরি এবং জেনারেশন থেকে উদাহরণ শোকে করে। প্রথমে, এটি ডিসপ্লে করার আইটেমের লিস্ট ফেচ করে এবং তারপর প্রতিটি আইটেমের জন্য ইনডিভিজুয়াল ফেচ করে, ফলস্বরূপ অনেক Redis রিকোয়েস্ট।

Auto-Pipelining দিয়ে v0.dev লোড টাইম ৫০% কমান

অটো-পাইপলাইনিং এনেবল করার পর, এই প্রসেসটি একটি সুইচ ফ্লিপ করেই অপ্টিমাইজ হয়েছে। এখন, দ্বিতীয় অংশ, যেটি একাধিক ইনডিভিজুয়াল ফেচ ছিল, একটি একক পাইপলাইন অপারেশনে কনসোলিডেট হয়েছে।

অটো-পাইপলাইনিং ইমপ্লিমেন্টেশনের আগে, এই Redis রিকোয়েস্টগুলো একটি উল্লেখযোগ্য সংখ্যক ইনডিভিজুয়াল HTTP রিকোয়েস্টে লিড করত, পেজ লোড টাইম স্লো করত। যাইহোক, অটো-পাইপলাইনিং এনেবল থাকলে, এই রিকোয়েস্টগুলো ইফিশিয়েন্টলি পাইপলাইনে ব্যাচ হয়, প্রয়োজনীয় HTTP রিকোয়েস্টের সংখ্যা কমানো। ফলস্বরূপ, পেজ লোড টাইম উন্নত হয়েছে, প্রায় ৪৫০ms থেকে প্রায় ২০০ms-এ কমে যাওয়া।

v0 টিমটি প্রাথমিকভাবে অটো-পাইপলাইনিং নিজেদের জন্য একটি হ্যাক হিসেবে শিপ করেছিল। অটো-পাইপলাইনিং এখন Upstash-এর Redis ক্লায়েন্টের v1.31.3-এ, এবং Vercel KV-এর v2.0-এ উপলব্ধ।

  1. jQuery find(): ধাপে ধাপে গাইড

  2. নোটিফিকেশন ইন্টেন্টে নতুন ইন্টেন্ট বানাতে না যেতে Resume করা

  3. জাভাস্ক্রিপ্টে CSS প্রোপার্টির বর্তমান মান কীভাবে পাওয়া যায়

  4. C প্রোগ্রামে ২-ডি ম্যাট্রিক্সের কর্ণার উপাদান ও তাদের যোগফল বের করা