배포 플랫폼을 선택할 때 플랫폼 간의 실제 성능을 비교하는 것이 매우 어려운 경우가 많습니다. 이는 글로벌 에지 배포로 인해 대기 시간이 매우 짧다고 광고하는 서버리스 플랫폼의 경우 특히 그렇습니다. 하지만 데이터를 가져오는 속도가 여전히 느린 경우 낮은 대기 시간이 무슨 소용이 있을까요? API가 사용자 바로 옆에서 실행되지만 데이터를 가져오기 위해 지구 반대편에 있는 네트워크 왕복을 수행해야 한다면 즐거운 시간을 보낼 수 없을 것입니다.
전통적으로 컴퓨팅과 스토리지는 단일 서버 또는 최소한 동일한 데이터 센터에 함께 배치되지만, 서버리스 및 엣지 기능이 증가하면서 컴퓨팅과 스토리지가 분리되는 현상이 나타났습니다. 이는 확장성과 가용성 측면에서는 훌륭하지만 대기 시간이라는 새로운 문제가 발생합니다. 요즘에는 API를 글로벌 에지 네트워크에 배포하는 것이 쉽지 않지만 데이터는 어떻습니까? 데이터는 여전히 뒤처져 있지만 확실히 따라잡고 있습니다.
이 문서에서는 두 가지 서버리스 데이터 저장소인 Cloudflare KV와 Upstash Redis의 성능을 비교해 보겠습니다. 둘 다 서버리스이고 전 세계적으로 분산되어 있지만 접근 방식이 매우 다릅니다. Cloudflare KV는 풀 기반 키-값 저장소인 반면 Upstash는 활성 복제 기능을 갖춘 Redis 호환 서비스입니다.
풀 기반 :데이터는 일반적으로 중앙 위치에 저장되며 사용자의 요청이 있을 때만 엣지 노드로 이동됩니다. 이것이 Cloudflare KV가 취한 접근 방식입니다.
활성 복제 :데이터는 모든 엣지 로케이션에 저장되며 데이터 저장소 자체에 의해 동기화가 유지됩니다. 데이터 업데이트는 즉시 모든 지역에 복제됩니다. 이것이 Upstash와 Vercel이 취한 접근 방식입니다.
캐싱은 실제로 많은 키와 해당 값을 저장하는 것입니다. 이는 단순한 개념이지만 매우 일반적인 개념이기도 합니다. 또한 두 데이터 저장소의 성능을 비교하는 좋은 방법이기도 합니다. 간단한 캐싱 시나리오를 사용하여 Cloudflare KV와 Upstash Redis의 성능을 비교해 보겠습니다.
벤치마크
우리는 실제로 무엇을 테스트하고 있나요?
Cloudflare KV 및 Upstash Redis에서 단일 값을 읽을 때 cloudflare 작업자가 경험하는 지연 시간을 측정하겠습니다.
- Cloudflare 작업자 1명
- 1000개의 키
- 4KB - 64KB 데이터 크기(임의)
- 모든 키에 대한 60초 TTL
- 작업자를 호출하는 20개 지역
- 초당 최대 10개의 요청
RPS를 너무 높이지 않고도 약간의 캐시 적중을 얻을 수 있도록 다소 작은 키스페이스를 선택했습니다.
근로자 코드
작업자 자체는 매우 간단합니다. Redis에서 읽고 KV에서 읽은 다음 나중에 평가하기 위해 해당 지연 시간을 반환합니다.
작업자.tsapp.get("/test", async (c) => {
const redis = Redis.fromEnv(c.env);
const key = Math.floor(Math.random() * 1_000).toString();
const minValueSize = 4 * 1024;
const maxValueSize = 64 * 1024;
const ttlSeconds = 60;
const randomValue = new TextDecoder().decode(
crypto.getRandomValues(
new Uint8Array(
Math.floor(Math.random() * (maxValueSize - minValueSize)) +
minValueSize,
),
),
);
const beforeRedis = performance.now();
const redisResponse = await redis.get(key);
const redisLatency = performance.now() - beforeRedis;
if (!redisResponse) {
await redis.set(key, randomValue, {
ex: ttlSeconds,
});
}
const beforeKV = performance.now();
const kvResponse = await c.env.ANDREAS_KV_BENCHMARK.get(key);
const kvLatency = performance.now() - beforeKV;
if (!kvResponse) {
await c.env.ANDREAS_KV_BENCHMARK.put(key, randomValue, {
expirationTtl: ttlSeconds,
});
}
return c.json({
kvLatency,
redisLatency,
});
}); 결과 - 전역 지연 시간
약 30분 동안 벤치마크를 실행한 후 이미 두 데이터 저장소 간의 몇 가지 중요한 차이점을 확인할 수 있었습니다.
전체 크기로 보려면 이미지를 클릭하세요
보시다시피 Cloudflare KV는 Upstash Redis보다 지속적으로 느립니다. Cloudflare가 KV를 낮은 지연 시간으로 광고하고 작업자와 동일한 플랫폼에서 실행되기 때문에 저는 이것을 예상하지 못했습니다. 예, 기본적으로 모든 단일 지역에 데이터를 보관하지는 않지만 몇 분 후에는 작업자가 실행 중인 지역에 데이터가 캐시될 것으로 예상됩니다.
시스템이 데이터를 같은 위치에 배치할 만큼 부하가 높지 않은 것 같습니다. 지역을 격리하고 부하를 크게 늘려 차이가 있는지 확인해 보겠습니다.
단일 지역
RPS가 훨씬 더 높은 단일 지역의 결과를 살펴보겠습니다. 이론적으로 cloudflare는 이 지역의 모든 캐시를 워밍업하고 광고된 대로 매우 짧은 지연 시간을 얻을 수 있어야 합니다.
이 테스트는 단일 지역에서 최대 400RPS로 작업자를 호출한다는 점을 제외하면 첫 번째 테스트와 동일합니다.
전체 크기로 보려면 이미지를 클릭하세요
KV의 지연 시간이 대폭 개선되었습니다:
- P90: 742ms -> 115ms
- P99: 1,336ms ->560ms
Cloudflare가 실제로 실행 중인 작업자에 더 가깝게 데이터를 복제하기 전에 실제로는 상당히 높은 로드가 필요합니다. 하지만 여전히 Upstash Redis의 대기 시간보다 훨씬 높습니다. Cloudflare의 P90 대기 시간인 115ms는 그리 나쁘지 않지만 0.5초가 넘는 P99 대기 시간은 확실히 눈에 띕니다. 데이터가 실제로 복제되었는지 확인하기 위해 초당 약 400개의 요청을 수행하고 있다는 점을 기억하세요. 이는 이미 대부분의 중소형 API가 일반적으로 볼 수 있는 것보다 더 많은 로드입니다.
흥미롭게도 다음 이미지에서 주석이 표시된 작업자로부터 Cloudflare가 데이터를 더 가까이 또는 더 멀리 이동한 시기를 확인할 수 있습니다.
전체 크기로 보려면 이미지를 클릭하세요
가격
비용을 고려하지 않고서는 공정한 비교가 될 수 없습니다.
여기에서 가장 중요한 요인은 데이터 저장소에 액세스하는 데 드는 요청당 비용입니다.
Cloudflare는 KV 읽기 100만 개당 0.50달러를 청구하는 반면 Upstash는 Redis 명령 100만 개당 1달러를 청구합니다. 몇 가지 다른 차이점이 있는데, Cloudflare는 스토리지 비용이 더 비싼 반면 Upstash는 대역폭 비용이 더 비쌉니다. 그러나 이것이 이 시나리오의 주요 비용 요인은 아닙니다.
- Cloudflare 가격
- 업스태시 가격
Upstash가 귀하에게 적합합니까?
이 질문은 귀하만이 답변하실 수 있습니다.
분명히 우리는 편견을 갖고 있으며 우리 제품과 그 가치를 진심으로 믿고 있으므로 이 점은 무시하시기 바랍니다.
중소 규모 API를 실행하는 경우 비용이 미미하므로 대기 시간을 고려해야 합니다. API에 트래픽이 많은 경우 Upstash는 Cloudflare KV보다 저렴한 고정 가격을 제공합니다.
필요한 것이 set만큼 간단하다면 , get 또는 list , 항상 작업자 플랫폼을 유지하고 애플리케이션에 긴 대기 시간이 허용된다면 Cloudflare KV가 올바른 선택일 수 있습니다. 모든 것이 한 곳에서 처리되므로 걱정할 필요가 없습니다.
해당 질문에 '아니요'로 대답한 경우 , 그렇다면 Upstash를 사용해 보시기 바랍니다. Redis에는 게시/구독, 정렬된 세트, 해시 등과 같이 Cloudflare KV에는 없는 많은 기능이 있습니다. 그리고 Upstash는 이 모든 기능을 지원합니다. 이미 Redis를 사용하고 있다면 애플리케이션을 Upstash로 지정하기만 하면 제대로 작동합니다. 아무것도 변경할 필요가 없습니다.
결론
Cloudflare KV는 훌륭한 제품이지만 Redis와 같은 완전한 기능을 갖춘 데이터베이스를 대체할 수는 없습니다. 대기 시간이 문제가 되지 않는 간단한 사용 사례에 적합합니다.
Discord나 X를 통해 이에 대해 인사하고 질문해 보세요.