Amazon Web Services ブログ

Amazon DocumentDB と Amazon ElastiCache を使用したパフォーマンスのためのキャッシング

技術の世界で、キャッシュはどこにでもあるものです。CPU は L1、L2、および L3 キャッシュを使用し、携帯電話はアプリのデータをローカルにキャッシュします。ストリーミングサービスはエッジでコンテンツをキャッシュし、ブラウザーは画像をキャッシュするなどです。

同じことは、データベースにも言えます。

もし、ゲームのサイトで、毎回リーダーボードが表示され、そのたびに、クエリが合計を行い、ゲームのすべてのプレーヤーをソートする必要があったらどうでしょうか。または、eコマースのサイトに行くたびに、特定の製品の価格をそれぞれの顧客のディスクから読み取らなければならないとしたらどうでしょうか。パフォーマンスは受け入れがたいものであり、コンピューティングの量でコストはかなり高額になります。

データベースで、キャッシングの主な動機として、パフォーマンスとコスト節約の 2 つが挙げられます。ミリ秒のパフォーマンスでは十分ではないときにマイクロ秒のパフォーマンスを求める場いいでも、一般的に使用されるデータをキャッシングすることにより、データベースから費用のかかる運用を外したい場合などです。

ソリューションの概要

この記事では、Amazon DocumentDB (MongoDB 互換性を使用) および Amazon ElastiCache を統合して、マイクロ秒の応答時間を達成し、コスト全体を減らす方法を示します。次の図では、この記事のソリューションに対するアーキテクチャを示しています。

この例の運用データベースは、Amazon DocumentDB です。これは高速で信頼性があり、容易にクラウドでの Mongo DB互換のデータベースをセットアップ、運用、およびスケールすることができる完全管理型のデータベースです。Amazon DocumentDB で、MongoDB で使用しているものと同じアプリケーションコードを実行し、同じドライバ、およびツールを使うことができます。

Amazon DocumentDB の柔軟性のあるドキュメントモデル、データタイプ、インデックス作成機能を使用して、コンテンツを素早く、直感的に保管し、クエリすることができます。たとえば、ショッピングサイトやカタログのユーザーレビューやでもビデオ、POS 端末の在庫リスト、トレーディングプラットフォームの財務取引などです。

キャッシングレイヤーの場合、Amazon ElastiCache を使用します。これは、AWS の分散型メモリ内キャッシュ環境を容易にセットアップ、管理、スケールできるようにします。ElastiCache は高いパフォーマンス、サイズ変更可能で、コスト効率の良いメモリ内キャッシュを提供する一方で、分散型キャッシュ環境のデプロイと管理に関連付けられた複雑性を排除します。ElastiCache は、Redis と Memcached エンジンの両方と互換性があります。

気に入った歌を見つけることができるようにするアプリケーションを構築することにより、これらの 2 つのサービスを統合する方法を示します。REST API クライアントを使用して、アプリケーションのエンジンに歌のタイトルを送信します。

アプリケーションエンジンは、要求された歌の歌手の名前と可視を含むドキュメントを ElastiCache レイヤーから取得することにより、API 要求を処理します。その歌の要求がすでに前もってあった場合、ElastiCache による読み取りが行われます。そうではない場合、アプリケーションエンジンは Amazon DocumentDB にクエリし、要求されたドキュメントを JSON ドキュメントとしてアプリケーションに返します。

アプリケーションは ElastiCache のコピーをキャッシュして、同じ歌のその後の要求の応答時間をスピードアップします。この例の場合、私は、キャッシングレイヤーとして Amazon ElastiCache for Redis。REST API クライアントとして Postman を使用します。Postman アプリは、REST API のテストのためのオープンソースツールです。

Amazon DocumentDB クラスターを作成する

クラスターの作成に関する詳細については、クラスターの使用開始を参照してください。

  1. Amazon DocumentDB コンソールを開きます。
  2. 新しいクラスターを作成します。
  3. クラスターの ID wo入力します。
  4. 適切なインスタンスを選択します。
  5. インスタンス数のデフォルト値をそのままにします。
  6. マスターユーザー名とパスワードを定義します。
  7. 以下のスクリーンショットで示されているように、[クラスターの作成] を選択します。

