Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

การเปรียบเทียบประสิทธิภาพและต้นทุน:Deno KV กับ Upstash Redis

ประมาณ 2 สัปดาห์ที่แล้ว เราได้เปรียบเทียบประสิทธิภาพและราคาของ Cloudflare KV และ Upstash Redis คราวนี้เราจะมาดู Deno KV ซึ่งเป็นที่เก็บค่าคีย์ Deno ดั้งเดิมที่ทำงานในเครือข่าย Edge ระดับโลก

Deno KV มีความคล้ายคลึงในด้านสถาปัตยกรรมกับ Upstash Redis ร้านค้าทั้งสองแห่งมีภูมิภาคหลักที่การเขียนทั้งหมดถูกส่งไปยังแล้วจำลองไปยังภูมิภาคอื่นทั้งหมด การอ่านจะให้บริการจากภูมิภาคที่ใกล้เคียงที่สุดกับไคลเอนต์ คุณลักษณะที่มีให้มีความแตกต่างมากมาย เนื่องจาก Redis มีคุณสมบัติมากมายที่ KV ไม่มี แต่เราจะมุ่งเน้นไปที่การอ่านและเขียนแบบธรรมดาในตอนนี้

เราจะดำเนินการวัดประสิทธิภาพสองแบบที่แตกต่างกัน โดยทั้งสองแบบใช้ Deno Deploy เพื่อรันโค้ด ในทั้งสองกรณี KV store และ Redis จะเปิดใช้งานขอบเขตการอ่านที่มีอยู่ทั้งหมด

  1. เรียกใช้จาก 20 ภูมิภาคทั่วโลกโดยใช้ planetfall.io
  2. การเรียกใช้จากภูมิภาคเดียวที่มีภาระงานสูงกว่ามาก

หลังจากนั้น เราจะเปรียบเทียบผลลัพธ์และพูดคุยเกี่ยวกับข้อดีข้อเสียและราคา

เกณฑ์มาตรฐาน

ต่อไปนี้คือลักษณะการตั้งค่า โดยพื้นฐานแล้วจะเหมือนกับบน Cloudflare เพิ่งอัปเดตเพื่อใช้ Deno KV

  • 1,000 คีย์
  • ขนาดข้อมูล 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

คลิกที่ภาพเพื่อดูขนาดเต็ม

<หัว เดโน เควี สุดยอด Redis P90265ms76msP99494ms94ms

Deno KV จะช้าลงมากเมื่ออ่านข้อมูลจาก KV ความคิดแรกของฉันคือพวกเขาอาจมีพื้นที่การอ่านไม่เพียงพอที่กระจายไปทั่วโลก ในช่วงเวลาของการวัดประสิทธิภาพนี้ พวกเขามี 08 , 12 , 20 , 39 และ 41 .

บางทีคำขอจำนวนมากจำเป็นต้องส่งผ่านหลายภูมิภาคเพื่อดึงข้อมูล ซึ่งจะอธิบายเวลาแฝงที่สูง ขจัดข้อดีของ Deno ในการควบคุมทั้งการประมวลผลและพื้นที่จัดเก็บภายในคลาวด์เดียวกันและศูนย์ข้อมูลที่อาจเกิดขึ้นได้อย่างมีประสิทธิภาพ ในทางกลับกัน Upstash ทำงานบน AWS และคำขอทั้งหมดจาก Deno ถึง Redis กำลังข้ามขอบเขตของผู้ให้บริการคลาวด์

ภูมิภาคเดียว

เพื่อทดสอบทฤษฎีนี้ ฉันได้ทำการวัดประสิทธิภาพครั้งที่สอง โดยที่ฉันเพียงเรียกใช้ฟังก์ชันจากที่เดียว (บ้านของฉัน) และคำขอทั้งหมดจะผ่านแฟรงก์เฟิร์ต ทั้ง Deno KV และ Upstash Redis มีการจำลองการอ่านที่นั่น 53 และ 60 ตามลำดับสำหรับ GCP และ AWS

การเปรียบเทียบประสิทธิภาพและต้นทุน:Deno KV กับ Upstash Redis

คลิกที่ภาพเพื่อดูขนาดเต็ม

บริการทั้งสองจะเร็วกว่ามากในสถานการณ์นี้ แต่ Deno KV ยังคงช้ากว่า Upstash Redis นี่คือเวลาแฝงสำหรับภูมิภาคเดียว โดยมีเดลต้ากับเวลาแฝงทั่วโลกอยู่ในวงเล็บ:

<หัว เดโน เควี สุดยอด Redis P90132ms (-133)16ms (-60)P99154ms (-340)26ms (-68)

154 ms นั้นดีกว่า 494 ms มากอย่างแน่นอน แต่อยู่ภายใต้สมมติฐานที่ว่าการรับส่งข้อมูลทั้งหมดของฉันมาจากภูมิภาคเดียว ซึ่งขัดแย้งกับแนวคิดทั้งหมดเกี่ยวกับเครือข่าย Edge ระดับโลก หากคุณใช้งาน API ทั่วโลก คุณจะมีการรับส่งข้อมูลที่มาจากทั่วทุกมุมโลก และทุกคำขอที่ต้องการเข้าถึงข้อมูลใน KV จะถูกทำให้ช้าลงด้วยสิ่งนี้

ราคา

ทั้ง Deno และ 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