Redis
 Computer >> コンピューター >  >> プログラミング >> Redis

Cloudflare KV と Upstash Redis:現実世界のパフォーマンス ベンチマーク

デプロイメント プラットフォームを選択する場合、それらの間で実際のパフォーマンスを比較することは多くの場合非常に困難です。これは、グローバル エッジ展開による超低遅延を宣伝するサーバーレス プラットフォームに特に当てはまります。しかし、データの取得が依然として遅い場合、待ち時間が短くても何の意味があるのでしょうか? API がユーザーのすぐ隣で実行されているにもかかわらず、データを取得するために地球の反対側までネットワークを往復する必要がある場合、時間を費やすことはできません。

従来、コンピューティングとストレージは単一のサーバー、または少なくとも同じデータセンターに同じ場所に配置されていましたが、サーバーレス機能とエッジ機能の台頭により、コンピューティングとストレージが分離されるようになりました。これはスケーリングと可用性の面では優れていますが、レイテンシーという新たな問題が生じます。最近では、API をグローバル エッジ ネットワークにデプロイするのは簡単です。しかし、データはどうなるのでしょうか?データは依然として遅れをとっていますが、確実に追いつきつつあります。

この記事では、Cloudflare KV と Upstash Redis という 2 つのサーバーレス データストアのパフォーマンスを比較します。どちらもサーバーレスであり、両方ともグローバルに分散されていますが、アプローチが大きく異なります。 Cloudflare KV はプルベースの Key-Value ストアであるのに対し、Upstash はアクティブ レプリケーションを備えた Redis 互換サービスです。

プルベース :データは通常、中央の場所に保存され、ユーザーが要求した場合にのみエッジ ノードに移動されます。これは、Cloudflare KV が採用したアプローチです。

アクティブ レプリケーション :データはすべてのエッジ ロケーションに保存され、データストア自体によって同期が維持されます。データの更新はすぐにすべてのリージョンにレプリケートされます。これは、Upstash、ひいては Vercel が採用したアプローチです。

キャッシュとは実際には、多数のキーとその値を保存することです。これは単純な概念ですが、非常に一般的な概念でもあります。これは、2 つのデータストアのパフォーマンスを比較するのにも最適な方法です。単純なキャッシュ シナリオを使用して、Cloudflare KV と Upstash Redis のパフォーマンスを比較します。

ベンチマーク

実際に何をテストしているのでしょうか?

Cloudflare KV と Upstash Redis から単一の値を読み取るときに Cloudflare ワーカーが経験するレイテンシーを測定します。

  • Cloudflare ワーカー 1 名
  • 1000 キー
  • 4KB~64KBのデータサイズ(ランダム)
  • すべてのキーで 60 秒の TTL
  • ワーカーを呼び出す 20 のリージョン
  • 1 秒あたり最大 10 件のリクエスト

RPS を上げすぎずにキャッシュ ヒットを確保できるように、かなり小さなキースペースを選択しました。

ワーカーコード

ワーカー自体は非常に単純で、Redis から読み取り、KV から読み取り、後で評価するためにそれらのレイテンシを返すだけです。

worker.ts
app.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 分間実行した後、2 つのデータストア間にいくつかの大きな違いがすでに観察されています。

Cloudflare KV と Upstash Redis:現実世界のパフォーマンス ベンチマーク

画像をクリックするとフルサイズで表示されます

ご覧のとおり、Cloudflare KV は Upstash Redis よりも一貫して遅いです。 Cloudflare は KV を低遅延として宣伝しており、ワーカー自体と同じプラットフォームで実行されるため、これは予想していませんでした。はい、デフォルトではすべてのリージョンにデータが保存されるわけではありませんが、数分後にはワーカーが実行されているリージョンにデータがキャッシュされると思います。

おそらく、システムがデータを同じ場所に配置できるほど負荷が高くないのではないでしょうか。リージョンを分離し、負荷を大幅に増やして、違いが生じるかどうかを確認してみましょう。

単一リージョン

RPS がはるかに高い単一リージョンの結果を見てみましょう。理論的には、cloudflare はこのリージョン内のすべてのキャッシュをウォーミングし、宣伝されているように超低レイテンシを実現できるはずです。

このテストは、単一リージョンから最大 400 RPS でワーカーを呼び出している点を除いて、最初のテストと同じです。

Cloudflare KV と Upstash Redis:現実世界のパフォーマンス ベンチマーク

画像をクリックするとフルサイズで表示されます

