IBM Cloudant と他の IBM サービスとの組み合わせ
データベース・テクノロジーには、それぞれ長所と短所があります。 あるものは、高可用性とデータの耐久性を重視して作られています (その分ハードウェアの数が増え、コストもかかります)。 また、あるものは、高速性を重視し、非常に高速な照会を大量に実行できます (ただし、突然の停電でデータが失われる可能性があります)。
このチュートリアルでは、IBM® Cloudant® for IBM Cloud® と IBM Cloud® Databases for Redis の 2 つの IBM® サービスを組み合わせて、データベース照会用のキャッシング・システムを実装することで、速度とコストを最適化します。
このチュートリアルは、完了までに 1 時間もかかりません。 Databases for Redis サービスには無料のレイヤーが付属していないため、このチュートリアルは完全に料金がかからないわけではありません。 ただし、チュートリアルの完了後にサービスをプロビジョン解除すれば、数ドル超の料金を支払う必要はありません。
The Project - Team Directory
Team Directory は、すべての部門の従業員の詳細を含む Web アプリケーションです。 これらの従業員は、6 つの異なる色分けされたチーム (赤、オレンジ、緑、青、黄、紫) に割り当てられます。 このアプリケーションにアクセスし、1 つのチームを選択すると、そのチームの全メンバーの名前を確認することができます。 また、このチーム・メンバーのリストが IBM Cloudant データベースから取得されたのか、Databases for Redis キャッシュから取得されたのか、照会にどれくらいの時間がかかったのかも表示されます。 キャッシュに入れられたデータがいかに高速に取得できるかがわかります。
目標
- Terraform を使用して IBM Cloud® に複数のサービスをプロビジョンする方法を学びます。
- IBM Cloudant NodeJS SDK を使用して IBM Cloud® サービスにアクセスする方法を学びます。
前提条件
以下の項目が必要です。
- IBM Cloud® の従量課金 (PAYG) アカウント
- Mac または Linux™ の端末へのアクセス
- Git
- Node.js および npm
- Terraform
- Jq (JSON データを処理するためのコマンド・ライン・ツール)
ステップ 1. アカウントにインフラストラクチャーをデプロイするための API キーを取得する
この資料の手順に従って、API キーを作成し、そのキーをメモします。
ステップ 2 コード・リポジトリーを複製し、Terraform ディレクトリーに cd する
ここで、コードを取得し、資格情報ファイルを作成します。
-
端末ウィンドウで、次のコマンドを入力します。
git clone https://github.com/IBM-Cloud/team-directory.git cd team-directory
-
以下のフィールドを使用して、
terraform.tfvars
という文書を作成します。ibmcloud_api_key = "<your_api_key_from_step_1>" region = "eu-gb" redis_password = "<make_up_a_password>"
ステップ 3。 インフラストラクチャーを作成する
-
次の Terraform スクリプトを実行して、必要なすべてのインフラストラクチャーを作成します。
terraform apply --auto-approve
Terraform フォルダーには、以下のリストに示す、いくつかの簡単なスクリプトが含まれています。
main.tf
- IBM Cloud を使用するように Terraform に指示します。
variables.tf
- terraform.tfvars から値が取り込まれる変数定義が含まれます。
redis.tf
- Databases for Redis インスタンスと、それにアクセスするためのいくつかの資格情報を作成します。
cloudant.tf
- IBM Cloudant 無料層インスタンスと、それにアクセスするためのいくつかの資格情報を作成します。
リソースが準備できるまでには数分かかります。 これで、IBM Cloudant インスタンスと Databases for Redis インスタンスが作成され、それらにアクセスできるようになります。
アカウントごとに 1 つの無料層インスタンスのみを持つことができます。 既に無料層インスタンスが存在する場合は、それを削除するか、
plan
変数をstandard
に変更する必要があります。 -
IBM Cloud® アカウントの「リソース」セクションにアクセスして、これらのインスタンスを確認します。
Terraform スクリプトは、次のステップで使用するいくつかの情報を出力します。
ステップ 4: サービスの実行
このステップでは、サービスに必要なすべての環境変数を作成するスクリプトを実行してから、サービスを実行します。
端末で、次のコマンドを入力します。
./build.sh
このスクリプトを実行すると、Terraform スクリプトからのデータ出力が取得され、jq
機能を使用してコンテンツが解析され、必要な環境変数が作成されます。 その後、データベースを初期化してそれにデータを取り込むスクリプト (server.js
) が実行されます。
ステップ 5. Web サイトにアクセスする
-
ブラウザーを開き、
https://localhost:8080
にアクセスします。 以下の画面キャプチャーの各チームのボタンを参照してください。Team Directory team selectors -
色付きのボタンのいずれかをクリックして、チーム・メンバーのリストを取得します。
-
データがどこから来たのか (IBM Cloudant (キャッシュ = false) または Databases for Redis (キャッシュ = true)) と、それにかかった時間を確認します。
-
ステップ 2 でクリックしたボタンと同じボタンをクリックします。 次の画面キャプチャーでは、データが Databases for Redis のキャッシュから来たことと、実行時間が大幅に短いことがわかります。
Team Directory team list and cache information 実際のクラウド・ベースのアプリケーションでは、アプリケーション・サーバーと Databases for Redis インスタンスは互いに近く (同じデータセンター内) にあるため、両者間のレイテンシーはわずか数ミリ秒になります。 この例では、ローカルでホストされているアプリケーション・サーバーとクラウドでホストされている Databases for Redis キャッシュの間に追加のネットワーク・ホップが存在するため、レイテンシー・ゲインは実動時ほど良くありません。
キャッシュ・データは、60 秒以内に有効期限が切れるように設定されます。 そのため、60 秒後にいずれかのチームに戻った場合、データはキャッシュではなく、再びデータベースから取得されます。
-
必要に応じて、**「キャッシュのクリア」**ボタンを使用して、キャッシュに入れられたすべてのデータを Databases for Redis から削除します。
コードについて
このアプリケーションは、単純な Node.js アプリケーションです。 このアプリケーションは、以下の 3 つの主要なパッケージを使用します。
- IBM Cloudant に接続し、データを読み取り/書き込み読みするための
@ibm-cloud/cloudant
。 - Databases for Redis インスタンスに接続し、データを読み取り/書き込みするための
redis
。 - 単純な Web サーバーを有効にして、ユーザーがデータと対話できるようにする Express。
以下のセクションでは、2 つの主要なファイルについて説明します。
server.js
この server.js
ファイルは、Web サーバーを実行し、IBM Cloudant および Databases for Redis と通信します。 フロントエンドがチームの選択を team
ルート (index.html
を参照) に送信すると、app.route
関数は最初にキャッシュをチェックして、キャッシュにデータが既に存在するかどうかを確認します。
存在する場合は、そのデータを返します。 それ以外の場合は、IBM Cloudant に対して照会を実行して、チーム・データを取得し、そのデータをキャッシュに格納して、フロントエンドに返します。
読み取り操作では、IBM Cloudant の設計文書と MapReduce ビューを使用して文書が選択されます。 この選択はこのチュートリアルの範囲外ですが、詳細については、この資料のビューと設計資料を参照してください。
このスクリプトには、初回実行時にテスト・データ (directorydata.json
ファイルに含まれる) をデータベースにアップロードするコードもいくつか含まれています。
index.html
index.html ページは、Vue.js フレームワークを使用するアプリケーションの唯一のページです。 このページがロードされると、利用可能なチームが表示されます。
チームを選択すると、ユーザーの選択を指定した HTTP POST 要求がアプリケーションの /team
ルート (redis.js
を参照) に対して送信されます。 アプリケーションからの正常な応答には、チーム・メンバーのすべてのデータが含まれます。 わかりやすくするために、ここでは名前と町のみを表示しています。
要約
ここでは、IBM Cloud の 2 つのサービス (IBM Cloudant を文書ストアおよび照会エンジンとして、Databases for Redis をコンテンツ・キャッシュとして) を組み合わせて、コストとユーザー・エクスペリエンスを最適化しました。 キャッシュに入れられた文書をより素早く安価に取得することができますが、アプリケーションにより一時的に古いデータがユーザーに表示される可能性があるという矛盾が生じます。
このチュートリアルを実行した場合は、料金の発生を防ぐために、リソースをプロビジョン解除する必要があります。 コマンド terraform destroy --auto-approve
を入力することで、端末の terraform
ディレクトリーからプロビジョン解除を実行できます。