LoginSignup
5
1

Livebook で Momento Cache

Last updated at Posted at 2024-03-11

はじめに

Momento Cache はサーバーレスキャッシュサービスです

Lambda + DynamoDB というサーバーレスの黄金パターンに組み込んだ例があります

Momento にキャッシュがなければ DynamoDB を参照する、 Cache-Aside (キャッシュアサイド) パターンを実装した場合、レイテンシの 60 % を削減できる、としています

日本で Momento Cache を活用した事例としては、北海道テレビの事例などがあります

先日参加した JAWS DAYS 2024 にて Momento の Elixir SDK があることを知ったので、 Livebook から使ってみます

この記事ではキャッシュの作成、キーバリューの登録、取得を実装します

実装したノートブックはこちら

事前準備

サインアップ

先に Momento のアカウントを用意しておきます

素晴らしいことに、試すだけであればクレジットカードの登録は不要です

以下のリンクから Momento にサインアップしましょう

右上の「ログイン」をクリックします

スクリーンショット 2024-03-10 8.37.28.png

メールアドレス、もしくは Google アカウントか GitHub アカウントでサインアップできます

スクリーンショット 2024-03-10 8.37.42.png

API KEY の作成

サインアップできると、以下のような画面が表示されます

「Generate API Keys」をクリックしてください

スクリーンショット 2024-03-10 8.38.30.png

API キーの作成画面が表示されます

試すだけならどこでも問題ありませんが、クラウドプロバイダーに AWS 、リージョンに ap-northeast-1 (東京)を選択します

「Type of key」は左側の「Super User Key」を選択します

下にある「トークンを生成する」ボタンをクリックしてください

スクリーンショット 2024-03-10 8.43.05.png

API Key が生成されます

後でこの値を使用します

スクリーンショット 2024-03-10 8.43.23.png

セットアップ

Livebook で新しいノートブックを開き、 Momento の SDK モジュールと Kino をインストールします

Mix.install([
  {:gomomento, "~> 0.6"},
  {:kino, "~> 0.12"}
])

Hex の momento モジュールは JavaScript の日付時刻操作ライブラリである Moment.js を Elixir から使うためのものです

https://hex.pm/packages/momento

https://momentjs.com/

Momento を使うためのモジュールは gomomento なので気をつけましょう

Momento.CacheClient は頻出するのでエイリアスを付けて CacheClient だけで使えるようにしておきます

alias Momento.CacheClient

クライアントの準備

Momento Cache を操作するためのクライアントを準備しましょう

先ほど取得した API キーを入力するための UI を作成します

api_key_input = Kino.Input.password("API_KEY")

セルを実行するとパスワード型のテキスト入力が表示されるので、 API キーの値を入力します

スクリーンショット 2024-03-11 0.19.21.png

クライアントの設定を用意します

config = Momento.Configurations.Laptop.latest()

実行結果

%Momento.Config.Configuration{
  transport_strategy: %Momento.Config.Transport.TransportStrategy{
    grpc_config: %Momento.Config.Transport.GrpcConfiguration{deadline_millis: 5000}
  }
}

API キーの値を読み込んで認証情報プロバイダーを作成します

credential_provider =
  api_key_input
  |> Kino.Input.read()
  |> Momento.Auth.CredentialProvider.from_string!()

設定情報、認証情報プロバイダー、TTL(キーバリューを残しておく秒数)を指定してクライアントを作成します

default_ttl_seconds = 60.0
client = CacheClient.create!(config, credential_provider, default_ttl_seconds)

キャッシュの作成

キャッシュ名を設定します

cache_name = "cache"

クライアントとキャッシュ名を指定してキャッシュを作成します

CacheClient.create_cache(client, cache_name)

実行結果

{:ok, %Momento.Responses.CreateCache.Ok{}}

キャッシュの一覧を取得してみます

CacheClient.list_caches(client)

実行結果

{:ok, %Momento.Responses.ListCaches.Ok{caches: [%Momento.Responses.CacheInfo{name: "cache"}]}}

Momento のコンソールの方からも確認してみます

確かに指定した名前でキャッシュが作成されています

スクリーンショット 2024-03-10 8.55.45.png

ちなみに、すでに存在している名前でキャッシュを作成しようとすると、以下のような結果になります

:already_exists

キーバリューの登録、取得

キャッシュ、キー、バリューを指定して登録します

CacheClient.set(client, cache_name, "foo", "bar")

実行結果

{:ok, %Momento.Responses.Set.Ok{}}

キャッシュ、キーを指定して取得します

CacheClient.get(client, cache_name, "foo")

実行結果

{:ok, %Momento.Responses.Get.Hit{value: "bar"}}

Momento のコンソールでも確認できます

スクリーンショット 2024-03-10 8.56.28.png

TTLが60秒なので、 60 秒以上経過してからもう一度値を取得すると、実行結果は以下のようになります

:miss

こうなった場合、キャッシュではなく元のデータベースを参照しに行くことになります

まとめ

Elixir 用の SDK を使うことで、 Livebook から簡単に Momento Cache を試すことができました

キャッシュが必要なパターンが出てきたときに是非活用したいですね

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1