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

পারফরম্যান্স এবং খরচ তুলনা: Deno KV vs Upstash Redis

প্রায় ২ সপ্তাহ আগে আমরা Cloudflare KV এবং Upstash Redis-এর পারফরম্যান্স এবং খরচ তুলনা করেছি। এইবার আমরা Deno KV-র দিকে তাকাব, যা Deno-এর গ্লোবাল এজ নেটওয়ার্কে রান হওয়া একটি Deno-নেটিভ key-value স্টোর।

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

আমরা দুটি ভিন্ন বেঞ্চмар্ক চালাব, উভয়ই Deno Deploy ব্যবহার করে কোড রান করবে। উভয় কেসেই KV স্টোর এবং Redis-এ সব উপলব্ধ রিড রিজন সক্রিয় থাকবে।

  1. planetfall.io ব্যবহার করে বিশ্বের ২০টি রিজন থেকে আহ্বান করা।
  2. অনেক বেশি লোডের সাথে একটি সিঙ্গল রিজন থেকে আহ্বান করা।

পরিণামগুলো তুলনা করে ট্রেড-অফ এবং প্রাইসিং নিয়ে আলোচনা করব।

বেঞ্চмар্ক

সেটআপটি Cloudflare-এর মতোই, শুধু Deno KV ব্যবহার করার জন্য আপডেট করা হয়েছে।

  • ১০০০ কি
  • ৪ KB - ৬৪ KB ডেটা সাইজ (র‍্যান্ডম)
  • সব কিতে ৬০ সেকেন্ড TTL
  • ২০টি রিজন থেকে ফাংশন আহ্বান
  • প্রায় ১০ রিকোয়েস্ট পার সেকেন্ড

কाफी ছোট কিস্পেস বেছে নিলাম যাতে RPS খুব বাড়াতে না পারেও কিছু ক্যাশ হিট मिलে।

কোড

ফাংশনটি খুব সিম্পল; এটি শুধু Redis থেকে রিড করে, KV থেকে রিড করে, এবং তারপর লেটেন্সি রিটার্ন করে পরে ইভ্যালুয়েশনের জন্য।

app.get("/test", async (c) => { const key = Math.floor(Math.random() * 1_000).toString() const minValueSize = 4 * 1024 const maxValueSize = 64 * 1024 const data = randomBytes(minValueSize, maxValueSize) const ttlSeconds = 60 const beforeRedis = performance.now() const redisResponse = await fetch(Deno.env.get("UPSTASH_REDIS_REST_URL")!, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${Deno.env.get("UPSTASH_REDIS_REST_TOKEN")}`, }, body: JSON.stringify(["GET", key]) }) const redisLatency = performance.now() - beforeRedis if (!redisResponse) { await fetch(Deno.env.get("UPSTASH_REDIS_REST_URL")!, { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${Deno.env.get("UPSTASH_REDIS_REST_TOKEN")}`, }, body: JSON.stringify(["SET", key, data, "EX", ttlSeconds]) }) } const kv = await Deno.openKv(); const beforeKV = performance.now() const kvResponse = await kv.get([key]) const kvLatency = performance.now() - beforeKV if (!kvResponse.value) { const setRes = await kv.set([key], data, { expireIn: ttlSeconds }) console.log({ setRes }) } return c.json({ redisLatency, kvLatency, }); });

ফলাফল - গ্লোবাল লেটেন্সি

৩০ মিনিট পর ফলাফল। এখানে মাপা লেটেন্সি শুধু Deno Deploy-এ থাকা ফাংশন থেকে স্টোর পর্যন্ত, ফাংশন আহ্বান করার নেটওয়ার্ক রাউন্ডট্রিপ অন্তর্ভুক্ত নয়।

পারফরম্যান্স এবং খরচ তুলনা: Deno KV vs Upstash Redis

ছবিতে ক্লিক করলে ফুল সাইজ দেখাবে

Deno KVUpstash Redis
P90265ms76ms
P99494ms94ms

Deno KV ডেটা রিড করার ক্ষেত্রে উল্লেখযোগ্যভাবে স্লোয়ার। আমার প্রথম ধারণা ছিল সম্ভবত তাদের পাস מספিক রিড রিজন নেই গ্লোবালি ডিস্ট্রিবিউটেড। বেঞ্চमार্কের সময় তাদের ছিল gpc-us-east4, gpc-asia-southeast1, gcp-europe-west3, gcp-southamerica-east1 এবং gcp-us-west2।

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

