Computer >> 컴퓨터 >  >> 프로그래밍 >> Redis

성능 및 비용 비교:Deno KV와 Upstash Redis

약 2주 전에 Cloudflare KV와 Upstash Redis의 성능과 비용을 비교했습니다. 이번에는 글로벌 에지 네트워크에서 실행되는 Deno-native 키 값 저장소인 Deno KV를 살펴보겠습니다.

Deno KV는 Upstash Redis와 아키텍처가 유사합니다. 두 저장소 모두 모든 쓰기가 전송된 다음 다른 모든 지역으로 복제되는 기본 지역이 있습니다. 읽기는 클라이언트에 가장 가까운 지역에서 제공됩니다. Redis에는 KV에 없는 기능이 많기 때문에 사용 가능한 기능에는 많은 차이가 있지만 지금은 간단한 읽기 및 쓰기에만 집중하겠습니다.

우리는 Deno Deploy를 사용하여 코드를 실행하는 두 가지 벤치마크를 수행할 것입니다. 두 경우 모두 KV 스토어와 Redis에서는 사용 가능한 모든 읽기 영역이 활성화됩니다.

  1. planetfall.io를 사용하여 전 세계 20개 지역에서 호출합니다.
  2. 부하가 훨씬 더 높은 단일 지역에서 호출합니다.

그 후에 결과를 비교하고 장단점과 가격에 대해 논의하겠습니다.

벤치마크

설정은 다음과 같습니다. 기본적으로 Cloudflare와 동일하며 Deno KV를 사용하도록 업데이트되었습니다.

  • 1000개의 키
  • 4KB - 64KB 데이터 크기(임의)
  • 모든 키에 대한 60초 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

전체 크기로 보려면 이미지를 클릭하세요

<머리><일> 데노 KV 업스태시 레디스 P90265ms76msP99494ms94ms

Deno KV는 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보다 느립니다. 다음은 단일 지역의 지연 시간입니다. 괄호 안에 델타와 글로벌 지연 시간이 있습니다.

<머리><일> 데노 KV 업스태시 레디스 P90132ms (-133)16ms (-60)P99154ms (-340)26ms (-68)

154ms는 확실히 494ms보다 훨씬 낫지만 모든 트래픽이 단일 지역에서 발생한다는 가정 하에 이루어지며 이는 글로벌 에지 네트워크의 전체적인 개념에 어긋납니다. 글로벌 API를 실행하는 경우 전 세계에서 트래픽이 발생하게 되며 KV의 데이터에 액세스해야 하는 모든 단일 요청이 이로 인해 느려질 것입니다.

가격

Deno와 Upstash는 모두 주로 사용량에 대해 요금을 청구합니다. 둘 다 좋은 무료 등급을 갖추고 있으므로 비용을 지불하지 않고도 사용해 볼 수 있습니다.

<머리><일> 데노 KV 업스태시 레디스 고정 비용$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를 통해 이에 대해 인사하고 질문해 보세요.