Redis クラスター用 ElastiCache を作成する

次のスクリーンショットに示されているように、以下のステップを使用して、Amazon ElastiCache for Redis クラスターを作成します。

  1. AWS マネジメントコンソールから、[サービス] の下の ElastiCache を検索します。
  2. ElastiCache ダッシュボードから、[Redis] を選択し、[作成] を選びます。
  3. Redis 設定を記入します。この例では、デフォルトポート 6379 を使用します。

EC2 インスタンスを作成する

Amazon EC2 インスタンスで歌のアプリケーションをホストします。

  1. EC2 Linux インスタンスを作成します。それには、パブリック IP アドレスがあることを確認します。
  2. キーペアでインスタンスを開始します
    キーペアファイル (.pem) をダウンロードします。これは、新しく作成したインスタンスと関連付けられたプライベートキーを保存し、以下のコマンドを使用するようにそれに接続します。

    ssh -i ~/<path_to_instance_keypair_file>/<keypair_file>.pem ec2-user@<your_ec2_instance_public_dns_or_IP>

    たとえば、キーペアファイルに my-key-pair.pem という名前を付け、EC2 インスタンス DNS が ec2-198-51-100-1.compute-1.amazonaws.com の場合、コマンドは次のようになります。

    ssh -i /<path>/my-key-pair.pem ec2-user@ec2-198-51-100-1.compute-1.amazonaws.com

クラスターに接続する

Amazon DocumentDB と ElastiCache クラスターに接続するためには、2 つのクラスターのセキュリティグループを更新して、それぞれ TCP ポート 27017 と 6379 にインバウンドトラフィックを許可します。

また、デモアプリケーションが次のスクリーンショットで示されているように、リスンしている TCP ポート 8082 の EC2 インスタンスのセキュリティグループでインバウンド接続を有効にします。

MongoDB シェルをインストールする

次に、EC2 インスタンスに MongoDB シェルをインストールします。MongoDB シェルのインストールの手順は、YouTube または 入門 ガイドで見つかる場合があります。

接続を検証する

次の問題を使用して、EC2 インスタンせから Amazon DocumentDB クラスターに接続できることを確認してください。

[ec2-user@ip-172-31-83-136 ~]$ mongo --ssl --host docdb-2019-06-16-22-03-10.cluster-c9di9qmu8xqw.us-east-1.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username docdbadmin --password <###########>
MongoDB シェルバージョン v3.6.13
接続先: mongodb://docdb-2019-06-16-22-03-10.cluster-c9di9qmu8xqw.us-east-1.docdb.amazonaws.com:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("1fe7a152-8340-4d8e-b329-09c722b53b10") }
MongoDB サーバーバージョン: 3.6.0
rs0:PRIMARY>

次に、Amazon ElastiCache クラスターに接続できることを確認してください。それを行うためには、歌のアプリケーションをホストする同じ EC2 インスタンスで次のステップを使用して、Redis コマンドラインインターフェイス (CLI) をインストールします。

sudo yum install gcc
wget http://download.redis.io/redis-stable.tar.gz 
tar xvzf redis-stable.tar.gz
cd redis-stable
make

検証するために、次のコマンドを実行して、Redis クラスターの ElastiCache に接続してください。

src/redis-cli -h myredis.obpmqw.ng.0001.use1.cache.amazonaws.com -p 6379

以下の ElastiCache プロンプトを取得して、クラスターに接続されていることを確認します。

myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379>

ここで、次の keys * コマンドを使用して、キャッシュに現在あるものを確認します。

myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379> keys *
(~のリストまたはセット)

出力はキャッシュが空であることを確認します。

アプリエンジンの構築

これで、Amazon DocumentDB データベースと ElastiCache の両方に接続され、別の EC2 インスタンスで Node.js アプリエンジンを構築することを開始できます。

EC2インスタンスで実行されている同じNode.jsアプリケーションを使用して、歌手、タイトル、テキスト歌詞の詳細を含むデータをAmazon DocumentDBクラスタに入力します。

最初に、Node.js が EC2 インスタンスにインストールされていることを確認します。

