Khi chọn một nền tảng triển khai, thường rất khó để so sánh hiệu suất thực tế giữa chúng. Điều này đặc biệt đúng đối với các nền tảng không có máy chủ, những nền tảng quảng cáo độ trễ siêu thấp nhờ triển khai biên toàn cầu. Nhưng độ trễ thấp có ích gì nếu việc tìm nạp dữ liệu của bạn vẫn chậm? Nếu api của bạn chạy ngay bên cạnh người dùng nhưng cần thực hiện một mạng khứ hồi nửa vòng trái đất để tìm nạp dữ liệu thì bạn sẽ không có được khoảng thời gian vui vẻ.
Theo truyền thống, điện toán và bộ lưu trữ của bạn sẽ được đặt cùng một máy chủ hoặc ít nhất là cùng một trung tâm dữ liệu, nhưng với sự gia tăng của các chức năng biên và không có máy chủ, chúng ta đã thấy sự tách rời giữa điện toán và lưu trữ. Điều này rất tốt cho việc mở rộng quy mô và tính khả dụng, nhưng nó gây ra một vấn đề mới:độ trễ. Ngày nay, việc triển khai api của bạn lên mạng biên toàn cầu thật dễ dàng, nhưng còn dữ liệu của bạn thì sao? Dữ liệu vẫn còn tụt lại phía sau nhưng chắc chắn sẽ bắt kịp.
Trong bài viết này, chúng tôi sẽ so sánh hiệu suất của hai kho dữ liệu không có máy chủ:Cloudflare KV và Upstash Redis. Cả hai đều không có máy chủ, cả hai đều được phân phối trên toàn cầu, nhưng chúng rất khác nhau trong cách tiếp cận. Cloudflare KV là kho lưu trữ khóa-giá trị dựa trên thao tác kéo, trong khi Upstash là dịch vụ tương thích với Redis với tính năng sao chép tích cực.
Dựa trên kéo :Dữ liệu thường được lưu trữ ở vị trí trung tâm và chỉ được chuyển đến các nút biên khi người dùng yêu cầu. Đây là cách tiếp cận của Cloudflare KV.
Sao chép tích cực :Dữ liệu được lưu trữ ở mọi vị trí biên và được chính kho dữ liệu giữ đồng bộ. Cập nhật dữ liệu ngay lập tức được sao chép tới tất cả các khu vực. Đây là cách tiếp cận được thực hiện bởi Upstash và do đó là Vercel.
Bộ nhớ đệm thực chất chỉ là lưu trữ một loạt khóa và giá trị của chúng. Đó là một khái niệm đơn giản, nhưng nó cũng là một khái niệm rất phổ biến. Đó cũng là một cách tuyệt vời để so sánh hiệu suất của hai kho dữ liệu. Chúng tôi sẽ sử dụng một kịch bản bộ nhớ đệm đơn giản để so sánh hiệu suất của Cloudflare KV và Upstash Redis.
Điểm chuẩn
Chúng tôi thực sự đang thử nghiệm cái gì?
Chúng tôi sẽ đo độ trễ mà nhân viên cloudflare gặp phải khi đọc một giá trị duy nhất từ Cloudflare KV và Upstash Redis.
- 1 nhân viên cloudflare
- 1000 phím
- 4KB - Kích thước dữ liệu 64KB (ngẫu nhiên)
- TTL 60 giây trên tất cả các phím
- 20 vùng gọi công nhân
- ~10 yêu cầu mỗi giây
Tôi đã chọn một không gian phím khá nhỏ để đảm bảo chúng tôi nhận được một số lần truy cập vào bộ nhớ đệm mà không cần phải tăng RPS quá mức.
Mã công nhân
Bản thân Worker rất đơn giản, nó chỉ đọc từ Redis, đọc từ KV rồi trả về những độ trễ đó để đánh giá sau.
công nhân.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,
});
}); Kết quả - Độ trễ toàn cầu
Sau khi chạy điểm chuẩn trong khoảng 30 phút, chúng tôi có thể quan sát thấy một số khác biệt đáng kể giữa hai kho dữ liệu.
Bấm vào hình để xem kích thước đầy đủ
Như bạn có thể thấy Cloudflare KV luôn chậm hơn Upstash Redis. Tôi đã không mong đợi điều này vì Cloudflare quảng cáo KV có độ trễ thấp và chạy trên cùng nền tảng với chính các công nhân. Có, theo mặc định, họ không lưu giữ dữ liệu ở từng khu vực, nhưng sau vài phút, tôi dự kiến dữ liệu sẽ được lưu vào bộ nhớ đệm ở khu vực nơi nhân viên đang chạy.
Có thể tải không đủ cao để hệ thống của họ sắp xếp dữ liệu? Hãy tách riêng một vùng và tăng mạnh tải để xem liệu điều đó có tạo ra sự khác biệt hay không.
Một vùng
Hãy xem kết quả của một khu vực có RPS cao hơn nhiều. Về lý thuyết, cloudflare có thể làm nóng tất cả bộ nhớ đệm trong khu vực này và có độ trễ cực thấp như quảng cáo.
Thử nghiệm này giống với thử nghiệm đầu tiên, ngoại trừ việc chúng tôi đang gọi nhân viên từ một khu vực duy nhất và với ~400 RPS.
Bấm vào hình để xem kích thước đầy đủ
Độ trễ của KV đã được cải thiện đáng kể:
- P90: 742 mili giây -> 115 mili giây
- P99: 1.336 mili giây ->560 mili giây
Rõ ràng bạn thực sự cần tải khá cao trước khi Cloudflare thực sự sao chép dữ liệu của bạn gần hơn với các nhân viên đang chạy. Tuy nhiên, nó vẫn cao hơn nhiều so với độ trễ của Upstash Redis. Mặc dù độ trễ P90 của Cloudflare là 115 mili giây không đến nỗi tệ, nhưng độ trễ P99 trên nửa giây rõ ràng là đáng chú ý. Hãy nhớ rằng chúng tôi đang thực hiện khoảng 400 yêu cầu mỗi giây để đảm bảo dữ liệu thực sự được sao chép, tức là đã tải nhiều hơn hầu hết các API vừa và nhỏ thường thấy.
Điều thú vị là bạn có thể biết khi nào Cloudflare di chuyển dữ liệu đến gần hoặc ra xa nhân viên được chú thích trong hình ảnh sau:
Bấm vào hình để xem kích thước đầy đủ
Giá cả
Đây sẽ không phải là một sự so sánh công bằng nếu không nói về chi phí của mọi thứ.
Yếu tố thúc đẩy chính ở đây sẽ là chi phí cho mỗi yêu cầu để truy cập vào kho dữ liệu.
Cloudflare tính phí 0,50 USD cho mỗi triệu lượt đọc KV, trong khi Upstash tính phí 1 USD cho mỗi triệu lệnh Redis. Có một số điểm khác biệt khác, trong đó Cloudflare đắt hơn về dung lượng lưu trữ, trong khi Upstash đắt hơn về băng thông. Tuy nhiên, đây không phải là yếu tố thúc đẩy chi phí chính trong kịch bản này.
- Giá Cloudflare
- Giá cao nhất
Upstash có phù hợp với bạn không?
Đây là câu hỏi chỉ bạn mới có thể trả lời.
Rõ ràng ở đây chúng tôi có thành kiến và thực sự tin tưởng vào sản phẩm của mình cũng như giá trị của nó, vì vậy hãy coi trọng điều này.
Nếu bạn đang chạy API có kích thước vừa và nhỏ thì bạn sẽ cần xem xét độ trễ vì chi phí sẽ không đáng kể. Khi API có lưu lượng truy cập lớn, Upstash đưa ra mức giá cố định rẻ hơn Cloudflare KV.
Nếu tất cả những gì bạn cần chỉ đơn giản như set , get hoặc list , bạn sẽ luôn ở trên nền tảng công nhân và độ trễ cao có thể chấp nhận được đối với ứng dụng của bạn, thì Cloudflare KV có thể là lựa chọn phù hợp. Mọi thứ đều được xử lý ở cùng một nơi và bạn không phải lo lắng về bất cứ điều gì.
Nếu bạn trả lời bất kỳ câu hỏi nào trong số đó bằng 'no' , thì tôi khuyến khích bạn dùng thử Upstash. Redis có rất nhiều tính năng mà Cloudflare KV không có, như pub/sub, bộ được sắp xếp, hàm băm, v.v. Và Upstash hỗ trợ tất cả các tính năng đó. Nếu đang sử dụng Redis, bạn chỉ cần trỏ ứng dụng của mình tới Upstash và nó sẽ hoạt động. Không cần thay đổi gì cả.
Kết luận
Cloudflare KV là một sản phẩm tuyệt vời nhưng nó không phải là sự thay thế cho cơ sở dữ liệu hoàn chỉnh như Redis. Nó phù hợp với các trường hợp sử dụng đơn giản, trong đó độ trễ không phải là vấn đề đáng lo ngại.
Hãy đến chào và đặt câu hỏi về bất kỳ vấn đề nào trong số này trong Discord của chúng tôi hoặc trên X.