लगभग 2 सप्ताह पहले हमने Cloudflare KV और Upstash Redis के प्रदर्शन और लागत की तुलना की थी। इस बार हम Deno KV को देखेंगे, जो उनके वैश्विक एज नेटवर्क में चलने वाला एक Deno-नेटिव कुंजी-मूल्य स्टोर है।
Deno KV अपनी आर्किटेक्चर में Upstash Redis के समान है। दोनों स्टोर में एक प्राथमिक क्षेत्र होता है जहां सभी राइट्स भेजे जाते हैं और फिर अन्य सभी क्षेत्रों में रेप्लिकेट किए जाते हैं। रीड्स को क्लाइंट के निकटतम क्षेत्र से परोसा जाता है। उपलब्ध सुविधाओं में कई अंतर हैं क्योंकि Redis में कई सुविधाएं हैं जो KV में नहीं हैं, लेकिन हम अभी केवल सरल रीड्स और राइट्स पर ध्यान केंद्रित करेंगे।
हम दो अलग-अलग बेंचमार्क आयोजित करेंगे, दोनों Deno Deploy का उपयोग करके कोड चलाने के लिए। दोनों मामलों में, KV स्टोर और Redis में सभी उपलब्ध रीड क्षेत्र सक्षम होंगे।
- planetfall.io का उपयोग करके दुनिया भर के 20 क्षेत्रों से आह्वान करना।
- बहुत अधिक लोड के साथ एकल क्षेत्र से आह्वान करना।
बाद में, हम परिणामों की तुलना करेंगे और ट्रेड-ऑफ और मूल्य निर्धारण के बारे में बात करेंगे।
बेंचमार्क
यहां सेटअप कैसा दिखता है, यह अनिवार्य रूप से Cloudflare जैसा ही है, बस Deno KV का उपयोग करने के लिए अपडेट किया गया है।
- 1000 कुंजियाँ
- 4 KB - 64 KB डेटा आकार (यादृच्छिक)
- सभी कुंजियों पर 60s TTL
- फ़ंक्शन को आह्वान करने वाले 20 क्षेत्र
- ~10 अनुरोध प्रति सेकंड
मैंने एक छोटा कीस्पेस चुना, यह सुनिश्चित करने के लिए कि हमें RPS को बहुत अधिक बढ़ाए बिना कुछ कैश हिट मिल रहे हैं।
कोड
फ़ंक्शन स्वयं बहुत सरल है; यह केवल Redis से पढ़ता है, KV से पढ़ता है, और फिर उन विलंबताओं को बाद में मूल्यांकन के लिए लौटाता है।
main.ts
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, });
});
परिणाम - वैश्विक विलंबता
30 मिनट के बाद, यहां परिणाम हैं। यहां मापी गई विलंबता केवल Deno Deploy पर फ़ंक्शन से स्टोर तक है, जिसमें फ़ंक्शन को आह्वान करने के लिए नेटवर्क राउंडट्रिप्स शामिल नहीं हैं।
छवि पर क्लिक करें पूर्ण आकार के लिए
| Deno KV | Upstash Redis | |
|---|---|---|
| P90 | 265ms | 76ms |
| P99 | 494ms | 94ms |
डेटा पढ़ते समय Deno KV काफी धीमा है। मेरा पहला विचार था कि उनके पास शायद दुनिया भर में पर्याप्त रीड क्षेत्र वितरित नहीं हैं। इस बेंचमार्क के समय, उनके पास gpc-us-east4, gpc-asia-southeast1, gcp-europe-west3, gcp-southamerica-east1 और gcp-us-west2 थे।
शायद अनुरोधों की एक महत्वपूर्ण संख्या को डेटा लाने के लिए कई क्षेत्रों में जाने की आवश्यकता होती है, जो उच्च विलंबता की व्याख्या करेगा, प्रभावी रूप से Deno के लाभ को समाप्त कर देता है जो एक ही क्लाउड और संभावित रूप से डेटासेंटर के अंदर कंप्यूट और स्टोरेज दोनों को नियंत्रित करता है। दूसरी ओर Upstash AWS पर चल रहा है और Deno से Redis के सभी अनुरोध क्लाउड प्रोवाइडर सीमाओं के पार जा रहे हैं।
एकल क्षेत्र
इस सिद्धांत का परीक्षण करने के लिए, मैंने एक दूसरा बेंचमार्क चलाया, जहां मैं सिर्फ एक स्थान (मेरा घर) से फ़ंक्शन को आह्वान कर रहा हूं और सभी अनुरोध फ्रैंकफर्ट से गुजरते हैं। Deno KV और Upstash Redis दोनों के पास वहां एक रीड रेप्लिका है gcp-europe-west3 और eu-central-1 क्रमशः GCP और AWS के लिए।
छवि पर क्लिक करें पूर्ण आकार के लिए
इस परिदृश्य में दोनों सेवाएं बहुत तेज हैं, लेकिन Deno KV अभी भी Upstash Redis से धीमा है। यहां एकल क्षेत्र के लिए विलंबताएं हैं, वैश्विक विलंबता में डेल्टा के साथ कोष्ठक में:
| Deno KV | Upstash Redis | |
|---|---|---|
| P90 | 132ms (-133) | 16ms (-60) |
| P99 | 154ms (-340) | 26ms (-68) |
154 ms निश्चित रूप से 494 ms से बहुत बेहतर है, लेकिन यह इस धारणा के तहत है कि मेरा सारा ट्रैफिक एक ही क्षेत्र से आ रहा है, जो वैश्विक एज नेटवर्क के पूरे विचार के खिलाफ जाता है। यदि आप एक वैश्विक API चला रहे हैं, तो आपके पास दुनिया भर से ट्रैफिक आएगा और KV में डेटा तक पहुंच की आवश्यकता वाले प्रत्येक अनुरोध को इससे धीमा कर दिया जाएगा।
मूल्य निर्धारण
Deno और Upstash दोनों मुख्य रूप से उपयोग के लिए बिल करते हैं। दोनों के अच्छे मुफ्त टियर हैं, इसलिए आप बिना कुछ भुगतान किए उन्हें आज़मा सकते हैं।
| Deno KV | Upstash Redis | |
|---|---|---|
| फ्लैट लागत | $20/माह (रीड क्षेत्र जोड़ने के लिए) | मुफ्त |
| स्टोरेज | $0.50 / GB | $0.25 / GB |
| रीड्स | $1 / मिलियन / 4kb | $2 / मिलियन (आकार की परवाह किए बिना) |
| राइट्स | $2.50 / मिलियन / 1kb | $2 / मिलियन (आकार की परवाह किए बिना) |
| बैंडविड्थ | $0.50 / GB | $0.03 / GB |
मुख्य अंतर यह है कि Deno का मूल्य निर्धारण उतना पारदर्शी नहीं है जितना मैंने आशा की थी क्योंकि मुझे यह जानने की आवश्यकता है कि मेरे अनुरोध कितने बड़े होने जा रहे हैं ताकि लागत की गणना की जा सके। यह Upstash के साथ कोई समस्या नहीं है, क्योंकि सभी अनुरोधों का बिल समान रूप से किया जाता है। डिफ़ॉल्ट रूप से Upstash पर आप प्रति अनुरोध 1MB तक पढ़ या लिख सकते हैं और हम आपको एक फ्लैट शुल्क के लिए इसे बढ़ाने की अनुमति देते हैं।
निचला रेखा यह है कि यदि आप प्रति अनुरोध 8kb से अधिक पढ़ रहे हैं, तो Upstash सबसे अधिक सस्ता होने की संभावना है।
निष्कर्ष
Deno KV का उपयोग करना बहुत अच्छा लगता है क्योंकि यह उसी प्लेटफॉर्म पर है; आपको एक अलग खाता प्रबंधित करने की आवश्यकता नहीं है, और इसका उपयोग करने के लिए किसी अतिरिक्त सेटअप की आवश्यकता नहीं है। हालांकि, प्रदर्शन और लागत Upstash के आसपास भी नहीं हैं। यह इस बात में भी सीमित है कि आप इसके साथ क्या कर सकते हैं। मान सेट करना और प्राप्त करना, जबकि सबसे आम ऑपरेशन हैं, वे सब नहीं हैं जो आप Redis के साथ कर सकते हैं। Redis के लिए बहुत सारे विचारों और उपयोग के मामलों को खोजने के लिए हमारे उदाहरण देखें।
हमारे Discord या X पर आकर नमस्ते कहें और इसके बारे में कोई भी प्रश्न पूछें।