Node.js が EC2 インスタンスにインストールされた後で、次のコマンドを実行することで、Node Package Manager (npm) がインストールされます。

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://thinkwithwp.com/amazon-linux-2/
23 個のパッケージ中、セキュリティに 16 パッケージが必要です
すべての更新を適用するために、「sudo yum update」を実行します。
[ec2-user@ip-172-31-34-254 ~]$ npm --version
6.9.0
[ec2-user@ip-172-31-34-254 ~]$ which node
~/.nvm/versions/node/v10.16.0/bin/node
[ec2-user@ip-172-31-34-254 ~]$ 

アプリケーションディレクトリを作成する

次に、アプリケーションのディレクトリを作成し、以下のコマンドを使用してそのディレクトリを変更します。

mkdir cdstore
cd cdstore

次のコマンドは、パッケージ .json ファイルを生成します。

npm init

デフォルトの index.js 値を選択し、index.js の代わりに cdstore.js を入力します。

Install dependencies

次に、アプリケーションを機能させるために必要なすべての依存関係をインストールします。これらは、アプリケーションを Amazon DocumentDB に接続することを許可する MongoDB、Node.js ウェブアプリケーションフレームワーク、Node.js Redis クライアント、および Node.js 本体の解析ミドルウェアである本体パーサーを含みます。これを行うには、次のコマンドを実行します。

npm install express --save
npm install mongodb --save
npm install redis –save
npm install body-parser –save

パッケージ .package.json ファイルの内容は次のとおりです。

{
  "name": "cdstore",
  "version": "1.0.0",
  "description": "songs search engine app to showcase Amazon DocumentDB and Elasticache integration",
  "main": "cdstore.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "GL",
  "license": "ISC",
  "dependencies": {
    "body-parser": "^1.19.0",
    "express": "^4.17.1",
    "mongodb": "^3.2.7",
    "mongoose": "^5.6.0",
    "redis": "^2.8.0"
  }
}

関数を作成します

2 つの関数を作成します

SaveSong () 関数は、Amazon DocumentDB インスタンスにデータを挿入するために、/POST 要求を送信するために使用されました。コマンド db.<collection_name>.insert() を使用して、一括でデータを挿入するためのスクリプトを書くこともできました。

SearchSongByTitle()/GET メソッドにより使用されて、実際の検索を実行します。

cache.js と呼ばれるファイルに 2 つの関数を保存します。そのファイルを作成します。

touch cache.js

お気に入りのエディター (vim、vi など) を使用して、以下のコードを cache.js ファイルにコピーします。

module.exports.SaveSong = function (db, title, singer, text, callback) {
    db.collection('text').insertOne({
        title: title,
        singer: singer,
        text: text
    }, callback);
};

module.exports.SearchSongByTitle = function (db, redis, title, callback) {
    redis.get(title, function (err, reply) {
        if (err) callback(null);
        else if (reply) //Song does not exist in cache
        callback(JSON.parse(reply));
        else {
            //Song doesn't exist in cache so need to query the database
            db.collection('text').findOne({
                title: title
            }, function (err, doc) {
                if (err || !doc) callback(null);
                else {//Song found in database,return to client and save to cache and return to client
                    redis.set(title, JSON.stringify(doc), function () {
                        callback(doc);
                    });
                }
            });
        }
    });
};

エンドポイントを作成する

ここで、次のように、エンドポイント cdstore.js を作成します。

touch cdstore.js

以下のコードをkぴ―し、それを cdstore.js ファイルに貼り付けます。

var mongoose = require("mongoose");
var redisClient = require('redis').createClient;
var redis = redisClient(6379, 'myredis.obpmqw.ng.0001.use1.cache.amazonaws.com');
var express = require('express'),
    MongoClient = require('mongodb').MongoClient,
    app = express(),
    mongoUrl = 'mongodb://docdbadmin:docdbadmin@docdb-2019-06-16-22-03-10.cluster-c9di9qmu8xqw.us-east-1.docdb.amazonaws.com:27017/?ssl=true&ssl_ca_certs=rds-combined-ca-bundle.pem&replicaSet=rs0';