সিঙ্গল রিজন

এই থিওরি টেস্ট করতে আমি দ্বিতীয় বেঞ্চмар্ক চালালাম, যেখানে শুধু একটি লোকেশন (আমার বাড়ি) থেকে ফাংশন আহ্বান করা হয়েছে এবং সব রিকোয়েস্ট Frankfurt-এ होकर যাচ্ছে। Deno KV এবং Upstash Redis উভয়ের সেখানে রিড রেপ্লিকা আছে (gcp-europe-west3 এবং eu-central-1 যথাক্রমে GCP এবং AWS-এর জন্য)।

পারফরম্যান্স এবং খরচ তুলনা: Deno KV vs Upstash Redis

ছবিতে ক্লিক করলে ফুল সাইজ দেখাবে

এই সিনেরিওতে দুটি সার্ভিসই অনেক ফাস্ট, কিন্তু Deno KV Upstash Redis-ের চেয়ে স্লোয়ার। সিঙ্গল রিজনের লেটেন্সি, গ্লোবাল লেটেন্সির সাথে ডেল্টা সহ:

Deno KVUpstash Redis
P90132ms (-133)16ms (-60)
P99154ms (-340)26ms (-68)

১৫৪ ms নিশ্চয় ৪৯৪ ms-এর চেয়ে ভালো, কিন্তু এটি এই অনুমানের ওপর ভিত্তি করে যে সকল ট্রাফিক একটি সিঙ্গল রিজন থেকে আসছে, যা গ্লোবাল এজ নেটওয়ার্কের আইডিয়ার বিপরীত। আপনি যদি গ্লোবাল API রান করেন, তবে সারা বিশ্ব থেকে ট্রাফিক আসবে এবং KV-এ ডেটা অ্যাক্সেসের প্রয়োজন হওয়া প্রতিটি রিকোয়েস্ট এই স্লোডাউনের শিকার হবে।

প্রাইসিং

Deno এবং Upstash উভয়ই মূলত ইউজেজের জন্য বিল করে। উভয়েরই ভালো ফ্রি টিয়ার আছে, যাতে টেস্ট করার জন্য কোনো পেমেন্ট লাগে না।

Deno KVUpstash Redis
Flat Cost$20/mo (রিড রিজন যোগ করতে)FREE
Storage$0.50 / GB$0.25 / GB
Reads$1 / Million / 4kb$2 / Million (সাইজ নির্বিশেষে)
Writes$2.50 / Million / 1kb$2 / Million (সাইজ নির্বিশেষে)
Bandwidth$0.50 / GB$0.03 / GB

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

নিচের লাইন: আপনি যদি প্রতি রিকোয়েস্টে ৮KB-র বেশি রিড করেন, Upstash সম্ভবত সস্তা।

উপসংহার

Deno KV ব্যবহার করা ফিলে খুব ভালো লাগে কারণ এটি একই প্ল্যাটফর্মে আছে; আলাদা অ্যাকাউন্ট ম্যানেজ করতে হয় না, এবং ব্যবহার করতে কোনো এক্সট্রা সেটআপ লাগে না। কিন্তু পারফরম্যান্স এবং খরচ Upstash-এর কাছেও কही নেই। এছাড়া এটি সীমিত কাজে লাগে। সেট এবং গেট সবচেয়ে কমন অপারেশন হলেও, Redis-এ এর বাইরে অনেক কিছু করা যায়। আমাদের উদাহরণগুলো চেক আউট করুন Redis-এর অনেক আইডিয়া এবং ইউজ কেস পাওয়ার জন্য।

আমাদের Discord-এ বা X-এ হাই বলুন এবং এই सब জিনিস সম্পর্কে প্রশ্ন করুন।

  1. HTML DOM Fieldset form প্রপার্টি

  2. পাইথনে Axes Subplot দেখানো

  3. HTML DOM Link href প্রপার্টি

  4. অ্যান্ড্রয়েড SQLite-এ ডেসেন্ডিং অর্ডারে রেকর্ড দেখানোর পদ্ধতি