KV のレイテンシは大幅に改善されました。

  • P90: 742ミリ秒 -> 115ミリ秒
  • P99: 1,336 ミリ秒 -> 560 ミリ秒

Cloudflareが実際に実行中のワーカーの近くでデータをレプリケートする前に、かなり高い負荷が必要なようです。ただし、それでも Upstash Redis のレイテンシをはるかに上回っています。Cloudflare の P90 レイテンシの 115 ミリ秒はそれほど悪くありませんが、0.5 秒を超える P99 レイテンシは明らかに目立ちます。データが実際にレプリケートされることを確認するために 1 秒あたり約 400 リクエストを実行していることに留意してください。これはすでに、ほとんどの中小規模 API が通常経験するよりも大きな負荷となっています。

興味深いことに、次の画像に注釈が付けられているように、Cloudflare がデータをワーカーに近づけたり遠ざけたりしたときがわかります。

Cloudflare KV と Upstash Redis:現実世界のパフォーマンス ベンチマーク

画像をクリックするとフルサイズで表示されます

価格

物事のコストについて話さずに、これは公平な比較とは言えません。

ここでの主な要因は、いずれかのデータストアにアクセスするためのリクエストごとのコストです。

Cloudflare は 100 万 KV 読み取りあたり 0.50 ドルを請求しますが、Upstash は Redis コマンド 100 万あたり 1 ドルを請求します。他にもいくつか違いがあり、Cloudflare はストレージでより高価であるのに対し、Upstash は帯域幅でより高価です。ただし、これらはこのシナリオの主なコスト要因ではありません。

  • Cloudflare の料金
  • アップスタッシュの価格

Upstash はあなたに適していますか?

これはあなただけが答えられる質問です。

ここで私たちが偏見を持っていることは明らかであり、私たちの製品とその価値を心から信じているので、これを一粒の話に聞いてください。

小規模から中規模の API を実行している場合、コストは無視できるため、レイテンシーを考慮する必要があります。 API のトラフィックが多い場合、Upstash は Cloudflare KV よりも安い固定価格を提供します。

set のような単純なものだけが必要な場合 、get または list 常にワーカー プラットフォームを使用し、アプリケーションで高いレイテンシが許容される場合は、Cloudflare KV が正しい選択となる可能性があります。すべてが同じ場所で処理されるため、何も心配する必要はありません。

これらの質問のいずれかに「いいえ」と答えた場合 , それなら、Upstash を試してみることをお勧めします。 Redis には、Pub/Sub、ソートセット、ハッシュなど、Cloudflare KV にはない機能がたくさんあります。また、Upstash はそれらのすべてをサポートしています。すでに Redis を使用している場合は、アプリケーションを Upstash に指定するだけで機能します。何も変更する必要はありません。

結論

Cloudflare KV は優れた製品ですが、Redis のような本格的なデータベースに代わるものではありません。これは、遅延が問題にならない単純なユースケースに適しています。

ご挨拶に来て、Discord または X でこの件に関する質問をしてください。


  1. redisで複数の文字列値を設定する方法– Redis MSET | MSETNX

    このチュートリアルでは、redis MSETおよびMSETNXコマンドを使用して、redisデータストアのそれぞれのキーに複数の文字列値を設定する方法について学習します。 MSETコマンド MSETコマンドは、複数の文字列値をそれぞれの指定されたキーに設定するために使用されます。指定されたキーのいずれかがすでに存在する場合、その値はそのタイプに関係なく上書きされ、キーに関連付けられている以前の有効期限も削除されます。 MSETコマンドは本質的にアトミックであるため、指定されたすべてのキーが一度に設定され、このコマンドが失敗することはありません。 redis MSETコマンドの構文は次のとお

  2. Node.js、Socket.IO、Redis を使用してスケーラブルなリアルタイム マルチプレイヤー Tic-Tac-Toe ゲームを作成する

    このチュートリアルでは、リアルタイム マルチプレイヤー 三目並べ ゲームを構築します。 Node.js を使用する 、Socket.IO 、 そしてRedis 。このゲームでは、2 人のプレーヤーが異なるブラウザ タブから接続し、交代でプレイし、プレイ中にリアルタイムの更新を確認できます。 Redis を使用します。 複数の WebSocket サーバー間でのゲーム ステートの同期を管理し、アプリケーションをスケーラブルにします。 最終的には、リアルタイム機能を備えた完全に機能するゲームが完成し、WebSocket と Redis を使用してスケーラブルなリアルタイム アプリケーションを構築