var db;
MongoClient.connect(mongoUrl, { useNewUrlParser: true }, function (err, client) {
    if (err) throw 'Error connecting to database - ' + err;
 db = client.db('cd')
});

var cache = require('./cache.js');
var cdSchema = new mongoose.Schema({
  title: String,
  singer: String,
  text: String
});

var Song = mongoose.model("Song", cdSchema);
var bodyParser = require('body-parser');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

 app.post('/cd', function (req, res) {
        if (!req.body.title || !req.body.singer) res.status(400).send("Please send a title and an singer of the song”);
        else if (!req.body.text) res.status(400).send("Please send some text lyrics of the song”);
        else {
            cache.SaveSong(db, req.body.title, req.body.singer, req.body.text, function (err) {
                if (err) res.status(500).send("Server error");
                else res.status(201).send("Saved");
            });
        }
    });

app.get('/cd/:title', function (req, res) {
    if (!req.params.title) res.status(400).send("Please send a proper song 
title");
    else {
        cache.SearchSongByTitle(db, redis, req.params.title, function (cd) {
            if (!req.params.title) res.status(500).send("Server error");
            else res.status(200).send(cd);
        });
    }
});
    app.listen(8082, function () {
        console.log('Listening on port 8082');
    }); 

アプリケーションを開始する

次に、アプリケーションを開始し、この例では、これが EC2 インスタンスのポート 8082 で実行するように設定します。これを行うためには、次のコマンドを使用します。

node cdstore.js

すべてを正しく実行すると、コンソールで次のメッセージが表示されるはずです。

Listening on port 8082

アプリケーションをテストする

アプリケーションをテストするためには、Postman (REST API クライアント) を使用して、POSTGET 要求を作成します。GET 要求の場合、最初の要求 (データが Amazon DocumentDB から取り込まれたとき) とその後の要求 (Redis ElastiCache からサービスを受けたとき) の間の応答時間を比較します。

  1. Amazon DocumentDB に POST を使用して、歌のデータセットを入力します
  2. GET で検索します
    簡単にするために、この例では単一の歌を入力するためのプロセスのみを表示します。ただし、それはその後のステップで数回、繰り返されてきました。
    Postman を平¥いて、POST メソッドを選択して、アプリケーション URL を入力します (この例では、http://<ec2-dns-or-IP>:8082/)。
    x-www-form-urlencodedBody の下で選択されていることを確認します。
  1. キー値ペアとして、歌の詳細を入力します。
    タイトル: Everything is everything
    歌手: Lauryn Hill
    テキスト: After winter must come spring
  1. [送信] を選択します。

次のスクリーンショットで示されるように、Postman 画面で、Saved Status 201 created が表示されるはずです。

次のスクリーンショットで示されるように、Postman コンソールから POST 要求の詳細をチェックし、同じ結果であることを確認してください。

Amazon DocumentDB クラスターを確認する

前のステップから同じコマンドを使用して、Amazon DocumentDB に接続し、そのデータがデータベースに保存されたことを確認してください。

[ec2-user@ip-172-31-83-136 ~]$ mongo --ssl --host docdb-2019-06-16-22-03-10.cluster-c9di9qmu8xqw.us-east-1.docdb.amazonaws.com:27017 --sslCAFile rds-combined-ca-bundle.pem --username docdbadmin --password <###########>
MongoDB シェルバージョン v3.6.13
接続先: mongodb://docdb-2019-06-16-22-03-10.cluster-c9di9qmu8xqw.us-east-1.docdb.amazonaws.com:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("1fe7a152-8340-4d8e-b329-09c722b53b10") }
MongoDB サーバーバージョン: 3.6.0
rs0:PRIMARY>

[Enter] を選択することで、Amazon DocumentDB プロンプトに切り替えます。そのプロンプトから、次のコマンドを入力して、次のコード例で示されているように、Postman から送信されたデータが正常に保存されたことを確認します。

  • show db—Amazon DocumentDB で使用可能なデータベースインスタンスをリストする。
  • use cd—cd と呼ばれるインスタンスを使用するようにインタープリターに指示する。
  • show collections—使用可能なコレクションを表示する (リレーショナル DB と同様のテーブルと考えることができます)
  • db.text.find()—テキストコレクションの内側にすべてのドキュメントをリストする
rs0:PRIMARY> show dbs
admin  0.000GB
cd     0.000GB
db     0.000GB
test   0.000GB
rs0:PRIMARY> use cd
switched to db cd
rs0:PRIMARY> show collections
cd
text
rs0:PRIMARY> db.text.find()
{ "_id" : ObjectId("5d0f694039709606b4193ff0"), "title" : "Bad", "singer" : "Michael Jackson", "text" : "Who's bad" }
{ "_id" : ObjectId("5d1287933bfba9381eb38aec"), "title" : "7 days", "singer" : "Craig David", "text" : "I met this girl on monday" }
{ "_id" : ObjectId("5d129c793bfba9381eb38aed"), "title" : "I'm alive", "singer" : "Celine Dion", "text" : "A new day has come" }
{ "_id" : ObjectId("5d1367d3d31268442cc9a68f"), "title" : "Love", "singer" : "Madonna", "text" : "Love is great" }
{ "_id" : ObjectId("5d136d2c808560468a8207a2"), "title" : "I will always love you", "singer" : "Whitney Houston", "text" : "I will always love you darling" }
{ "_id" : ObjectId("5d13724f606c0046f5b630ca"), "title" : "Sunshine", "singer" : "Fancis Cabrel", "text" : "Sunny days" }
{ "_id" : ObjectId("5d13dfd40cc0f94daaeca560"), "title" : "Jamming", "singer" : "Bob Marley", "text" : "I wanna jamming with" }
{ "_id" : ObjectId("5d13ef5e03b8825ee9747754"), "title" : "I don't care", "singer" : "Justin Bieber", "text" : "I don't really care" }
{ "_id" : ObjectId("5d13efa503b8825ee9747755"), "title" : "Vossi Bop", "singer" : "Stormzy", "text" : "Vossi bop vossi bop" }
{ "_id" : ObjectId("5d13efe403b8825ee9747756"), "title" : "Bad guy", "singer" : "Billie Eilish", "text" : "There is the bad guy" }
{ "_id" : ObjectId("5d13f02203b8825ee9747757"), "title" : "Hold Me While You Wait ", "singer" : "Lewis Capaldi", "text" : "Can you hold me while you wait" }
{ "_id" : ObjectId("5d13f06703b8825ee9747758"), "title" : "You Need To Calm Down", "singer" : "Taylor Swift", "text" : "You just need to calm down" }
{ "_id" : ObjectId("5d16a8f6044bc93008a71fa3"), "title" : "Happy", "singer" : "Farrell Willams", "text" : "Because I'm happy" }
{ "_id" : ObjectId("5d16a981044bc93008a71fa4"), "title" : "I will always love you", "singer" : "Whitney Houston", "text" : "I would only be in your way" }
{ "_id" : ObjectId("5d16ab3f044bc93008a71fa5"), "title" : "I don't care", "singer" : "Justin Bieber", "text" : "I don't care" }
{ "_id" : ObjectId("5d16ab88044bc93008a71fa6"), "title" : "Dangerously in love", "singer" : "Beyonce Knowles", "text" : "Crazy in love" }
{ "_id" : ObjectId("5d16ac793410943035513dad"), "title" : "Good girl gone bad", "singer" : "Rihanna", "text" : "Umbrella" }
{ "_id" : ObjectId("5d173033aba3723895b7ba0a"), "title" : "Cry me a river", "singer" : "Justin Timberlake", "text" : "Cry me a river" }
{ "_id" : ObjectId("5d1a1ecfb031a963201c0632"), "title" : "Waka waka", "singer" : "Shakira", "text" : "Zaminamina waka waka" }
{ "_id" : ObjectId("5d1b74bf7e0f7c1c45a48e67"), "title" : "Let it be", "singer" : "Beatles", "text" : "Let it be" }
Type "it" for more
rs0:PRIMARY> it
{ "_id" : ObjectId("5d1b794773328e1ca5f12edc"), "title" : "Abbey road", "singer" : "Beatles", "text" : "Here comes the sun" }
{ "_id" : ObjectId("5d1b7b5473328e1ca5f12edd"), "title" : "Nikita", "singer" : "Beatles", "text" : "Here comes the sun" }
{ "_id" : ObjectId("5d49a8e40d2e08281417eef6"), "title" : "Time to grow", "singer" : "Lemar", "text" : "If there is any justice in the world" }
{ "_id" : ObjectId("5d4ace76534b934149e43d3f"), "title" : "River", "singer" : "Luis", "text" : "Beautiful river" }
{ "_id" : ObjectId("5d51bc6217d7183869dce115"), "title" : "Ghetto Gospel", "singer" : "Tupac Shakur", "text" : "my ghetto gospel" }
{ "_id" : ObjectId("5d52f004042b1b4b0e9b1477"), "title" : "Everything is everything", "singer" : "Lauryn Hill", "text" : "After winter must come spring" }
rs0:PRIMARY> 

一括挿入データ

コマンド db.text.find() からの出力はまた、Amazon DocumentDB インスタンスですでにいくつかの歌のエントリがあったことも示しています。それらは、アプリケーションのテスト中に Postman から POST コマンドを送信することにより追加されます。

また、次のコマンドを使用して、Amazon DocumentDB に一括で歌を挿入することもできます。

db.text.insertMany(). 

例:

db.text.insertMany(
    [
        {
            “title”: “your favorite song’s title number 1“,
            “singer”:”you favorite singer number 1”,
            “text”: “your favorite song lyrics number 1“
        },
        {
            “title”: “your favorite song’s title number 2”,
            “singer”:” you favorite singer number 2”,
            “text”: “your favorite song lyrics number 3“
        },
        {
            “title”: “your favorite song’s title number 3”,
            “singer”:" you favorite singer number 3”,
            “text”: “your favorite song lyrics number 3”
        }
    ]
)

db.text.find() コマンドを再び実行する場合、MongoDB API を使用して、db.text.insertMany() をつあって挿入された 3 つのエントリが表示されます。これは、新しく追加エントリを表示する出力を表示するだけです。

Type "it" for more
rs0:PRIMARY> it
{ "_id" : ObjectId("5d1b794773328e1ca5f12edc"), "title" : "Abbey road", "singer" : "Beatles", "text" : "Here comes the sun" }
{ "_id" : ObjectId("5d1b7b5473328e1ca5f12edd"), "title" : "Nikita", "singer" : "Beatles", "text" : "Here comes the sun" }
{ "_id" : ObjectId("5d49a8e40d2e08281417eef6"), "title" : "Time to grow", "singer" : "Lemar", "text" : "If there is any justice in the world" }
{ "_id" : ObjectId("5d4ace76534b934149e43d3f"), "title" : "River", "singer" : "Luis", "text" : "Beautiful river" }
{ "_id" : ObjectId("5d51bc6217d7183869dce115"), "title" : "Ghetto Gospel", "singer" : "Tupac Shakur", "text" : "my ghetto gospel" }
{ "_id" : ObjectId("5d52f004042b1b4b0e9b1477"), "title" : "Everything is everything", "singer" : "Lauryn Hill", "text" : "After winter must come spring" }

{ "_id" : ObjectId("5d6281c29c2cb6eeccb83927"), "title" : "your favorite song’s title number 1", "singer" : "you favorite singer number 1", "text" : "your favorite song lyrics number 1" }
{ "_id" : ObjectId("5d6281c29c2cb6eeccb83928"), "title" : "your favorite song’s title number 2", "singer" : "you favorite singer number 2", "text" : "your favorite song lyrics number 3" }
{ "_id" : ObjectId("5d6281c29c2cb6eeccb83929"), "title" : "your favorite song’s title number 3", "singer" : "you favorite singer number 3", "text" : "your favorite song lyrics number 3" }

タイトルのみを使用してエントリを取得する

GET 要求を Postman から実行します。

Postman 画面に戻り、以下の URL で GET メソッドを選択します。

http://<ec2-dns-or-IP>:8082/cd/:title

パス変巣キー値を入力して、歌のタイトル (Everything is everything) のみを使用して、Amazon DocumentDB にあらかじめ保存されている歌を取得しようとします。

[送信] を選択します。

次のスクリーンショットで示されるように、JSON 形式で Lauryn Hill の歌の詳細を受け取ります。

Postman コンソールから、次のスクリーンショットで示されるように、実際の GET 要求の詳細を確認します。

全体として、要求には 13 ミリ秒かかりました。

データが ElastiCache に保存されていることを確認する

Node.js アプリケーションは、(次のコード抽出で示されるように) 各クライアント要求を Redis に送信して、要求されたドキュメントがすでにキャッシュされているかどうかを確認するように設計されています。そうではない場合、要求は Amazon DocumentDB に送信され、要求されたドキュメントを取得します。それは、Amazon ElastiCache で保存されたコピーをクライアントに送り返します。

データが Amazon ElastiCache に保存されていることを確認する

module.exports.SearchSongByTitle = function (db, redis, title, callback) {
    redis.get(title, function (err, reply) {
        if (err) callback(null);
        else if (reply) //Song does not exist in cache
        callback(JSON.parse(reply));
        else {
            //Song doesn't exist in cache so need to query the database
            db.collection('text').findOne({
                title: title
            }, function (err, doc) {
                if (err || !doc) callback(null);
                else {//Song found in database,return to client and save to cache and return to client
                    redis.set(title, JSON.stringify(doc), function () {
                        callback(doc);
                    });
                }
            });
        }
    });
};

検証するために、ElastiCache for Redis に接続して、データがキャッシュされたことを確認します。

src/redis-cli -h myredis.obpmqw.ng.0001.use1.cache.amazonaws.com -p 6379

keys * コマンドを実行して、すべてのキーをリストし、歌手 Lauryn Hill から歌のタイトル Everything is everything のキーを確認します。それを前のステップで POST 要求として送信します。リストの 9 番目のエントリとして、Amazon ElastiCache インスタンスでキャッシュされています。

myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379> keys *
 1) "Dangerously in love"
 2) "Good girl gone bad"
 3) "Sun"
 4) "Bad"
 5) "Happy"
 6) "Ghetto Gospel"
 7) "7 days"
 8) "Cry me a river"
 9) "Everything is everything"
