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

サーバーレスバトルグラウンド-DynamoDBvsFirestore vs MongoDB vs Cassandra vs Redis vs FaunaDB

  • これは、2021年4月に公開されたブログ投稿の続きです。

一般的なWebユースケースとサーバーレス機能を使用して、主要なサーバーレスデータベースのパフォーマンスを比較するサンプルアプリケーションを構築しました。データベースは、DynamoDB、MongoDB(Atlas)、Firestore、Cassandra(Datastax Astra)、FaunaDB、Redis(Upstash)です

アプリケーションとソースコードを確認してください。

比較したのは、データベースごとに上位10件のニュース記事を取得するまでの待ち時間です。全体のデータは、New YorkTimesAPIから収集された7001の実際のニュース記事です。レイテンシが次のように測定するクエリ:

select * from news where section = “World” order by view_count desc limit 10

バックエンドは、AWS Lambda(Firestore用のGoogle Cloud関数)にサーバーレス関数として実装されています。レイテンシを最小限に抑えるために、サーバーレス機能とデータベースを同じリージョンに(可能な場合は)同じ場所に配置しました。

遅延測定からデータベース接続時間を除外し、クエリの直前と直後のタイムスタンプを記録しました。レイテンシーはバックエンド(サーバーレス機能内)で測定および記録されるため、ブラウザーとサーバー間のネットワークレイテンシーは含まれません。また、レイテンシはサーバーレス機能のコールドスタート時間の影響も受けません。

動的な実世界のデータをシミュレートするために、ランダムなview_count値を上位10件の記事に割り当てました。したがって、データベースが異なる記事のセットを返すように強制するたびに、それらがキャッシュを使用するのを防ぎます。更新操作は、レイテンシの計算には含まれていません。

ここに、今日(8月25日)のレイテンシーの数値があります

サーバーレスバトルグラウンド-DynamoDBvsFirestore vs MongoDB vs Cassandra vs Redis vs FaunaDB

以下に、各データベースに適用されたカスタム構成をリストします。

DynamoDB

地域:US-West-1

読み取りおよび書き込み容量:50(デフォルト値は5)。

インデックス:パーティションキーセクション(文字列)とソートキーview_count(番号)を含むGSI

注:クライアントはすでに同じリージョン(US-West-1)にあるため、グローバルテーブルは有効になっていません

コードを確認してください。

MongoDB(アトラス)

リージョン:AWS N.バージニア(us-east-1)

クラスター層:M5(一般)

インデックス:セクションとview_countの複合インデックス

注:MongoDBサーバーレスオファリングを試してみたいのですが、Node.jsドライバーがありません。ただし、レイテンシを計算する部分の外側にdb接続を保持しているので、問題にはならないはずです。

コードを確認してください。

ファイアストア

地域:GCP US-Central

モード:データストア

インデックス:section(昇順)とview_count(降順)の複合インデックス

コードを確認してください。

Cassandra(Datastax Astra)

リージョン:AWS US-East-1

プラン:従量制

インデックス:PRIMARY KEY(section、view_count、id)

API:REST API

コードを確認してください。

FaunaDB

プラン:個人(月額$ 25)

インデックス:term =section、value =view_count

API:FQL

コードを確認してください。

Redis(Upstash)

リージョン:AWS US-West-1

プラン:従量制。

インデックス:SortedSetが使用されます。

注:シングルゾーンデータベースとマルチゾーンデータベースは別々にテストされます。

コードを確認してください。

特記事項
  • FaunaDBには、デフォルトでより優れた一貫性の保証とグローバルレプリケーションがあります。また、デプロイするリージョンを選択することもできません。これらは、パフォーマンスが比較的低い理由である可能性があります。
  • Firestoreのパフォーマンスは他のストアと同様ですが、差異が大きくなります。コールド接続のオーバーヘッドがあることが原因である可能性があります。接続を維持する方法が見つかりませんでした。これについてアイデアがあれば教えてください。
  • Cassandraでは、主キーフィールドの更新は許可されていません。インデックスを頻繁に更新する場合は、セカンダリインデックスはお勧めしません。そのため、パフォーマンスにプラスの影響を与える可能性のあるview_countを更新できませんでした。
  • Upstashのシングルゾーンは少し速く見えますが、Upstashのシングルゾーンとマルチゾーンのセットアップに大きなパフォーマンスの違いはありません。 REST APIは、より高いパーセンタイルでネイティブAPIに非常に近いパフォーマンスを発揮するようです。

これは継続的な取り組みであるため、ベンチマークの品質を向上させるためにコードのリファクタリングを継続することに注意してください。製品のコードをリファクタリングすると、ヒストグラムがリセットされます。コードを確認し、改善すべき点があるかどうかをお知らせください。ツイッターと不和で私達に連絡することができます。


  1. サーバーレスデータベース間のレイテンシーの比較:DynamoDBとFaunaDBとUpstash

    この記事では、一般的なWebユースケースについて、3つのサーバーレスデータベースDynamoDB、FaunaDB、Upstash(Redis)のレイテンシーを比較します。 サンプルのニュースWebサイトを作成し、Webサイトへのリクエストごとにデータベース関連のレイテンシーを記録しています。ウェブサイトとソースコードを確認してください。 7001のNYTimesの記事を各データベースに挿入しました。記事はNewYorkTimes Archive API(2021年1月のすべての記事)から収集されます。私は各記事をランダムに採点しました。各ページリクエストで、Worldの下の上位10件の記事

  2. Redis LSET –Redisのリストの特定のインデックスに要素を設定する方法

    このチュートリアルでは、redisデータストアに保存されているリスト値に新しい要素を設定する方法について学習します。このために、Redis LSETを使用します コマンド。 LSETコマンド このコマンドは、キーに格納されているリスト値の指定されたインデックスに新しい要素を設定します。インデックスはゼロベースであるため、0は最初の要素を意味し、1は2番目の要素を意味します。負の数を使用してリストのインデックスを指定することもできます。ここで、-1は最後の要素を意味し、-2は最後から2番目の要素を意味します。範囲外のインデックス値でLSETコマンドを呼び出すと、エラーが返されます。 Red