• トップ
  • ブログ一覧
  • Google Cloud Memorystoreで60倍のパフォーマンス向上を体験
  • Google Cloud Memorystoreで60倍のパフォーマンス向上を体験

    GCは紫の箱、こやまんのキャッシュ戦略体験記録へようこそ

    皆さんこんにちは。
    最近、Google Cloud Platform (GCP) が「GC」と呼ばれるようになっていることを知って、衝撃を受けてしまった小山こと"こやまん"です。
    GCといえば、「ゲーム○ューブ」が真っ先に浮かんできますよね。よく兄弟喧嘩で鈍器と化してました。

    さて、今回のブログでは、Google Cloudの「Memorystore」と呼ばれるサービスについて、速度向上体験をご紹介したいと思います。

    キャッシュ戦略の基礎知識: サービスを高速化する方法

    まず、Memorystoreについて触れる前に、キャッシュ戦略について確認しましょう。多くのウェブサービスは、レスポンスが早いとユーザーに喜ばれます。キャッシュ戦略は、ウェブサービスのパフォーマンスを上げる重要な方法です。データやリソースを一時的に保存し再利用することで、サーバーの負荷を減らし、応答時間を短くします。

    キャッシュ戦略のメリット

    • 応答時間の向上
      キャッシュを使うと、データの取得が速くなり、待ち時間が短くなります。
    • 負荷の軽減
      サーバーへのリクエストが減るので、サーバーの負荷が軽くなります。
    • コストの削減
      サーバーリソースの効率的な利用で、運用コストが減ります。

    しかし、キャッシュ戦略を誤って実装するとデメリットもあります。

    キャッシュ戦略のデメリット

    • データの整合性の問題
      キャッシュが更新されないと、古いデータが表示されることがあります。
    • キャッシュの管理コスト
      キャッシュの設定やメモリの管理にはコストと手間がかかります。
    • コストの増加
      キャッシュを使うとコストが増えることがあります。

    キャッシュ戦略を成功させるには、何をキャッシュし、何をキャッシュしないかを慎重に見極めることが重要です。正しい設計と管理で、キャッシュ戦略のメリットを最大限に引き出せます。

    Memorystoreを使ってキャッシュ戦略を実現しよう

    Memorystoreは、Google Cloudが提供するフルマネージドのインメモリデータストアサービスです。RedisおよびMemcachedをサポートしています。

    どちらもキャッシュに使えますが、どちらを使うべきか迷うかもしれません。一般的に、リストやハッシュなど多様なデータ構造をサポートし、永続化機能もあるRedisが柔軟に対応できます。一方、より高いパフォーマンスとシンプルなキャッシュ用途にはMemcachedが適しています。

    Memorystoreのコスト比較: 実際のコストから高額まで

    東京リージョンでMemorystoreを使用する場合の費用を見てみましょう。料金計算ツールを使って、最も安い設定、実際に使用する設定、最も高い設定の費用を算出しました。(注:1ドル157円で計算)

    GoogleCloudの料金計算ツールはこちら

    Redisの費用見積もり

    まず、最も安い設定の費用です。

    • ティア: 基本
    • 容量: 1GB
    • 確約利用: 3年

    1ヶ月の費用: 4,569円

    次に、実際にお試しで使用する場合の費用です。

    • ティア: 基本
    • 容量: 1GB
    • 確約利用: なし

    1ヶ月の費用: 7,449円

    最後に、最も高い設定の費用です。

    • ティア: スタンダード
    • リードレプリカ: 5
    • 容量: 300GB
    • 確約利用: なし

    1ヶ月の費用: 約400万円

    Memcachedの費用見積もり

    次に、Memcachedの場合です。

    • ノード: 1
    • メモリ: 1GB
    • コア数: 1 vCPU
    • 確約利用: 3年

    1ヶ月の費用: 4,785円

    さらに、実際にお試しで使用する場合の費用です。

    • ノード: 1
    • メモリ: 1GB
    • コア数: 1 vCPU
    • 確約利用: なし

    1ヶ月の費用: 7,977円

    最後に、最も高い設定の費用です。

    • ノード: 20
    • メモリ: 256GB
    • コア数: 32 vCPU
    • 確約利用: なし

    1ヶ月の費用: 約1100万円

    Redisに比べ、Memcachedはやや高めの価格設定ですが、1ヶ月お試しで利用する場合、為替レートによりますが、約8,000円程度です。ただし、高性能なリソースを無邪気に作成して放置してしまうと、高額な請求が発生し破産まっしぐらなので注意が必要です。

    Memorystoreの実力検証: パフォーマンスをチェック

    Memorystoreを実際に利用してみます。今回はRedisを利用します。

    Memorystoreの構築
    まずは、GCPのコンソールからMemorystoreを構築します。
    memorystore
    MemorystoreはVPC内に作成する必要があります。今回はデフォルトのVPC内にダイレクトピアリングを行う形で作成しました。

    GCEの構築
    MemorystoreのRedisアクセスするために、GCEにVMインスタンスを作成します。redis-cliが使えれば良いので、以下のような設定となります。

    • リージョン・ゾーン: Memorystoreと同じ場所
    • マシン: e2-medium
    • ブートディスク: Debian GNU/Linux 12 (bookworm)
    • ネットワークインターフェース: default

    VMインスタンスを作成したら、SSH接続して作業を進めます。

    パッケージ管理のリポジトリ情報を最新に更新します。

    1sudo apt-get update

    次に、redis-toolsをインストールします。

    1sudo apt-get install redis-tools

    MemorystoreのRedisに接続します。xx.xx.xxx.xxxはMemorystoreのプライマリエンドポイントのIPに置き換えてください。

    1redis-cli -h xx.xx.xxx.xxx

    キャッシュされているキーの一覧を確認します。

    1keys *

    特定のキーを削除します。

    1DEL hoge

    全てのキーを削除します。

    1FLUSHALL

    CloudRunの設定

    今回は、RailsのアプリケーションをデプロイしたCloudRunを事前に用意しています。CloudRunはサーバレスであり、VPCにアクセスするための設定が必要です。

    サーバレスVPCアクセス vs ダイレクトVPC: パフォーマンス対決

    CloudRunのVPCへの接続には2種類の方法があります。

    サーバレスVPCアクセスコネクタ
    CloudRunのサーバレスVPCアクセス設定

    ダイレクトVPC

    サーバレスVPCアクセスコネクタより、ダイレクトVPCの方がパフォーマンスが高いとのことです。実際に比較してみます。

    今回は検証用にRailsのアプリケーションのコントローラーでモデルの全レコードを取得する二つの処理にキャッシュを適用し、処理時間の差を確認します。

    1  def hoge
    2    @user_count = log_execution_time('処理A') { fetch_from_cache('user_count') { User.count } }
    3    @score_count = log_execution_time('処理B') { fetch_from_cache('score_count') { Score.count } }
    4  end
    5
    6  private
    7
    8  # キャッシュから値を取得し、存在しない場合はブロックを実行してキャッシュに保存
    9  #
    10  # @param [String] key キャッシュキー
    11  # @param [Integer] expires_in キャッシュの有効期限(秒)
    12  # @yieldreturn [Object] ブロックの実行結果
    13  # @return [Object] キャッシュから取得した値、またはブロックの実行結果
    14  def fetch_from_cache(key, expires_in: 30.minutes)
    15    cached_value = $redis.get(key)
    16    return cached_value.to_i if cached_value
    17
    18    value = yield
    19    $redis.set(key, value)
    20    $redis.expire(key, expires_in.to_i)
    21    value
    22  end
    23
    24  # 指定されたブロックの処理時間を計測し、ログに出力
    25  #
    26  # @param [String] label ログに出力するラベル
    27  # @yieldreturn [Object] ブロックの実行結果
    28  # @return [Object] ブロックの実行結果
    29  def log_execution_time(label)
    30    start_time = Time.now
    31    result = yield
    32    end_time = Time.now
    33    execution_time = end_time - start_time
    34
    35    Rails.logger.info("#{label} 処理時間 #{execution_time} seconds")
    36
    37    result
    38  end

    CloudRunにデプロイしたサービスにアクセスしてログを確認します。赤枠がキャッシュがない時の処理時間、青枠がキャッシュされた時の処理時間です。

    サーバレスVPCアクセスコネクタ
    Memorystore_redis処理A_サーバレスVPCアクセスコネクター
    Memorystore_redis処理B_サーバレスVPCアクセスコネクター

    ダイレクトVPC
    Memorystore_redis処理A
    Memorystore_redis処理B

    MemorystoreのRedisを使うと、キャッシュがない場合に比べ、処理時間が大幅に短縮されます。また、サーバレスVPCアクセスコネクタよりもダイレクトVPCの方がパフォーマンスが優れていることを確認できました。。今回の検証では、最大で約60倍の処理速度の改善が見られましたが、さらに重い処理や頻繁にアクセスされるデータをキャッシュすることで、より大きな効果が期待できます。

    キャッシュ戦略をうまく活用して、より良いサービスを構築しましょう。暑い日が続きますが、熱中症に気をつけて、良い日々をお過ごしください。

    ライトコードでは、エンジニアを積極採用中!

    ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。

    採用情報へ

    おすすめ記事

    エンジニア大募集中!

    ライトコードでは、エンジニアを積極採用中です。

    特に、WEBエンジニアとモバイルエンジニアは是非ご応募お待ちしております!

    また、フリーランスエンジニア様も大募集中です。

    background