10) "Jamming"
11) "River"
12) "Love"
myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379>

get <key> コマンドを実行して、特別なキーの詳細を確認できます。たとえば、歌 Everything is everything の詳細を確認するために、次のコード例に示されるように、コマンド get Everything is everything を実行します。

myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379> get "Everything is everything"
"{\"_id\":\"5d52f004042b1b4b0e9b1477\",\"title\":\"Everything is everything\",\"singer\":\"Lauryn Hill\",\"text\":\"After winter must come spring\"}"
myredis.obpmqw.ng.0001.use1.cache.amazonaws.com:6379> 

データが Amazon ElastiCache で保存されていることを確認して、別の GET 要求を実行して、キャッシュされたデータを取り込みます。それは大幅にはやく配信されるはずです。

次のスクリーンショットでご覧いただけるように、GET 要求の応答時間は 6 ミリ秒に短縮され、Redis ElastiCache によりパフォーマンスの改善が明確に示されています。

まとめ

この記事で、私はユーザーが示されたタイトルに基づいてお気に入りの歌を見つけることができるアプリケーションを使用して、Amazon DocumentDB と Amazon ElastiCache の間の統合を示しました。また、Amazon DocumentDB の前に Amazon ElastiCache for Redis のようなレイヤを使用して、Amazon DocumentDB に保存されるデータの要求応答時間を改善することを示しました。また、これはキャッシュからサービスされるデータの提供を減らすことで、より大きなデータベースクラスターを実行することに比べて、潜在的にコストも削減できます。

 


著者について

Georges Leschener は、.アマゾン ウェブ サービスのグローバルシステムインテグレーター (GSI) チームのシニアパートナーソリューションアーキテクトです。Georges は AWS の GSI パートナーと連携して、お客様のワークロードの AWS クラウドへの移行を助け、AWS のベストプラクティスを適用することによって AWS 上で革新的なソリューションをデザインし、設計しています。