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

เปรียบเทียบ Performance และ Cost: Deno KV vs Upstash Redis

ประมาณ 2 สัปดาห์ก่อน เราเปรียบเทียบ performance และ cost ของ Cloudflare KV และ Upstash Redis คราวนี้เราจะดู Deno KV key-value store native ของ Deno ที่รันบน global edge network ของพวกเขา

Deno KV คล้าย Upstash Redis ใน architecture ทั้งคู่มี primary region สำหรับ writes แล้ว replicate ไป regions อื่นๆ Reads served จาก region ใกล้ client มากที่สุด มีความต่างมากใน features เพราะ Redis มี features มากกว่า KV แต่เราจะโฟกัสแค่ simple reads และ writes

Benchmark 2 แบบ บน Deno Deploy ทั้งคู่ KV store และ Redis เปิด read regions ทั้งหมด:

  1. Invoke จาก 20 regions รอบโลกด้วย planetfall.io
  2. Invoke จาก single region ด้วย load สูงกว่ามาก

จากนั้นเปรียบเทียบ results และพูดถึง trade-offs และ pricing

The Benchmark

Setup เหมือน Cloudflare แค่ update ใช้ Deno KV:

  • 1000 keys
  • 4 KB - 64 KB data size (random)
  • 60s TTL ทุก keys
  • 20 regions invoke function
  • ~10 requests per second

Keyspace เล็ก เพื่อให้ได้ cache hits โดยไม่ต้อง crank RPS สูง

Code

Function เรียบง่าย: read จาก Redis, read จาก KV, return latencies

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 })
});

Results - Global Latency

หลัง 30 นาที ผลลัพธ์ (latency วัดจาก function บน Deno Deploy ไป store ไม่รวม network roundtrips invoke function):

เปรียบเทียบ Performance และ Cost: Deno KV vs Upstash Redis

Click image for full size

Deno KVUpstash Redis
P90265ms76ms
P99494ms94ms

Deno KV ช้ากว่ามากตอน read ข้อมูล คิดว่าเขาอาจไม่มี read regions แจกแจงพอ ณ เวลา benchmark มี gpc-us-east4, gpc-asia-southeast1, gcp-europe-west3, gcp-southamerica-east1 และ gcp-us-west2

อาจมี requests มากต้อง cross regions ดึงข้อมูล ทำ latency สูง กำจัดข้อได้เปรียบของ Deno ที่ควบคุม compute และ storage ใน cloud เดียวกัน Upstash รันบน AWS requests จาก Deno ไป Redis ข้าม cloud provider borders

Single Region

ทดสอบ theory: invoke จาก single location (home) ทุก requests ผ่าน Frankfurt ทั้งคู่มี read replica ที่นั่น gcp-europe-west3 และ eu-central-1 ตามลำดับ

เปรียบเทียบ Performance และ Cost: Deno KV vs Upstash Redis

Click image for full size

ทั้งคู่เร็วกว่ามากใน scenario นี้ แต่ Deno KV ยังช้ากว่า Upstash Redis Latencies สำหรับ single region (delta จาก global latency ในวงเล็บ):

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

154 ms ดีกว่า 494 ms แต่ assume traffic มาจาก single region ซึ่งขัดกับ global edge network idea ถ้า run global API traffic มาจากทั่วโลก ทุก request ที่ต้อง access KV จะช้าลง

Pricing

Deno และ Upstash bill ตาม usage ทั้งคู่ free tiers ดี ลองได้ฟรี

Deno KVUpstash Redis
Flat Cost$20/mo (เพิ่ม read regions)FREE
Storage$0.50 / GB$0.25 / GB
Reads$1 / Million / 4kb$2 / Million (regardless of size)
Writes$2.50 / Million / 1kb$2 / Million (regardless of size)
Bandwidth$0.50 / GB$0.03 / GB

ความต่างหลัก: Deno pricing ไม่ transparent ต้องรู้ request size เพื่อคำนวณ cost Upstash ทุก requests bill เท่ากัน Default Upstash อ่าน/เขียนได้ถึง 1MB/request อนุญาตเพิ่มได้ด้วย flat fee

Bottom line: ถ้าอ่านมากกว่า 8kb/request Upstash น่าจะถูกกว่า

สรุป

Deno KV รู้สึกดีเพราะ same platform ไม่ต้อง manage separate account ไม่ต้อง extra setup แต่ performance และ cost ไม่อยู่ระดับ Upstash จำกัดในสิ่งที่ทำได้ (set/get เป็น common operations แต่นี่ไม่ใช่ทั้งหมดของ Redis ดู examples ของเราสำหรับ ideas และ usecases)

มา say hi และถามคำถามใน Discord หรือ X ได้เลย