ページの表示速度を上げるためにRedisにキャッシュデータを保存/取得した話


背景

業務にてECサイトを作成しているのですが、APIを都度呼び出しているため商品ページの表示が遅いため
定期的にRedisにデータを格納し、参照先を変更することで速度が向上しましたので実行手順をまとめておきます。
※個人情報や企業情報になるものがあるのでブランク化されている部分がありますが、ご了承ください

システム構成

簡略化したシステム構成は以下となります。

Amazon SQSとは

Simple Queue Serviceの略で、フルマネージド型のキューイングサービスとなります。
キューイングとは異なるソフトウェア間でデータの受け渡しを非同期に行います。
非同期的に行うことで送信側は受信側の状態に左右されずメッセージを投げて自分の仕事に戻ることができます。
同期メッセージングでは受信側の状態に問題があった場合、送信側はメッセージを送信できないので、
送信側のシステムが処理できないまま停止することがあるため違いに注意しなければいけません。

AWS ElasticBeanstalkとは

Amazon Elastic Beanstalkとは、Java、.NET、PHP、Node.js、Python、Ruby、Go および Docker を使用して開発されたウェブアプリケーションやサービスを、Apache、Nginx、Passenger、IIS など使い慣れたサーバーでデプロイおよびスケーリングするための、使いやすいサービスです。
簡単にいうと、サーバー構築に関する煩雑な設定を自動でやってくれるサービスです。
インフラ系の知識に疎い多くのWEBアプリケーションエンジニアにとって、アプリケーションを開発してElastic Beanstalkに渡すだけで実行できる環境を用意してくれるというのは学習ハードルも下がるためとてもいいサービスと言えます。

Amzon ElasticBeanstalk wokerについて

wokerは、インスタンス内にsqsdというデーモンが動き動き、指定したSQSキューがたまるとそのキューを取得しインスタンスないの指定したパスにメッセージをpostする仕組みが付いています。
今回は以下のような流れで処理が実行されます。
Eventbridge → SQS → sqsd → アプリケーション

設定を変更

ワーカーのアクセス先がデフォルトだと/になっているため、
準備した処理が実行されるようにアプリケーションのパスを変更してください。
手順は以下のようになります。

  1. AWSのコンソールにログイン後、Amazon Elactic Beanstalkへ遷移
  2. サイドメニュー→環境よりworkerのインスタンスを検索し、選択肢画面を遷移させる
  3. サイドメニューの設定を選択し、ワーカーの[変更]を選択
  4. HTTPパスをアプリケーションのパスに変更

Amazon EventBridgeにて定期実行

Amazon EventBridgeとはサーバーレスイベントバスであり、アプリケーション、統合されたSaaSアプリケーション、および、AWSのサービスから生成されたイベントを使用して、イベント駆動型のアプリケーションを大規模に構築することを容易にします。
イベントを通じて様々なアプリケーション同士を容易に接続できるようにするAWSサービスです。

今回は定期的にRedisにデータを格納する必要があるため、Amazon SQSに対してイベントを作成する必要がある。
以下のように作業を実行することで定期的にSQSキューにジョブが作成されるようになります。

  1. AWSのコンソールにログイン後、Amazon EventBridgeへ遷移
  2. サイドメニューよりルールを選択し、[ルールを作成]を選択
  3. [名前]と[説明]は後から見返した時にわかりやすいように付けることがベターだと思いますが、お任せします。
  4. [パターンを定義]はどのタイミングで実行するのかGUI形式またはcron式で定義することが可能です。
    今回はスケジュール5分で選択にします。設定により5分に一回イベントが作成されるようになります。
  5. [ターゲットを選択]にて呼び出すサービスを選択する必要があります。
    ターゲットをSQSキューに設定、キューに利用するSQSの固有の名前を選択する。

controllerからAPIにてデータをRedisに格納(アプリケーション)

現在稼働中のため詳細にはお話しできませんが、APIをページが表示される度に叩かれています。
そのため取得する情報が多いほど、レスポンスに時間がかかることになります。
こちらをRedisというNoSQLデータベースに商品データを格納し、都度取得するように変更する。

LaravelにてRedisにキャッシュデータを保存

Cacheファザードのstoreメソッドを使い、さまざまなキャッシュ保存いきへアクセスできます。
storeメソッドに渡すキーは、cache設定ファイルのstores設定配列にリストしている保存域の一つです。

Cache::store('redis')->put('bar', 'baz', 600);
LaravelにてRedisにキャッシュデータを取得

Cacheファザーどのgetメソッドはキャッシュからアイテムを取得するために使用します。
アイテムがキャッシュに存在していない場合は、nullが返されます。

$value = Cache::get('key');

参考