ประมาณ 2 สัปดาห์ที่แล้ว เราได้เปรียบเทียบประสิทธิภาพและราคาของ Cloudflare KV และ Upstash Redis คราวนี้เราจะมาดู Deno KV ซึ่งเป็นที่เก็บค่าคีย์ Deno ดั้งเดิมที่ทำงานในเครือข่าย Edge ระดับโลก
Deno KV มีความคล้ายคลึงในด้านสถาปัตยกรรมกับ Upstash Redis ร้านค้าทั้งสองแห่งมีภูมิภาคหลักที่การเขียนทั้งหมดถูกส่งไปยังแล้วจำลองไปยังภูมิภาคอื่นทั้งหมด การอ่านจะให้บริการจากภูมิภาคที่ใกล้เคียงที่สุดกับไคลเอนต์ คุณลักษณะที่มีให้มีความแตกต่างมากมาย เนื่องจาก Redis มีคุณสมบัติมากมายที่ KV ไม่มี แต่เราจะมุ่งเน้นไปที่การอ่านและเขียนแบบธรรมดาในตอนนี้
เราจะดำเนินการวัดประสิทธิภาพสองแบบที่แตกต่างกัน โดยทั้งสองแบบใช้ Deno Deploy เพื่อรันโค้ด ในทั้งสองกรณี KV store และ Redis จะเปิดใช้งานขอบเขตการอ่านที่มีอยู่ทั้งหมด
- เรียกใช้จาก 20 ภูมิภาคทั่วโลกโดยใช้ planetfall.io
- การเรียกใช้จากภูมิภาคเดียวที่มีภาระงานสูงกว่ามาก
หลังจากนั้น เราจะเปรียบเทียบผลลัพธ์และพูดคุยเกี่ยวกับข้อดีข้อเสียและราคา
เกณฑ์มาตรฐาน
ต่อไปนี้คือลักษณะการตั้งค่า โดยพื้นฐานแล้วจะเหมือนกับบน Cloudflare เพิ่งอัปเดตเพื่อใช้ Deno KV
- 1,000 คีย์
- ขนาดข้อมูล 4 KB - 64 KB (สุ่ม)
- 60s TTL บนทุกปุ่ม
- 20 ภูมิภาคที่เรียกใช้ฟังก์ชัน
- ~10 คำขอต่อวินาที
ฉันเลือกคีย์สเปซที่ค่อนข้างเล็ก เพื่อให้แน่ใจว่าเราได้รับแคชบางส่วนโดยไม่ต้องเพิ่ม RPS มากเกินไป
รหัส
ฟังก์ชั่นนั้นง่ายมาก เพียงอ่านจาก Redis อ่านจาก KV จากนั้นส่งคืนเวลาแฝงเหล่านั้นเพื่อประเมินในภายหลัง
main.tsapp.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 จะช้าลงมากเมื่ออ่านข้อมูลจาก KV ความคิดแรกของฉันคือพวกเขาอาจมีพื้นที่การอ่านไม่เพียงพอที่กระจายไปทั่วโลก ในช่วงเวลาของการวัดประสิทธิภาพนี้ พวกเขามี 08 , 12รหัส> , 20รหัส> , 39รหัส> และ 41รหัส> .
บางทีคำขอจำนวนมากจำเป็นต้องส่งผ่านหลายภูมิภาคเพื่อดึงข้อมูล ซึ่งจะอธิบายเวลาแฝงที่สูง ขจัดข้อดีของ Deno ในการควบคุมทั้งการประมวลผลและพื้นที่จัดเก็บภายในคลาวด์เดียวกันและศูนย์ข้อมูลที่อาจเกิดขึ้นได้อย่างมีประสิทธิภาพ ในทางกลับกัน Upstash ทำงานบน AWS และคำขอทั้งหมดจาก Deno ถึง Redis กำลังข้ามขอบเขตของผู้ให้บริการคลาวด์
ภูมิภาคเดียว
เพื่อทดสอบทฤษฎีนี้ ฉันได้ทำการวัดประสิทธิภาพครั้งที่สอง โดยที่ฉันเพียงเรียกใช้ฟังก์ชันจากที่เดียว (บ้านของฉัน) และคำขอทั้งหมดจะผ่านแฟรงก์เฟิร์ต ทั้ง Deno KV และ Upstash Redis มีการจำลองการอ่านที่นั่น 53 และ 60รหัส> ตามลำดับสำหรับ GCP และ AWS
คลิกที่ภาพเพื่อดูขนาดเต็ม
บริการทั้งสองจะเร็วกว่ามากในสถานการณ์นี้ แต่ Deno KV ยังคงช้ากว่า Upstash Redis นี่คือเวลาแฝงสำหรับภูมิภาคเดียว โดยมีเดลต้ากับเวลาแฝงทั่วโลกอยู่ในวงเล็บ:
<หัว154 ms นั้นดีกว่า 494 ms มากอย่างแน่นอน แต่อยู่ภายใต้สมมติฐานที่ว่าการรับส่งข้อมูลทั้งหมดของฉันมาจากภูมิภาคเดียว ซึ่งขัดแย้งกับแนวคิดทั้งหมดเกี่ยวกับเครือข่าย Edge ระดับโลก หากคุณใช้งาน API ทั่วโลก คุณจะมีการรับส่งข้อมูลที่มาจากทั่วทุกมุมโลก และทุกคำขอที่ต้องการเข้าถึงข้อมูลใน KV จะถูกทำให้ช้าลงด้วยสิ่งนี้
ราคา
ทั้ง Deno และ Upstash เรียกเก็บเงินจากคุณสำหรับการใช้งานเป็นหลัก ทั้งสองมีระดับฟรีที่ดี ดังนั้นคุณสามารถทดลองใช้งานได้โดยไม่ต้องจ่ายอะไรเลย
<หัวข้อแตกต่างที่สำคัญคือการกำหนดราคาของ Deno ไม่โปร่งใสเท่าที่ฉันคาดหวัง เนื่องจากฉันต้องการทราบว่าคำขอของฉันจะมีขนาดใหญ่เพียงใดเพื่อคำนวณต้นทุน นี่ไม่ใช่ปัญหากับ Upstash เนื่องจากคำขอทั้งหมดจะถูกเรียกเก็บเงินเท่ากัน ตามค่าเริ่มต้นบน Upstash คุณสามารถอ่านหรือเขียนได้สูงสุด 1MB ต่อคำขอ และเราอนุญาตให้คุณเพิ่มสิ่งนี้โดยเสียค่าธรรมเนียมคงที่
สิ่งสำคัญที่สุดคือหากคุณอ่านมากกว่า 8kb ต่อคำขอ Upstash ก็น่าจะถูกกว่า
บทสรุป
การใช้ Deno KV รู้สึกค่อนข้างดีเนื่องจากอยู่บนแพลตฟอร์มเดียวกัน คุณไม่จำเป็นต้องจัดการบัญชีแยกต่างหาก และการใช้งานก็ไม่จำเป็นต้องตั้งค่าเพิ่มเติมใดๆ อย่างไรก็ตาม ประสิทธิภาพและราคาไม่ได้ใกล้เคียงกับ Upstash เลย นอกจากนี้ยังมีข้อจำกัดในสิ่งที่คุณสามารถทำได้ด้วย การตั้งค่าและรับค่าแม้จะเป็นการดำเนินการทั่วไป แต่ก็ไม่ใช่ทั้งหมดที่คุณสามารถทำได้ด้วย Redis ดูตัวอย่างของเราเพื่อค้นหาแนวคิดและกรณีการใช้งานมากมายสำหรับ Redis
มาทักทายและถามคำถามเกี่ยวกับเรื่องนี้ใน Discord ของเราหรือทาง X